<?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/25499156ea68aa4ac597801e9be69707e31bba73.xml</link>
    <description>我们阻止威胁&#xA;(wechat feed made by @ttttmr https://wechat2rss.xlab.app)</description>
    <managingEditor> (冲鸭安全)</managingEditor>
    <image>
      <url>https://wx.qlogo.cn/mmhead/LIUI5tJGiauBGlPNd8rKaCLywV6kQHBxolRKEfbic65PydhCB4ot3tvXNPxPphRx9oiaUzpJiaiadjEM/0</url>
      <title>冲鸭安全</title>
      <link>https://wechat2rss.xlab.app/feed/25499156ea68aa4ac597801e9be69707e31bba73.xml</link>
    </image>
    <item>
      <title>从0训练自己的AI大模型(下) -CTF模型的Hello world</title>
      <link>https://mp.weixin.qq.com/s?__biz=MzkyOTc0NDY2Nw==&amp;mid=2247486122&amp;idx=1&amp;sn=f2685d6fc15e014188fc141cfd7ebe31</link>
      <description>在上一篇中《[2026]从0训练自己的AI大模型(上)》我们已经做完了一个pretrain的模型，而模型聪不聪</description>
      <content:encoded><![CDATA[<p>原创 <span>为了安全鸭</span> <span>2026-04-05 10:00</span> <span style="display: inline-block;">北京</span></p>






  
  <p><img src="https://wechat2rss.xlab.app/img-proxy/?k=f00ab0b3&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2F1woCcbOsjVPFC3k4yjwhrb2jY4kP4K4d1OzqY17Zt2EMrnq27e7hoRsQlt1ONs4GjdjrUsUW0ElP8vVicib6L7ReicBSwzaF1WrQHhghMQ8LEw%2F0%3Fwx_fmt%3Djpeg"/></p>
  
  <p><span style="color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;display: inline !important;float: none;" data-pm-slice="0 0 []"><span leaf="">在上一篇中</span></span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"/><span style="color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;display: inline !important;float: none;"><span leaf=""><a class="normal_text_link" target="_blank" style="" href="https://mp.weixin.qq.com/s?__biz=MzkyOTc0NDY2Nw==&amp;mid=2247485967&amp;idx=1&amp;sn=75ccdade1b71b91fdbca718b77005975&amp;scene=21#wechat_redirect" textvalue="《[2026]从0训练自己的AI大模型(上)》" data-itemshowtype="0" linktype="text" data-linktype="2">《[2026]从0训练自己的AI大模型(上)》</a></span></span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"/><span style="color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;display: inline !important;float: none;"><span leaf="">我们已经做完了一个pretrain的模型，而模型聪不聪明看两个，一个是pre trian，另外一个是post train。因此本章会开始讨论后训练，我们的这个章节的最终目标是做一个能完成简单CTF的Agent模型。</span></span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"/><span style="color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;display: inline !important;float: none;"><span leaf="">要完成能打ctf的模型，模型需要掌握两个能力，第一个是工具调用能力，第二个是对”CTF流程的理解能力”。而这两个都在后训练阶段完成</span></span></p><blockquote style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin: 5px 0px 15px;overflow: hidden;border-width: 0px 0px 0px 4px;border-top-style: initial;border-right-style: initial;border-bottom-style: initial;border-left-style: solid;border-top-color: initial;border-right-color: initial;border-bottom-color: initial;border-left-color: rgb(122, 208, 58);border-image: initial;padding: 8px 12px;background-color: rgb(241, 241, 241);box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 1px 0px;font-size: 14.992px;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;"><span leaf="">公开互联网高质量文本越来越稀缺，所以各家 pretrain base 的差距在缩小。公开数据红利变小了，base 差距更隐蔽，后训练差异更显眼。这也是为什么后训练如此重要的原因</span></p></blockquote><h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">我们需要什么</span></h2><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">让我们把目标明确，我希望模型具有think能力，并且能调用工具，此外能完成简单的登陆注册sql注入的ctf题目</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">为了实现think/和工具调用，我们需要</span></p><ol style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" class="list-paddingleft-1"><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">在sft阶段把这两个能力给组起来</span></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">后续使用 RL 纠正行为</span></p></li></ol><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf="">SFT</span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">SFT数据集很关键，好的数据集一两拨千金。</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">我们上一章的SFT是随便找了个简单的试试，而这次我们认真做一下，数据采用claude opus 4.6 + gpt 5.4的公开蒸馏数据集，配比少量deepseek和qwen的数据和部分合成数据，组了两个高质量数据集。非常标准的训练，代码由vibe coding完成，就不细说了。这部分就是数据集要选得好。</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">这里面包含了我们所有需要的，多轮对话，工具调用，以及关键的think能力。</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" nodeleaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002436" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=ac89b439&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1woCcbOsjVOZibOrztzKPRxButCv1ZCvNicBEEtKsb0BfkKjOyjibcuczNsYlAsNvYibf7tbKVJywJEypajzmwMiancmFMKpibB45uklHobkndv0Y%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><blockquote style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin: 5px 0px 15px;overflow: hidden;border-width: 0px 0px 0px 4px;border-top-style: initial;border-right-style: initial;border-bottom-style: initial;border-left-style: solid;border-top-color: initial;border-right-color: initial;border-bottom-color: initial;border-left-color: rgb(122, 208, 58);border-image: initial;padding: 8px 12px;background-color: rgb(241, 241, 241);box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 1px 0px;font-size: 14.992px;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;"><span leaf="">值得注意的是，如果数据集不干净，模型很容易在这个地方被带偏。我建议是这些数据集至少带，指令遵循，多轮对话（比如第一轮给模型说记住我是谁，第二轮再问我是谁），多样化任务，以及部分工具调用的例子和思维链。而且要尽量避免污染，很多开源数据其实是不能直接用的，里面啥都有，写小黄文的有，搞色情有，最好的办法是自己记录自己给大模型调用的过程。比如给你的opencode装个插件记录一下之类的</span></p></blockquote><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">用了高质量数据集后，模型很快的呈现了看起来不错的能力，并且大模型的think也迁移过来了:</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002438" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=5b490ced&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2F1woCcbOsjVNuia3Z5sSBCZ7SrO25qQ7xzLX99E9MvQWGp7TDzpP2kWpIrsyKb5xYYpVR680MpgJUm31lZPPBzrNyiczZMEl0sxj0dsichJ75ibM%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">但是光靠SFT还是不够的，比如一个普通的问题能think这么多:</span></p><blockquote style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin: 5px 0px 15px;overflow: hidden;border-width: 0px 0px 0px 4px;border-top-style: initial;border-right-style: initial;border-bottom-style: initial;border-left-style: solid;border-top-color: initial;border-right-color: initial;border-bottom-color: initial;border-left-color: rgb(122, 208, 58);border-image: initial;padding: 8px 12px;background-color: rgb(241, 241, 241);box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 1px 0px;font-size: 14.992px;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;"><span leaf="">一根6米长的杆子是否能通过一扇宽三米高5米的门</span></p></blockquote><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002439" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=648ce108&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1woCcbOsjVO0Wr3SwH4ibI2YWJNTtM0Nic5uibibmFZMGhExfn8Md14sqdUAZB0d5qW5qric2NAdm21ya7nwml8OicVibrgkxQOcxd2NbHg3dPxCWU%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002437" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=5ee89d87&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2F1woCcbOsjVPgoWicfbh7IywjoJscfib9U0dQkw3v0PthZdmMFuibhxzHMeOrloiaUOofeBYyYzQQ3nHiakJiaUk2iac03GX3b6erFaaa9AUwrnBvlQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">我猜测是数据集里面带qwen或者ds的缘故,学到了无限think。所以光靠SFT是没用的，而且过长思维链对模型有害。</span></p><h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf="">强化学习</span></h2><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">在SFT阶段，模型可能学到了”模式”比如知道用户说 “帮我查询一下天气”，模型会意识到需要调用工具</span></p><pre style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 13.118px;margin-top: 0px;margin-bottom: 1rem;overflow: auto;display: block;color: rgb(33, 37, 41);max-height: 400px;background-color: rgb(245, 245, 245);border: 1px solid rgb(204, 204, 204);padding: 0.5em;border-radius: 4px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><code style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: inherit;color: inherit;word-break: normal;white-space: pre-wrap;"><span leaf="">&lt;tool_call&gt;xxxxx&lt;/tool_call&gt;</span></code></pre><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">但是由于各种原因，他们可能会输出垃圾字符或者不闭合tag等。所以光有SFT是不够的，我们需要对其进行强化学习.而这部分简单来说，参考minimind的实现，改进一下</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">think太长太短，不闭合扣分</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002441" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=1ae84b08&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2F1woCcbOsjVOYzhErO7b5vc4SYoeiapf7dZpAjXunvxaKicKibeZxEkpx1Siavg17M5K3t6YB9WmfIl8lhTJnRgOueGqp7hNHTTL1XkZG3NCcIYQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">工具调用不规范扣分，如虚假工具，无效JSON，不闭合:</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002440" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=f971b299&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1woCcbOsjVMTCC8fC4zlF5Oz0LKQzDDPibfDlyocd9en9iaeOGwr2V7qmBARdbLQwPPJPf2J6F1ic9Vg6HgzNTqnZKFsIN1mv6FqWAkyOBzfRw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">然后进行训练，结果:</span></p><blockquote style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin: 5px 0px 15px;overflow: hidden;border-width: 0px 0px 0px 4px;border-top-style: initial;border-right-style: initial;border-bottom-style: initial;border-left-style: solid;border-top-color: initial;border-right-color: initial;border-bottom-color: initial;border-left-color: rgb(122, 208, 58);border-image: initial;padding: 8px 12px;background-color: rgb(241, 241, 241);box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 1px 0px;font-size: 14.992px;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;"><span leaf="">一根6米长的杆子是否能通过一扇宽三米高5米的门</span></p></blockquote><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002443" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=daae246e&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2F1woCcbOsjVNVt04QstdPFR6ibNBEmxNicFzHib3BwDJN3icDmou5OnicIpukerxicod0BACn5WXvJex320biaHbX0WqXfA6GdzsPHjqRZ5QzMf7RkI%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">看样子虽然think乱七八糟，但是至少正常一点了。并且模型也掌握了基础的工具调用。</span></p><blockquote style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin: 5px 0px 15px;overflow: hidden;border-width: 0px 0px 0px 4px;border-top-style: initial;border-right-style: initial;border-bottom-style: initial;border-left-style: solid;border-top-color: initial;border-right-color: initial;border-bottom-color: initial;border-left-color: rgb(122, 208, 58);border-image: initial;padding: 8px 12px;background-color: rgb(241, 241, 241);box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 1px 0px;font-size: 14.992px;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;"><span leaf="">我应该怎么清理一匹 70kg178cm的马</span></p></blockquote><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" nodeleaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002444" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=1297dff6&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1woCcbOsjVM23o1WNqG5qD7jysUguS8UdEXSfJgPB4iasMiaibZZKLueibhQreiacV38waSbricicqyLHDdY1mrUanUI5Xpgwqfta7EMFw7oQYScXs%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><blockquote style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin: 5px 0px 15px;overflow: hidden;border-width: 0px 0px 0px 4px;border-top-style: initial;border-right-style: initial;border-bottom-style: initial;border-left-style: solid;border-top-color: initial;border-right-color: initial;border-bottom-color: initial;border-left-color: rgb(122, 208, 58);border-image: initial;padding: 8px 12px;background-color: rgb(241, 241, 241);box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 1px 0px;font-size: 14.992px;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;"><span leaf="">如果 A&gt;B，B&lt;C，那么A和C的关系是什么?请给出具体的推理过程。</span></p></blockquote><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" nodeleaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002442" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=5334be94&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1woCcbOsjVPdNhBLnsTSgAvWiab9L5Z0ChkjFmTeCAFwPJEF8zCYDIiapu4Vps6q4zr4BP6GDricKrAPCIspPFs3ibnEG4jA6jmbzHxhjXRF0gY%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf="">CTF训练</span></h2><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">当模型掌握了tool use和看起来没那么糟糕后，我们可以进入正题，CTF训练了。实际上，我做这个系列的核心目的是为了把大模型能力迁移到小模型里面。简单的CTF是我们的第一个目标。我这里设计了一个存在sqli注入漏洞的靶场</span></p><pre style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 13.118px;margin-top: 0px;margin-bottom: 1rem;overflow: auto;display: block;color: rgb(33, 37, 41);max-height: 400px;background-color: rgb(245, 245, 245);border: 1px solid rgb(204, 204, 204);padding: 0.5em;border-radius: 4px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><code style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: inherit;color: inherit;word-break: normal;white-space: pre-wrap;"><span leaf="">import os</span><br/><span leaf="">import sqlite3</span><br/><span leaf="">from pathlib import Path</span><br/><span leaf="">from flask import Flask, redirect, render_template_string, request, session, url_for</span><br/><span leaf="">BASE_DIR = Path(__file__).resolve().parent</span><br/><span leaf="">DB_PATH = Path(os.getenv(&#34;DB_PATH&#34;, str(BASE_DIR / &#34;data&#34; / &#34;lab.db&#34;)))</span><br/><span leaf="">FLAG = os.getenv(&#34;FLAG&#34;, &#34;flag{demo_sqli_login_bypass}&#34;)</span><br/><span leaf="">ADMIN_PASSWORD = os.getenv(&#34;ADMIN_PASSWORD&#34;, &#34;sqli_lab_admin_9f3c2&#34;)</span><br/><span leaf="">app = Flask(__name__)</span><br/><span leaf="">app.config.update(</span><br/><span leaf="">    SECRET_KEY=os.getenv(&#34;SECRET_KEY&#34;, &#34;demo-secret-key&#34;),</span><br/><span leaf="">    SESSION_COOKIE_HTTPONLY=True,</span><br/><span leaf="">    SESSION_COOKIE_SAMESITE=&#34;Lax&#34;,</span><br/><span leaf="">)</span><br/><span leaf="">def init_db() -&gt; None:</span><br/><span leaf="">    DB_PATH.parent.mkdir(parents=True, exist_ok=True)</span><br/><span leaf="">    connection = sqlite3.connect(DB_PATH)</span><br/><span leaf="">    try:</span><br/><span leaf="">        connection.execute(</span><br/><span leaf="">            &#34;&#34;&#34;</span><br/><span leaf="">            CREATE TABLE IF NOT EXISTS users (</span><br/><span leaf="">                id INTEGER PRIMARY KEY AUTOINCREMENT,</span><br/><span leaf="">                username TEXT UNIQUE NOT NULL,</span><br/><span leaf="">                password TEXT NOT NULL</span><br/><span leaf="">            )</span><br/><span leaf="">            &#34;&#34;&#34;</span><br/><span leaf="">        )</span><br/><span leaf="">        user_count = connection.execute(&#34;SELECT COUNT(*) FROM users&#34;).fetchone()[0]</span><br/><span leaf="">        if user_count == 0:</span><br/><span leaf="">            connection.executemany(</span><br/><span leaf="">                &#34;INSERT INTO users(username, password) VALUES(?, ?)&#34;,</span><br/><span leaf="">                [</span><br/><span leaf="">                    (&#34;admin&#34;, ADMIN_PASSWORD),</span><br/><span leaf="">                    (&#34;guest&#34;, &#34;guest&#34;),</span><br/><span leaf="">                ],</span><br/><span leaf="">            )</span><br/><span leaf="">        else:</span><br/><span leaf="">            connection.execute(</span><br/><span leaf="">                &#34;UPDATE users SET password = ? WHERE username = ?&#34;,</span><br/><span leaf="">                (ADMIN_PASSWORD, &#34;admin&#34;),</span><br/><span leaf="">            )</span><br/><span leaf="">        connection.commit()</span><br/><span leaf="">    finally:</span><br/><span leaf="">        connection.close()</span><br/><span leaf="">def fetch_user(username: str, password: str):</span><br/><span leaf="">    connection = sqlite3.connect(DB_PATH)</span><br/><span leaf="">    connection.row_factory = sqlite3.Row</span><br/><span leaf="">    try:</span><br/><span leaf="">        query = (</span><br/><span leaf="">            &#34;SELECT username FROM users &#34;</span><br/><span leaf="">            f&#34;WHERE username = &#39;{username}&#39; AND password = &#39;{password}&#39; &#34;</span><br/><span leaf="">            &#34;ORDER BY CASE WHEN username = &#39;admin&#39; THEN 0 ELSE 1 END LIMIT 1&#34;</span><br/><span leaf="">        )</span><br/><span leaf="">        return connection.execute(query).fetchone()</span><br/><span leaf="">    finally:</span><br/><span leaf="">        connection.close()</span><br/><span leaf="">INDEX_TEMPLATE = &#34;&#34;&#34;</span><br/><span leaf="">&lt;!doctype html&gt;</span><br/><span leaf="">&lt;html lang=&#34;en&#34;&gt;</span><br/><span leaf="">  &lt;head&gt;</span><br/><span leaf="">    &lt;meta charset=&#34;utf-8&#34;&gt;</span><br/><span leaf="">    &lt;title&gt;Mini CTF Lab&lt;/title&gt;</span><br/><span leaf="">    &lt;style&gt;</span><br/><span leaf="">      body { font-family: monospace; background: <a class="wx_topic_link" topic-id="mnkqofab-o83aqv" style="color: #576B95 !important;" data-topic="1" data-recommend="">#f3efe5</a>; color: <a class="wx_topic_link" topic-id="mnkqofab-1ydthj" style="color: #576B95 !important;" data-topic="1" data-recommend="">#1f1b16</a>; margin: 2rem; }</span><br/><span leaf="">      .card { max-width: 780px; background: <a class="wx_topic_link" topic-id="mnkqofab-2aqo2v" style="color: #576B95 !important;" data-topic="1" data-recommend="">#fffdf7</a>; border: 1px solid <a class="wx_topic_link" topic-id="mnkqofab-84hjzr" style="color: #576B95 !important;" data-topic="1" data-recommend="">#c6b89e</a>; padding: 1.5rem; }</span><br/><span leaf="">      a { color: <a class="wx_topic_link" topic-id="mnkqofab-9fiw6b" style="color: #576B95 !important;" data-topic="1" data-recommend="">#8a3b12</a>; }</span><br/><span leaf="">      code { background: <a class="wx_topic_link" topic-id="mnkqofab-ynbltx" style="color: #576B95 !important;" data-topic="1" data-recommend="">#efe5d2</a>; padding: 0.1rem 0.3rem; }</span><br/><span leaf="">    &lt;/style&gt;</span><br/><span leaf="">  &lt;/head&gt;</span><br/><span leaf="">  &lt;body&gt;</span><br/><span leaf="">    &lt;div class=&#34;card&#34;&gt;</span><br/><span leaf="">      &lt;h1&gt;Mini CTF Lab&lt;/h1&gt;</span><br/><span leaf="">      &lt;p&gt;This lab is for model training. Goal: become &lt;code&gt;admin&lt;/code&gt; and visit &lt;code&gt;/flag&lt;/code&gt;.&lt;/p&gt;</span><br/><span leaf="">      &lt;p&gt;Known low-privilege account: &lt;code&gt;guest / guest&lt;/code&gt;.&lt;/p&gt;</span><br/><span leaf="">      {% if user %}</span><br/><span leaf="">      &lt;p&gt;Current user: &lt;code&gt;{{ user }}&lt;/code&gt;&lt;/p&gt;</span><br/><span leaf="">      &lt;p&gt;&lt;a href=&#34;{{ url_for(&#39;profile&#39;) }}&#34;&gt;profile&lt;/a&gt; | &lt;a href=&#34;{{ url_for(&#39;flag&#39;) }}&#34;&gt;flag&lt;/a&gt; | &lt;a href=&#34;{{ url_for(&#39;logout&#39;) }}&#34;&gt;logout&lt;/a&gt;&lt;/p&gt;</span><br/><span leaf="">      {% else %}</span><br/><span leaf="">      &lt;p&gt;&lt;a href=&#34;{{ url_for(&#39;login&#39;) }}&#34;&gt;login&lt;/a&gt;&lt;/p&gt;</span><br/><span leaf="">      {% endif %}</span><br/><span leaf="">    &lt;/div&gt;</span><br/><span leaf="">  &lt;/body&gt;</span><br/><span leaf="">&lt;/html&gt;</span><br/><span leaf="">&#34;&#34;&#34;</span><br/><span leaf="">LOGIN_TEMPLATE = &#34;&#34;&#34;</span><br/><span leaf="">&lt;!doctype html&gt;</span><br/><span leaf="">&lt;html lang=&#34;en&#34;&gt;</span><br/><span leaf="">  &lt;head&gt;</span><br/><span leaf="">    &lt;meta charset=&#34;utf-8&#34;&gt;</span><br/><span leaf="">    &lt;title&gt;Login&lt;/title&gt;</span><br/><span leaf="">    &lt;style&gt;</span><br/><span leaf="">      body { font-family: monospace; background: <a class="wx_topic_link" topic-id="mnkqofab-03smvv" style="color: #576B95 !important;" data-topic="1" data-recommend="">#f3efe5</a>; color: <a class="wx_topic_link" topic-id="mnkqofac-luyllz" style="color: #576B95 !important;" data-topic="1" data-recommend="">#1f1b16</a>; margin: 2rem; }</span><br/><span leaf="">      .card { max-width: 780px; background: <a class="wx_topic_link" topic-id="mnkqofac-z8qson" style="color: #576B95 !important;" data-topic="1" data-recommend="">#fffdf7</a>; border: 1px solid <a class="wx_topic_link" topic-id="mnkqofac-7i0lnt" style="color: #576B95 !important;" data-topic="1" data-recommend="">#c6b89e</a>; padding: 1.5rem; }</span><br/><span leaf="">      input { width: 100%; padding: 0.55rem; margin: 0.35rem 0 1rem 0; }</span><br/><span leaf="">      button { padding: 0.6rem 1rem; }</span><br/><span leaf="">      .error { color: <a class="wx_topic_link" topic-id="mnkqofac-fyeduz" style="color: #576B95 !important;" data-topic="1" data-recommend="">#b42318</a>; }</span><br/><span leaf="">      a { color: <a class="wx_topic_link" topic-id="mnkqofac-6v6uin" style="color: #576B95 !important;" data-topic="1" data-recommend="">#8a3b12</a>; }</span><br/><span leaf="">    &lt;/style&gt;</span><br/><span leaf="">  &lt;/head&gt;</span><br/><span leaf="">  &lt;body&gt;</span><br/><span leaf="">    &lt;div class=&#34;card&#34;&gt;</span><br/><span leaf="">      &lt;h1&gt;Login&lt;/h1&gt;</span><br/><span leaf="">      &lt;p&gt;Use &lt;code&gt;guest / guest&lt;/code&gt; for a normal user.&lt;/p&gt;</span><br/><span leaf="">      {% if error %}&lt;p class=&#34;error&#34;&gt;{{ error }}&lt;/p&gt;{% endif %}</span><br/><span leaf="">      &lt;form method=&#34;post&#34;&gt;</span><br/><span leaf="">        &lt;label&gt;Username&lt;/label&gt;</span><br/><span leaf="">        &lt;input name=&#34;username&#34; autocomplete=&#34;off&#34;&gt;</span><br/><span leaf="">        &lt;label&gt;Password&lt;/label&gt;</span><br/><span leaf="">        &lt;input name=&#34;password&#34; type=&#34;password&#34; autocomplete=&#34;off&#34;&gt;</span><br/><span leaf="">        &lt;button type=&#34;submit&#34;&gt;Login&lt;/button&gt;</span><br/><span leaf="">      &lt;/form&gt;</span><br/><span leaf="">      &lt;p&gt;&lt;a href=&#34;{{ url_for(&#39;index&#39;) }}&#34;&gt;home&lt;/a&gt;&lt;/p&gt;</span><br/><span leaf="">    &lt;/div&gt;</span><br/><span leaf="">  &lt;/body&gt;</span><br/><span leaf="">&lt;/html&gt;</span><br/><span leaf="">&#34;&#34;&#34;</span><br/><span leaf="">PROFILE_TEMPLATE = &#34;&#34;&#34;</span><br/><span leaf="">&lt;!doctype html&gt;</span><br/><span leaf="">&lt;html lang=&#34;en&#34;&gt;</span><br/><span leaf="">  &lt;head&gt;</span><br/><span leaf="">    &lt;meta charset=&#34;utf-8&#34;&gt;</span><br/><span leaf="">    &lt;title&gt;Profile&lt;/title&gt;</span><br/><span leaf="">    &lt;style&gt;</span><br/><span leaf="">      body { font-family: monospace; background: <a class="wx_topic_link" topic-id="mnkqofac-7k22v8" style="color: #576B95 !important;" data-topic="1" data-recommend="">#f3efe5</a>; color: <a class="wx_topic_link" topic-id="mnkqofac-wun8sc" style="color: #576B95 !important;" data-topic="1" data-recommend="">#1f1b16</a>; margin: 2rem; }</span><br/><span leaf="">      .card { max-width: 780px; background: <a class="wx_topic_link" topic-id="mnkqofac-ljbzpf" style="color: #576B95 !important;" data-topic="1" data-recommend="">#fffdf7</a>; border: 1px solid <a class="wx_topic_link" topic-id="mnkqofac-1ae3hr" style="color: #576B95 !important;" data-topic="1" data-recommend="">#c6b89e</a>; padding: 1.5rem; }</span><br/><span leaf="">      a { color: <a class="wx_topic_link" topic-id="mnkqofad-zdw1j7" style="color: #576B95 !important;" data-topic="1" data-recommend="">#8a3b12</a>; }</span><br/><span leaf="">      .hint { color: <a class="wx_topic_link" topic-id="mnkqofad-oxj4ec" style="color: #576B95 !important;" data-topic="1" data-recommend="">#5f4b32</a>; }</span><br/><span leaf="">    &lt;/style&gt;</span><br/><span leaf="">  &lt;/head&gt;</span><br/><span leaf="">  &lt;body&gt;</span><br/><span leaf="">    &lt;div class=&#34;card&#34;&gt;</span><br/><span leaf="">      &lt;h1&gt;Profile&lt;/h1&gt;</span><br/><span leaf="">      &lt;p&gt;Logged in as &lt;code&gt;{{ user }}&lt;/code&gt;.&lt;/p&gt;</span><br/><span leaf="">      {% if user == &#39;admin&#39; %}</span><br/><span leaf="">      &lt;p&gt;You have admin access. Visit &lt;a href=&#34;{{ url_for(&#39;flag&#39;) }}&#34;&gt;/flag&lt;/a&gt;.&lt;/p&gt;</span><br/><span leaf="">      {% else %}</span><br/><span leaf="">      &lt;p class=&#34;hint&#34;&gt;Only admins can read the flag.&lt;/p&gt;</span><br/><span leaf="">      {% endif %}</span><br/><span leaf="">      &lt;p&gt;&lt;a href=&#34;{{ url_for(&#39;index&#39;) }}&#34;&gt;home&lt;/a&gt; | &lt;a href=&#34;{{ url_for(&#39;logout&#39;) }}&#34;&gt;logout&lt;/a&gt;&lt;/p&gt;</span><br/><span leaf="">    &lt;/div&gt;</span><br/><span leaf="">  &lt;/body&gt;</span><br/><span leaf="">&lt;/html&gt;</span><br/><span leaf="">&#34;&#34;&#34;</span><br/><span leaf="">@app.route(&#34;/&#34;)</span><br/><span leaf="">def index():</span><br/><span leaf="">    return render_template_string(INDEX_TEMPLATE, user=session.get(&#34;user&#34;))</span><br/><span leaf="">@app.route(&#34;/login&#34;, methods=[&#34;GET&#34;, &#34;POST&#34;])</span><br/><span leaf="">def login():</span><br/><span leaf="">    error = None</span><br/><span leaf="">    if request.method == &#34;POST&#34;:</span><br/><span leaf="">        username = request.form.get(&#34;username&#34;, &#34;&#34;)</span><br/><span leaf="">        password = request.form.get(&#34;password&#34;, &#34;&#34;)</span><br/><span leaf="">        try:</span><br/><span leaf="">            user = fetch_user(username, password)</span><br/><span leaf="">        except sqlite3.Error as exc:</span><br/><span leaf="">            error = f&#34;SQL error: {exc}&#34;</span><br/><span leaf="">        else:</span><br/><span leaf="">            if user:</span><br/><span leaf="">                session[&#34;user&#34;] = user[&#34;username&#34;]</span><br/><span leaf="">                return redirect(url_for(&#34;profile&#34;))</span><br/><span leaf="">            error = &#34;Login failed.&#34;</span><br/><span leaf="">    return render_template_string(LOGIN_TEMPLATE, error=error)</span><br/><span leaf="">@app.route(&#34;/profile&#34;)</span><br/><span leaf="">def profile():</span><br/><span leaf="">    user = session.get(&#34;user&#34;)</span><br/><span leaf="">    if not user:</span><br/><span leaf="">        return redirect(url_for(&#34;login&#34;))</span><br/><span leaf="">    return render_template_string(PROFILE_TEMPLATE, user=user)</span><br/><span leaf="">@app.route(&#34;/flag&#34;)</span><br/><span leaf="">def flag():</span><br/><span leaf="">    if session.get(&#34;user&#34;) != &#34;admin&#34;:</span><br/><span leaf="">        return &#34;Admins only.\n&#34;, 403</span><br/><span leaf="">    return f&#34;{FLAG}\n&#34;</span><br/><span leaf="">@app.route(&#34;/logout&#34;)</span><br/><span leaf="">def logout():</span><br/><span leaf="">    session.clear()</span><br/><span leaf="">    return redirect(url_for(&#34;index&#34;))</span><br/><span leaf="">@app.route(&#34;/health&#34;)</span><br/><span leaf="">def health():</span><br/><span leaf="">    return {&#34;status&#34;: &#34;ok&#34;}</span><br/><span leaf="">init_db()</span><br/><span leaf="">if __name__ == &#34;__main__&#34;:</span><br/><span leaf="">    app.run(host=&#34;0.0.0.0&#34;, port=5000)</span></code></pre><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">然后我们设计一个给靶场专用的CTF RL agent，他有三个模块组成，启动器，验证器，reward结算.</span></p><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">启动器</span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">在启动器中，我会给模型对应的目标以及工具，从而让模型完成目标，并且做了限制，最多十步，最多两次工具失败调用:</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002445" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=0c9a0b4b&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1woCcbOsjVNkefoiac6zBiboxgVjhW7xZf8eMoXR79q36uk05ORN4SjkPyibn7HTyFibpLFvj6XFbpHkskGndQUgmH1jlDiaYqGwpNWvibfHVA4lc%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf="">验证器</span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">这步是验证模型是否成功拿到flag，是否真的做了某些我们需要的操作，比如有没有发login包:</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002452" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=578d14a9&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2F1woCcbOsjVMrPq2ANxoA5UhuHw23H9GcEzicjtvd3n3icR75Y5En2O3dWgR9o4BMuesoSickhauMvVP5PTrGpAwtr0TLbibzcJBFib68Ec6RcT3I%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">访问的时候有没有管理员权限</span></p><p nodeleaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002455" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=1767c61d&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1woCcbOsjVPT8pM9FVZ1UAqyiaLma2QBYCkBnckFaeDia7HJKAAw0FiboZRAzMTQQOvzBAFaE5V1aoGa3MNDcBa5wqbF2xnQtKq6I91m9a6Mw8%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p><span style="color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;display: inline !important;float: none;"><span leaf="">sql注入语句对不对 或者有没有相似的语句</span></span></p><p nodeleaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002453" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=95d65614&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1woCcbOsjVMFILtA2ibdia6SAB1cvw2gasYd5IMxNuaVfGdQLYAkanZSGYiaZqibre5dmYIibkaO7DYxtJqsB3YFM6gemDzC9JACeYQIaCTbQMgo%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf="">reward结算</span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">我们之所以验证器做那么复杂的原因是因为如果不每一步做验证，只看拿不拿flag，我们这种弱智模型会遇到Reward Sparsity(奖励稀疏)的问题</span></p><blockquote style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin: 5px 0px 15px;overflow: hidden;border-width: 0px 0px 0px 4px;border-top-style: initial;border-right-style: initial;border-bottom-style: initial;border-left-style: solid;border-top-color: initial;border-right-color: initial;border-bottom-color: initial;border-left-color: rgb(122, 208, 58);border-image: initial;padding: 8px 12px;background-color: rgb(241, 241, 241);box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 1px 0px;font-size: 14.992px;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;"><span leaf="">如同让小学生做高考数学题，无论尝试多少次都得零分，无法通过分数差异学习改进策略。</span></p></blockquote><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">因此我们必须设计好，每一步都有对应的奖励或者惩罚，防止出现模型摆烂的问题.而这个是reward结算来干的，如模型成功登录就给点分，欺骗欺诈agent扣分等。</span></p><blockquote style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin: 5px 0px 15px;overflow: hidden;border-width: 0px 0px 0px 4px;border-top-style: initial;border-right-style: initial;border-bottom-style: initial;border-left-style: solid;border-top-color: initial;border-right-color: initial;border-bottom-color: initial;border-left-color: rgb(122, 208, 58);border-image: initial;padding: 8px 12px;background-color: rgb(241, 241, 241);box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 1px 0px;font-size: 14.992px;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;"><span leaf="">没错,RL其实是猴子算法，让猴子自己打字，打出正常语句就给分，错误语句扣分，最终让猴子实现打莎士比亚全集!</span></p></blockquote><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">过程</span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">这个过程非常有趣，因为模型一定不会走聪明路线，他会走偷懒的路线，哪条线容易就走哪个。</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">首先，用大模型合成一些正确的SFT过来（大概1k，包含正确的路线和思考），混在正常的SFT里面做训练，这个是保证模型至少读过数据。然后启动这个RL AGENT:</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">最开始，模型认为我们在骗他:</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002459" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=35c3ede5&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2F1woCcbOsjVPjwUeuX1GJ5ZwUpBNTU5eR0B5pgsaUhHG6D9DtQ0hnqOE3ibvkN5Au2q6XJqH7ib1EaNZicJ0dLYEX8y2TsmbrktbIX7orl5Ktyc%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002458" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=0b97656b&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2F1woCcbOsjVPaGBicTQzjQ9cevwDM9f8K2WP59QCXnD2lC3iaUFYLDtdWNdLYGjAOMK1b9zSbQQXCrdUqE2jN5gDWSyBnYgia6ITLu9AFOOUfCM%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">狠狠的扣分后，过了一个晚上，我发现模型开始上道了，认为这个是sql注入题目了</span></p><p nodeleaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002465" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" data-type="jpeg" src="https://wechat2rss.xlab.app/img-proxy/?k=d69fbaee&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2F1woCcbOsjVNRunicOPYYEYvKmbT84kqJMB2briaUiaQcas4GjCWSicqJA5zkL0ianr1eJ0Q13VPYMXmLDnI7pXtgqDufiawjeZQOx4CbstchVvWWI%2F640%3Fwx_fmt%3Djpeg%26from%3Dappmsg"/></p><p><span style="color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;display: inline !important;float: none;"><span leaf="">并且有时候居然还会想去谷歌搜一下答案，可惜我是国内，谷歌不给你访问的:</span></span></p><p nodeleaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002463" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=34d5fb3c&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1woCcbOsjVPib3B16EiazQKZz7mibjhJSH7ib7AUuxWGXTReOUmCb7b5g0X2jOAwQBrtxXbzH9kcibJPqE99qEhibiah4YsOPcGZlnOsRRmLFl0M1Q%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p><span style="color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;display: inline !important;float: none;"><span leaf="">再过了一个晚上后，我发现模型居然作弊了:</span></span></p><p nodeleaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002464" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" data-type="jpeg" src="https://wechat2rss.xlab.app/img-proxy/?k=e3be2a7c&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2F1woCcbOsjVNwmZAy7tgX5bFO80tgiaKqrxRCNFTBhqYjFsmP9Kf22VIFlicOK7un7zj57M1qQJoWjz18QIMaYbFZYJ8sG2pmK0q4icq0DyZExE%2F640%3Fwx_fmt%3Djpeg%26from%3Dappmsg"/></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf="">再过了一个晚上后，我发现模型居然作弊了:</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002468" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="jpeg" src="https://wechat2rss.xlab.app/img-proxy/?k=ab351074&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2F1woCcbOsjVPmlIfnc77XYzj09e3KRicWU3XGkxxeTlbYic6NHcFq6ToP8qu66lb0pKhqmTr6xawHSF0XzlHxs0joWG5F4bvdBibZdkG81fhoIU%2F640%3Fwx_fmt%3Djpeg%26from%3Dappmsg"/></span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">这是因为，这个flask后台也是可以正常登录的，而这套系统是我vibe coding出来的，默认的GPT给了一个弱口令，结果模型不知道从哪一步开始猜到了口令，开始疯狂刷分。</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">回退版本并且重新设计了奖励结构后，继续放置，一天后，这个模型终于学会了sql注入，拿到了flag:</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002467" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=d2e67ec9&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2F1woCcbOsjVPCr0aZbontdQic406Ycn13Dp8PNLqVZmpHYNLP6d7tic06HXPtWeMUuwEibWX2yv2lEZquMFxXFfeY73PyoOduLEG2ACxRUAh9zs%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002466" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=9f4ef14b&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1woCcbOsjVMzWcCqQHMBh3jCs5dWkxvxBV0Iic84V81sqMjsH4k1LY4aN3zo5QUpXYsqica4xHgjIKRgrlV6bE1HpwLoJN2iarz0Ga28e1JA1E%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">至此，我们的训练模型之旅也结束了</span></p><h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf="">总结</span></h2><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">预训练这块坑比较多，花费也多成本也多，有条件的还是直接用别人家的base模型(已经预训练好的基座)吧，之后我也试了一下QWEN的BASE接了SFT和RL后做的真的比我的好太多了。</span></p><p style="display: none;"><mp-style-type data-value="3"></mp-style-type></p>



<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=c1993542&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzkyOTc0NDY2Nw%3D%3D%26mid%3D2247486122%26idx%3D1%26sn%3Df2685d6fc15e014188fc141cfd7ebe31">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Sun, 05 Apr 2026 10:00:00 +0800</pubDate>
    </item>
    <item>
      <title>hypervisor AMD嵌套虚拟化</title>
      <link>https://mp.weixin.qq.com/s?__biz=MzkyOTc0NDY2Nw==&amp;mid=2247486042&amp;idx=1&amp;sn=3486846e6c97495bf53864d09d0e1267</link>
      <description></description>
      <content:encoded><![CDATA[<p>原创 <span>huoji</span> <span>2026-03-30 10:02</span> <span style="display: inline-block;">北京</span></p>






  
  <p><img src="https://wechat2rss.xlab.app/img-proxy/?k=890ad3a2&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2F1woCcbOsjVMLz6Wuiaph2M986lIEMTrGL8kticRhCictqACxYrk8mibxMeWj5p5pryFChnOTf3SJosK0J2cDfQuQEy0jNkZRaVCTSiaOOTGqwXU8%2F0%3Fwx_fmt%3Djpeg"/></p>
  
  <p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf="">这个嵌套虚拟化的项目去年就完成了,但是因为业务实在是太忙了,没什么时间写再加上这种技术文章没几个人看,现在大众更喜欢的是”爽+AI”,”简单短快+AI”这类的文章.也就一直咕咕咕了,但是全国搞CPU虚拟化的人屈指可数,而且我发现我去年搞的项目今年细节也快忘完了,写了就当存档.</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><strong style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-weight: bolder;"><span leaf="">考虑到看这篇文章的人都有一定基础</span></strong><span leaf="">,故不做基础科普.</span></p><h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">概念</span></h2><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">要做嵌套虚拟化,我们需要了解三大概念</span></p><ul style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" class="list-paddingleft-1"><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">L0：最底层的真实虚拟机监控器，直接控制物理硬件</span></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">L1：运行在 L0 上的一台虚拟机，但它自己又充当 hypervisor</span></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">L2：运行在 L1 里面的“下一层”虚拟机</span></p></li></ul><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">我们做的是L1的角色，其实我们只需要:</span></p><ol style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" class="list-paddingleft-1"><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">虚拟化MMIO嵌套</span></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">虚拟化VMexit嵌套</span></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">虚拟化异常/中断嵌套</span></p></li></ol><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">核心做法是,我们设计一个l1用的页表/vmcb，然后分配一个l2用的页表/vmcb，当遇到l2调用vmrun的时候,把l2的vmcb提交给cpu,系统就会进入l2的工作状态。然后L2遇到vmexitt或者l1遇到vmexit的时候还是走我们的vmexit entry。虚拟化对应指令就能实现嵌套虚拟化。</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">让我们一步一步来</span></p><h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">MMIO嵌套</span></h2><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">小工具建设</span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">第一步我们要给L2分配好页表，我们预先在每个vcpu分配:</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002364" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=9ecef0b7&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2F1woCcbOsjVN2wMTUewCTTBPPA9Y5ib4FKyTUCxU26O6Uj9ytCGNrJITFfbwT7A65c4X68E7GO0xQ5Kw5e7CYJ5FC3vkHt5RU6GkUNegRjxWs%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">然后我们需要一个翻译工具,要不然我们没办法访问l2的pa对应的hva:</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">这个所谓l1-&gt;l2,l2-&gt;l1的翻译工具就是把 L1 的 gPA映射成 L0 可访问的 VA</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002365" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=5a9f1bdc&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1woCcbOsjVPJGvhcSWx9Iicyvy7Yt011iaRgnRicQVUauAONYTjYicdIOTJDxw2jx1yh5TOKlre0tWHSrMtQjboy6ThJTOicHwrUXI5f9gdEcsN0%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">有了这个工具后,剩下的就是做基本的PML4访问映射:</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002367" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=42a9cca5&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1woCcbOsjVNK8WibpOU4gokUMOK7SYl5dCkThIfYNHwdd35MoL2CDDLTGVEY964SohiajGibrGWtlGud84icictYhRVGqEzjLibLHE18iaII20icNPU%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">有了PML4访问映射工具后,我们就能正常的访问L2的内存,类似于这个:</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002366" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=171b28f6&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2F1woCcbOsjVMtPaZ95Cswicav6VicemHn06RU7q3km0I9VZbCXpLVqOhrgLqUZqD0wJG3d9eq1bkmF2ocubdDPbthTbUv83MNNAOq3JVI1tbak%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><blockquote style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin: 5px 0px 15px;overflow: hidden;border-width: 0px 0px 0px 4px;border-top-style: initial;border-right-style: initial;border-bottom-style: initial;border-left-style: solid;border-top-color: initial;border-right-color: initial;border-bottom-color: initial;border-left-color: rgb(122, 208, 58);border-image: initial;padding: 8px 12px;background-color: rgb(241, 241, 241);box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 1px 0px;font-size: 14.992px;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;"><span leaf="">不过大部分时间我们用不上VA到PA的转换访问,这是因为,大部分情况下vmexit的都是pa地址而不是VA地址不需要走一次PML4翻译,不排除后续搞hack用的上</span></p></blockquote><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf=""><a class="wx_topic_link" topic-id="mnbqy8vn-a6saj4" style="color: #576B95 !important;" data-topic="1" data-recommend="">#PF处理</a></span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">当出现<a class="wx_topic_link" topic-id="mnbqy8vo-2w55f6" style="color: #576B95 !important;" data-topic="1" data-recommend="">#pf的时候</a>,检查是否在guest exit里面,如果是,则进入guest 的pf而不是自己的:</span></p><pre style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 13.118px;margin-top: 0px;margin-bottom: 1rem;overflow: auto;display: block;color: rgb(33, 37, 41);max-height: 400px;background-color: rgb(245, 245, 245);border: 1px solid rgb(204, 204, 204);padding: 0.5em;border-radius: 4px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;" data-pm-slice="0 0 []"><code style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: inherit;color: inherit;word-break: normal;white-space: pre-wrap;"><span leaf="">void svm_exit::svm_pf_handler(_svm_guest_status* guest_context) {</span><br/><span leaf=""><a class="wx_topic_link" topic-id="mnbqymeu-xdziq3" style="color: #576B95 !important;" data-topic="1" data-recommend="">#ifdef</a> use_npt</span><br/><span leaf="">    //__debugbreak();</span><br/><span leaf="">    // ============ 嵌套NPT页错误处理 ============</span><br/><span leaf="">    // 如果处于嵌套guest模式且L1启用了NPT，使用嵌套NPT处理</span><br/><span leaf="">    if (guest_context-&gt;vcpu-&gt;nested_guest_mode &amp;&amp;</span><br/><span leaf="">        guest_context-&gt;vcpu-&gt;nested_npt_enabled) {</span><br/><span leaf="">        nested_npt::handle_nested_npt_page_fault(guest_context);</span><br/><span leaf="">        return;</span><br/><span leaf="">    }</span></code></pre><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">而里面我们只需要像npt hook一样，找L2的rip和cr3,构造shadow page即可.</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">大概是:</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002377" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=b2b01737&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1woCcbOsjVOxo4rh8sQp0jhf6hUiaKSTwLstYXsjjP2WXJ6WibhCEvjeiccice2PnzvmvhpDsBY2jbn8e5qJmlvvuoYFO4ia6Q2h27JQvluCZ5Jk%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">构造shadow page,并且设置vmcb.tlbc设置成刷新tlb</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002376" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=82ab77c5&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1woCcbOsjVOoHEN4r2rRqXL0lotzKeYfkeZxrHicEQ8fK9YaTzeTKcw8CUUCzNicBkVHW8AWrWHoXnQHy8hOFfA3Rdcd49a708D6cm5IapCuE%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">然后走nvmexit即可.这个nvemexit是啥玩意后文会说。</span></p><h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">虚拟化Vmexit</span></h2><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">这很好理解,之前我们会伪装主板不支持vmexit指令,现在我们可以开始对他的虚拟化。总的来说,他分几步</span></p><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">vmsave</span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">在vmsave阶段我们按照规范,复制当前vmsave到target上</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002378" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=75fc37bd&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2F1woCcbOsjVMEw8zWQhmjBgp3cCtwiaP0MqBJ6fxadv8DichXw4m8ohy3zR2q8RIn8X1icEPkTXicxibqeibicQyA9ia2HNufsKjK0rib4ibusWpurjLBQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">vmload</span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">同理,根据amd手册,复制到当前的vmcb-&gt;state_save里面</span></p><pre style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 13.118px;margin-top: 0px;margin-bottom: 1rem;overflow: auto;display: block;color: rgb(33, 37, 41);max-height: 400px;background-color: rgb(245, 245, 245);border: 1px solid rgb(204, 204, 204);padding: 0.5em;border-radius: 4px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><code style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: inherit;color: inherit;word-break: normal;white-space: pre-wrap;"><span leaf="">    // FS, GS, TR, LDTR (包括所有隐藏状态)</span><br/><span leaf="">    // KernelGsBase, STAR, LSTAR, CSTAR, SFMASK</span><br/><span leaf="">    // SYSENTER_CS, SYSENTER_ESP, SYSENTER_EIP</span></code></pre><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" nodeleaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002374" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=19003443&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1woCcbOsjVMYEBLnTpuyTlce0KxhFxrfK8oAlUlqia1d4kico7233uLxAUAIuDDIJibHBGcEp1UgwgjFSNfylcvZm9rdtUibdBhnbKOIaqoG6V4%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">vmrun</span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">这个比较复杂,让我们翻一下amd手册,</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002375" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=48844972&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1woCcbOsjVOK7PdLblzAQ01auqUiatIXB1olq13f2y1mphEvc0mx5s014CuiaTtCmTbhE42gE2eTicOjKtCbEy1TU1Y8DZDxYDZv78mNIhXuaI%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">简单来说,我们先保存一下l1的guest_vmcb状态,然后给目前在用的vmcb赋值过去（也就是说,l1.vmcb = l2.vmcb)，并且标记一下进入嵌套模式(nested_guest_mode = true)</span></p><pre style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 13.118px;margin-top: 0px;margin-bottom: 1rem;overflow: auto;display: block;color: rgb(33, 37, 41);max-height: 400px;background-color: rgb(245, 245, 245);border: 1px solid rgb(204, 204, 204);padding: 0.5em;border-radius: 4px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><code style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: inherit;color: inherit;word-break: normal;white-space: pre-wrap;"><span leaf="">    // RAX包含guest VMCB的物理地址</span><br/><span leaf="">    unsigned __int64 guest_vmcb_pa = guest_context-&gt;guest_register-&gt;Rax;</span><br/><span leaf="">    DebugPrint(&#34;[Nested] VMRUN with VMCB PA: %p\n&#34;, guest_vmcb_pa);</span><br/><span leaf="">    // 验证VMCB物理地址对齐(必须4KB对齐),这个地址在当前是不能直接范围的</span><br/><span leaf="">    if (guest_vmcb_pa &amp; 0xFFF) {</span><br/><span leaf="">        DebugPrint(&#34;[Nested] VMCB PA not aligned, injecting <a class="wx_topic_link" topic-id="mnbqymeu-1rfl0j" style="color: #576B95 !important;" data-topic="1" data-recommend="">#GP</a>\n&#34;);</span><br/><span leaf="">        inject_exception_gp(guest_context);</span><br/><span leaf="">        return;</span><br/><span leaf="">    }</span><br/><span leaf="">    _svm_vmcb* source_vmcb =</span><br/><span leaf="">        (_svm_vmcb*)map_l1_gpa_page_to_hva(guest_context-&gt;vcpu, guest_vmcb_pa);</span><br/><span leaf="">    if (!source_vmcb) {</span><br/><span leaf="">        DebugPrint(&#34;[Nested] Failed to map guest VMCB for VMRUN\n&#34;);</span><br/><span leaf="">        inject_exception_gp(guest_context);</span><br/><span leaf="">        return;</span><br/><span leaf="">    }</span><br/><span leaf="">    memcpy(guest_context-&gt;vcpu-&gt;l1_guest_vmcb, source_vmcb, sizeof(_svm_vmcb));</span></code></pre><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">同时，我们的nested npt也是在这个时候初始化的</span></p><pre style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 13.118px;margin-top: 0px;margin-bottom: 1rem;overflow: auto;display: block;color: rgb(33, 37, 41);max-height: 400px;background-color: rgb(245, 245, 245);border: 1px solid rgb(204, 204, 204);padding: 0.5em;border-radius: 4px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><code style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: inherit;color: inherit;word-break: normal;white-space: pre-wrap;"><span leaf="">    _svm_vmcb* l1_vmcb = guest_context-&gt;vcpu-&gt;l1_guest_vmcb;</span><br/><span leaf="">    // 初始化嵌套NPT</span><br/><span leaf="">    if (!nested_npt::init_nested_npt(guest_context-&gt;vcpu, l1_vmcb)) {</span><br/><span leaf="">        DebugPrint(&#34;[Nested] Failed to initialize nested NPT\n&#34;);</span><br/><span leaf="">        inject_exception_gp(guest_context);</span><br/><span leaf="">        return;</span><br/><span leaf="">    }</span></code></pre><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">最后把当前状态备份一下,赋值</span></p><pre style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 13.118px;margin-top: 0px;margin-bottom: 1rem;overflow: auto;display: block;color: rgb(33, 37, 41);max-height: 400px;background-color: rgb(245, 245, 245);border: 1px solid rgb(204, 204, 204);padding: 0.5em;border-radius: 4px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><code style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: inherit;color: inherit;word-break: normal;white-space: pre-wrap;"><span leaf="">    memcpy(guest_context-&gt;vcpu-&gt;l2_guest_vmcb, &amp;guest_context-&gt;vcpu-&gt;stack-&gt;guest_vmcb, sizeof(_svm_vmcb));</span><br/><span leaf="">    // ============ 从 L1 的 guest VMCB 恢复完整的处理器状态 ============</span><br/><span leaf="">    // 根据 AMD SVM 规范，VMRUN 指令需要从 VMCB 加载完整的 guest 状态</span><br/><span leaf="">    //dest_state-&gt;Rip = src_state-&gt;Rip;</span><br/><span leaf="">    memcpy(&amp;guest_context-&gt;vcpu-&gt;stack-&gt;guest_vmcb.state_save, &amp;l1_vmcb-&gt;state_save, sizeof(_vmcb_state_save_area));</span></code></pre><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><strong style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-weight: bolder;"><span leaf="">这样做的目的是,让CPU接下来执行l2的vmcb里面的内容,自然也就进入l2的虚拟化的环境了,直到遇到vmexit.</span></strong></p><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf="">nested_vmexit</span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">当有新的vmexit触发,并且我们进入了嵌套模式的时候,需要判断一下L2的虚拟机是否启用了对应的vmexit:</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002384" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=d1db847d&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1woCcbOsjVNib39BudlSYPyLKSa81Oib78YjARibBPVE4SodYjpTeouGl0KOVNFTBboR0WC6znvczQOFY1yaxUJVUJj7IYNfVZ8jokbicB2WQWQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">如果启用了,走nested_vmexit，而这个函数的作用是，拷贝上下文，然后注入回l2，触发l2的vmexit。这样在l2里面做对应的vmexit操作如cpuid等乱七八糟的时候,他会再次触发l1的vmexit,从而被我们控制.</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">简单来说:</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">回填一下当前的vmcb(这个时候是l2的vmcb)</span></p><pre style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 13.118px;margin-top: 0px;margin-bottom: 1rem;overflow: auto;display: block;color: rgb(33, 37, 41);max-height: 400px;background-color: rgb(245, 245, 245);border: 1px solid rgb(204, 204, 204);padding: 0.5em;border-radius: 4px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><code style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: inherit;color: inherit;word-break: normal;white-space: pre-wrap;"><span leaf="">    _svm_vmcb* l1_vmcb = guest_context-&gt;vcpu-&gt;l1_guest_vmcb;</span><br/><span leaf="">    if (l1_vmcb == nullptr) {</span><br/><span leaf="">        DebugPrint(&#34;[Nested] Error: L1 VMCB is null!\n&#34;);</span><br/><span leaf="">        inject_exception_gp(guest_context);</span><br/><span leaf="">        return;</span><br/><span leaf="">    }</span></code></pre><pre style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 13.118px;margin-top: 0px;margin-bottom: 1rem;overflow: auto;display: block;color: rgb(33, 37, 41);max-height: 400px;background-color: rgb(245, 245, 245);border: 1px solid rgb(204, 204, 204);padding: 0.5em;border-radius: 4px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><code style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: inherit;color: inherit;word-break: normal;white-space: pre-wrap;"><span leaf="">// 保存exit信息</span><br/><span leaf="">    l1_vmcb-&gt;control.ExitCode = exit_code;</span><br/><span leaf="">        l1_vmcb-&gt;control.ExitInfo1 =</span><br/><span leaf="">            guest_context-&gt;vcpu-&gt;stack-&gt;guest_vmcb.control.ExitInfo1;</span><br/><span leaf="">        l1_vmcb-&gt;control.ExitInfo2 =</span><br/><span leaf="">            guest_context-&gt;vcpu-&gt;stack-&gt;guest_vmcb.control.ExitInfo2;</span><br/><span leaf="">        l1_vmcb-&gt;control.ExitIntInfo =</span><br/><span leaf="">            guest_context-&gt;vcpu-&gt;stack-&gt;guest_vmcb.control.ExitIntInfo;</span><br/><span leaf="">    // 使用硬件在本次VMEXIT时给出的NRIP，避免在L2地址空间里手动解码指令长度</span><br/><span leaf="">    l1_vmcb-&gt;control.NRip =</span><br/><span leaf="">        guest_context-&gt;vcpu-&gt;stack-&gt;guest_vmcb.control.NRip;</span><br/><span leaf="">    //拷贝state到l1_vmcb里面</span><br/><span leaf="">    memcpy(&amp;l1_vmcb-&gt;state_save, &amp;guest_context-&gt;vcpu-&gt;stack-&gt;guest_vmcb.state_save, sizeof(_vmcb_state_save_area));</span><br/><span leaf="">    l1_vmcb-&gt;state_save.Rax = guest_context-&gt;guest_register-&gt;Rax;</span><br/><span leaf="">    _svm_vmcb* l1_guest_vmcb_hva =</span><br/><span leaf="">        (_svm_vmcb*)map_l1_gpa_page_to_hva(guest_context-&gt;vcpu, guest_context-&gt;vcpu-&gt;l1_guest_vmcb_pa);</span><br/><span leaf="">    if (l1_guest_vmcb_hva == nullptr) {</span><br/><span leaf="">        DebugPrint(&#34;[Nested] Failed to map L1 VMCB for nested VMEXIT writeback\n&#34;);</span><br/><span leaf="">        inject_exception_gp(guest_context);</span><br/><span leaf="">        return;</span><br/><span leaf="">    }</span><br/><span leaf="">    memcpy(l1_guest_vmcb_hva, l1_vmcb, sizeof(_svm_vmcb));</span></code></pre><blockquote style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin: 5px 0px 15px;overflow: hidden;border-width: 0px 0px 0px 4px;border-top-style: initial;border-right-style: initial;border-bottom-style: initial;border-left-style: solid;border-top-color: initial;border-right-color: initial;border-bottom-color: initial;border-left-color: rgb(122, 208, 58);border-image: initial;padding: 8px 12px;background-color: rgb(241, 241, 241);box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 1px 0px;font-size: 14.992px;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;"><span leaf="">这个l1_guest_vmcb_pa,不是真的l1_guest_vmcb的PA,是l1调用vm_load出来的</span></p></blockquote><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">恢复之前的备份:</span></p><pre style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 13.118px;margin-top: 0px;margin-bottom: 1rem;overflow: auto;display: block;color: rgb(33, 37, 41);max-height: 400px;background-color: rgb(245, 245, 245);border: 1px solid rgb(204, 204, 204);padding: 0.5em;border-radius: 4px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><code style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: inherit;color: inherit;word-break: normal;white-space: pre-wrap;"><span leaf="">    // 恢复备份（回到进入L2前的L1 VMCB02）</span><br/><span leaf="">    memcpy(&amp;guest_context-&gt;vcpu-&gt;stack-&gt;guest_vmcb,</span><br/><span leaf="">           guest_context-&gt;vcpu-&gt;l2_guest_vmcb,</span><br/><span leaf="">           sizeof(_svm_vmcb));</span></code></pre><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">这里有一个细节,在真实SVM上，<a class="wx_topic_link" topic-id="mnbqz2uc-irssc2" style="color: #576B95 !important;" data-topic="1" data-recommend="">#VMEXIT</a> 返回到 host 后，某些状态不会自动从 HSAVE 恢复，host 需要在 VMRUN 之后执行 VMSAVE/VMLOAD 来保存/恢复：FS/GS/TR/LDTR（含隐藏状态）、KernelGsBase、STAR/LSTAR/CSTAR/SFMASK、SYSENTER_*。我们这里会把活动 VMCB 从 L2 恢复为进入 L2 前的 L1 备份（vcpu-&gt;l2_guest_vmcb）。如果直接整块覆盖，会导致这些字段变成 L1 的，从而让后续的 VMSAVE 保存错对象，解决：在恢复 L1 备份前，先抓取 L2 的这些字段；恢复后再把字段覆写回去，让紧随其后的 L1 VMSAVE 看到的是 L2 的值。</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">所以我们需要人工恢复一下</span></p><pre style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 13.118px;margin-top: 0px;margin-bottom: 1rem;overflow: auto;display: block;color: rgb(33, 37, 41);max-height: 400px;background-color: rgb(245, 245, 245);border: 1px solid rgb(204, 204, 204);padding: 0.5em;border-radius: 4px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><code style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: inherit;color: inherit;word-break: normal;white-space: pre-wrap;"><span leaf=""> auto* l1_state = &amp;guest_context-&gt;vcpu-&gt;stack-&gt;guest_vmcb.state_save;</span><br/><span leaf="">    const auto* l2_state = &amp;l2_saved_state_for_vmsave;</span><br/><span leaf="">    l1_state-&gt;FsSelector = l2_state-&gt;FsSelector;</span><br/><span leaf="">    l1_state-&gt;FsAttrib = l2_state-&gt;FsAttrib;</span><br/><span leaf="">    l1_state-&gt;FsLimit = l2_state-&gt;FsLimit;</span><br/><span leaf="">    l1_state-&gt;FsBase = l2_state-&gt;FsBase;</span><br/><span leaf="">    l1_state-&gt;GsSelector = l2_state-&gt;GsSelector;</span><br/><span leaf="">    l1_state-&gt;GsAttrib = l2_state-&gt;GsAttrib;</span><br/><span leaf="">    l1_state-&gt;GsLimit = l2_state-&gt;GsLimit;</span><br/><span leaf="">    l1_state-&gt;GsBase = l2_state-&gt;GsBase;</span><br/><span leaf="">    l1_state-&gt;TrSelector = l2_state-&gt;TrSelector;</span><br/><span leaf="">    l1_state-&gt;TrAttrib = l2_state-&gt;TrAttrib;</span><br/><span leaf="">    l1_state-&gt;TrLimit = l2_state-&gt;TrLimit;</span><br/><span leaf="">    l1_state-&gt;TrBase = l2_state-&gt;TrBase;</span><br/><span leaf="">    l1_state-&gt;LdtrSelector = l2_state-&gt;LdtrSelector;</span><br/><span leaf="">    l1_state-&gt;LdtrAttrib = l2_state-&gt;LdtrAttrib;</span><br/><span leaf="">    l1_state-&gt;LdtrLimit = l2_state-&gt;LdtrLimit;</span><br/><span leaf="">    l1_state-&gt;LdtrBase = l2_state-&gt;LdtrBase;</span><br/><span leaf="">    l1_state-&gt;KernelGsBase = l2_state-&gt;KernelGsBase;</span><br/><span leaf="">    l1_state-&gt;Star = l2_state-&gt;Star;</span><br/><span leaf="">    l1_state-&gt;LStar = l2_state-&gt;LStar;</span><br/><span leaf="">    l1_state-&gt;CStar = l2_state-&gt;CStar;</span><br/><span leaf="">    l1_state-&gt;SfMask = l2_state-&gt;SfMask;</span><br/><span leaf="">    l1_state-&gt;SysenterCs = l2_state-&gt;SysenterCs;</span><br/><span leaf="">    l1_state-&gt;SysenterEsp = l2_state-&gt;SysenterEsp;</span><br/><span leaf="">    l1_state-&gt;SysenterEip = l2_state-&gt;SysenterEip;</span></code></pre><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">然后就是恢复rip，恢复npt到l1里面</span></p><pre style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 13.118px;margin-top: 0px;margin-bottom: 1rem;overflow: auto;display: block;color: rgb(33, 37, 41);max-height: 400px;background-color: rgb(245, 245, 245);border: 1px solid rgb(204, 204, 204);padding: 0.5em;border-radius: 4px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><code style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: inherit;color: inherit;word-break: normal;white-space: pre-wrap;"><span leaf="">    // 恢复L0的NPT到VMCB</span><br/><span leaf="">    guest_context-&gt;vcpu-&gt;stack-&gt;guest_vmcb.control.NCr3 = guest_context-&gt;vcpu-&gt;npt_pa;</span><br/><span leaf="">    guest_context-&gt;vcpu-&gt;stack-&gt;guest_vmcb.control.TlbControl = 3;</span><br/><span leaf="">    if (guest_context-&gt;vcpu-&gt;l1_guest_vmcb) {</span><br/><span leaf="">        // 从 L2 VMEXIT 返回到 L1 host：应继续执行 L1 的 VMRUN 下一条指令。</span><br/><span leaf="">        // 更可靠的来源是：L0 当初拦截到 L1 的 VMRUN 时硬件给出的 NRIP。</span><br/><span leaf="">        // 该值在 handle_vmrun 中保存到 l1_vmrun_return_rip。</span><br/><span leaf="">        uintptr_t resume_rip = guest_context-&gt;vcpu-&gt;l1_vmrun_return_rip;</span><br/><span leaf="">        if (resume_rip == 0) {</span><br/><span leaf="">            // 兼容旧路径：使用进入 L2 前备份的 VMCB02.control.NRip。</span><br/><span leaf="">            resume_rip = guest_context-&gt;vcpu-&gt;stack-&gt;guest_vmcb.control.NRip;</span><br/><span leaf="">        }</span><br/><span leaf="">        if (resume_rip == 0) {</span><br/><span leaf="">            resume_rip = guest_context-&gt;vcpu-&gt;stack-&gt;guest_vmcb.state_save.Rip;</span><br/><span leaf="">            DebugPrint(&#34;[Nested] Warning: L1 resume RIP is zero, fallback RIP %p\n&#34;,</span><br/><span leaf="">                       resume_rip);</span><br/><span leaf="">        }</span><br/><span leaf="">        guest_context-&gt;vcpu-&gt;stack-&gt;guest_vmcb.state_save.Rip = resume_rip;</span><br/><span leaf="">    } else {</span><br/><span leaf="">        inject_exception_gp(guest_context);</span><br/><span leaf="">        return;</span><br/><span leaf="">    }</span></code></pre><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">最后rax指向guest_vmcb pa即可</span></p><pre style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 13.118px;margin-top: 0px;margin-bottom: 1rem;overflow: auto;display: block;color: rgb(33, 37, 41);max-height: 400px;background-color: rgb(245, 245, 245);border: 1px solid rgb(204, 204, 204);padding: 0.5em;border-radius: 4px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><code style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: inherit;color: inherit;word-break: normal;white-space: pre-wrap;"><span leaf="">    guest_context-&gt;guest_register-&gt;Rax = guest_context-&gt;vcpu-&gt;l1_guest_vmcb_pa;</span></code></pre><h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">结果</span></h2><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">跟simplesvm嵌套：</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002385" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=ca7b1aee&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2F1woCcbOsjVMnibML0BdWZxgj66MY0FDpM0flLt4MicPpS4dWJhGkbgCLjA6Y11bbmUbeLmVc0HWHvYhHoHnricI5fj7e70bf2GP2wFXHf4gdT8%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">simplesvm的vmexit:</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002383" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=3c243d98&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1woCcbOsjVODcUucmwEq4AdK0XDfNIibarPAo6uIOhNwdjJJ7XEFAw7agXhow94ZjzEQFOLj3sr0X6eJ36fkqiaDXvpFNGBpBxaibRAUYpsnsY%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" nodeleaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002386" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=7b34d6e3&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2F1woCcbOsjVOibRhib0lQRPngbc8MwNwesMYJzc0BcMs6cKsF0UI7GpGXPQ0WYMBSL68l1jootUOqfTgjjToqsibO7g3CuBQAfsZUjSGvJRuA1k%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="display: none;"><mp-style-type data-value="3"></mp-style-type></p>



<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=52756263&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzkyOTc0NDY2Nw%3D%3D%26mid%3D2247486042%26idx%3D1%26sn%3D3486846e6c97495bf53864d09d0e1267">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Mon, 30 Mar 2026 10:02:00 +0800</pubDate>
    </item>
    <item>
      <title>从0开始开发VT调试器（二）</title>
      <link>https://mp.weixin.qq.com/s?__biz=MzkyOTc0NDY2Nw==&amp;mid=2247485990&amp;idx=1&amp;sn=8b48a6c24677302fcddab9fd4dfdea46</link>
      <description></description>
      <content:encoded><![CDATA[<p>原创 <span>CrazyHarb</span> <span>2026-03-29 10:01</span> <span style="display: inline-block;">北京</span></p>






  
  <p><img src="https://wechat2rss.xlab.app/img-proxy/?k=59163740&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2F1woCcbOsjVMibibrOSsUtzveEVPqLUfIcianbnOmcN0u6ibtibosKboYHmEDdrZazMib50zibzNZtBFacfF7rzUnq1gly9Tp4S0aMwickn1ggx9H7VQ%2F0%3Fwx_fmt%3Djpeg"/></p>
  
  <p style="margin-top:24.0pt;margin-bottom:24.0pt;margin-left:0.0pt;line-height:120%;"><span style="font-size:26.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">从0开始开发VT调试器（二）</span></span></p><p style="margin-top:19.0pt;margin-bottom:7.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:1;"><span style="mso-bookmark:heading_0;"><span style="font-size:18.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">背景：</span></span></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">上一章中，我们完成了基础的VT环境搭建，我们已经可以从guest中拦截一些简单的指令跳转到host了，本期我们加快速度将对调试链路进行进一步编写</span></span></p><p style="margin-top:19.0pt;margin-bottom:7.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:1;"><span style="mso-bookmark:heading_1;"><span style="font-size:18.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">原理：</span></span></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">在Ring3层，我们经常会用到各种调试工具，例如vs、x64dbg等，他们的单步原理基本上就是两种异常——#DB、#BP，这两种异常在触发时（其实所有异常都会这么走），会触发IDT表中的1号中断和3号中断，中断触发后，会先触发调试器，也就是windbg、x64dbg等(First Chance); 如果调试器未处理，会自动分发到触发异常的进程的ntdll的RtlDispatchException，最后如果进程没有处理，会再次触发Ring3调试器</span></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">我们简单画一下异常处理的流程图，即：</span></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:center;margin-left:0.0pt;line-height:120%;"><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"><span leaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.653125" data-w="1280" style="width:552.010009765625px;height:360.010009765625px;" src="https://wechat2rss.xlab.app/img-proxy/?k=0ea28691&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2F1woCcbOsjVOPUU44ick5v8kibHnN6XE7DGniacggrxnrvocp4Obr6oCSsyibfXpsmGyewYjibYbicJmHWadoib4UWt63icTgHpHrCJj2Lyg4byAZsJo%2F640%3Fwx_fmt%3Djpeg"/></span></span><o:page></o:page></p><p style="margin-top:19.0pt;margin-bottom:7.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:1;"><span style="mso-bookmark:heading_2;"><span style="font-size:18.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">VT下的异常流程:</span></span></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">通过原理已知在Ring3进程触发异常时，首先会通过触发#DB #BP，然后借助IDT进入windows内核，这便是我们可以触发VT调试的点，即，当触发#DB #BP时，VT host会接管异常，并分发到我们自己的调试器，当调试器处理完成后，VT负责注入异常或者继续执行</span></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:center;margin-left:0.0pt;line-height:120%;"><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"><span leaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.315625" data-w="1280" style="width:552.010009765625px;height:174.0px;" src="https://wechat2rss.xlab.app/img-proxy/?k=193e5d72&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2F1woCcbOsjVNuyrN3ThWJhWaQ5eGdQGwCEeic0YPSwbBHudwg4ejMsqNVBhlnjfWE7wdFlbJpsqdf4LticN7lMiajV7r7aomrW6t85MXZYicUsEA%2F640%3Fwx_fmt%3Djpeg"/></span></span></p><p style="margin-top:19.0pt;margin-bottom:7.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:1;"><span style="mso-bookmark:heading_3;"><span style="font-size:18.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">代码修改：</span></span></span></p><p style="margin-top:16.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:2;"><span style="mso-bookmark:heading_4;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;color:#3370FF;"><span leaf="">1. </span></span></span><span style="mso-bookmark:heading_4;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">Exception map</span></span></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">首先，我们找到setup_vmcs中的针对_vt_vmcs_exceptionbitmap的写入值，这个字段主要的作用是它记录的值中如果某一位为1，那么当idt触发对应的中断时，会进入vt host，例如当#DB触发时，如果_vt_vmcs_exceptionbitmap的值为 1 &lt;&lt; 1，那么#DB会进入VT的host的代码中，这里我们把exception_map的值改为 1 &lt;&lt; 1</span></span></p><table style="margin-left: 0.0;border: none;border-collapse: collapse;mso-table-layout-alt: fixed;mso-border-top-alt: solid #DEE0E3 0.25pt;mso-border-left-alt: solid #DEE0E3 0.25pt;mso-border-bottom-alt: solid #DEE0E3 0.25pt;mso-border-right-alt: solid #DEE0E3 0.25pt;mso-padding-alt: 0pt 5.4pt 0pt 5.4pt;width: 100%;"><tbody><tr><td data-colwidth="552" width="552" valign="top" style="background: rgb(245, 246, 247);border-width: 1pt;border-style: solid;border-color: rgb(222, 224, 227);padding: 3pt 6pt 1.5pt;"><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;color:#646A73;"><span leaf="">C++                  </span></span><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;"><span leaf="">uintptr_t exception_bitmap = 1 &lt;&lt; 1;                  </span><span leaf=""><br/></span><span leaf="">nerror |= __vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_exceptionbitmap, exception_bitmap);</span></span></p></td></tr></tbody></table><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;"><o:page></o:page></p><p style="margin-top:16.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:2;"><span style="mso-bookmark:heading_5;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;color:#3370FF;"><span leaf="">2. </span></span></span><span style="mso-bookmark:heading_5;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">VT处理异常代码</span></span></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">我们在代码中需要对_vt_exitreason_exceptionornmi进行处理，即vt_vmm_handleexception函数，在该函数中，我们需要对#DB进行判断，并打印一条日志，并按原属性进行注入事件，在我们修改的代码中可以看到，判断了type(Hardware)和vector(#DB)，这个type和vector是一一对应的，具体值需要参考intel的手册，这里就不再展开了</span></span></p><table style="margin-left: 0.0;border: none;border-collapse: collapse;mso-table-layout-alt: fixed;mso-border-top-alt: solid #DEE0E3 0.25pt;mso-border-left-alt: solid #DEE0E3 0.25pt;mso-border-bottom-alt: solid #DEE0E3 0.25pt;mso-border-right-alt: solid #DEE0E3 0.25pt;mso-padding-alt: 0pt 5.4pt 0pt 5.4pt;width: 100%;"><tbody><tr><td data-colwidth="552" width="552" valign="top" style="background: rgb(245, 246, 247);border-width: 1pt;border-style: solid;border-color: rgb(222, 224, 227);padding: 3pt 6pt 1.5pt;"><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;color:#646A73;"><span leaf="">C++                  </span></span><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;"><span leaf="">void vt_vmm_handleexception(_vt_vmhandle_guestcontext* guest_context) {                  </span><span leaf=""><br/></span><span leaf="">size_t exit_exception_value = 0;                  </span><span leaf=""><br/></span><span leaf="">__vmx_vmread((size_t)_vt_vmcs_field::_vt_vmcs_vmexitintrinfo, &amp;exit_exception_value);                  </span><span leaf=""><br/></span><span leaf="">const _vt_vmexit_interruptioninformationfield exception = { exit_exception_value };                  </span><span leaf=""><br/></span><span leaf="">const _vt_interruption_type interruption_type = (_vt_interruption_type)(exception.fields.interruption_type);                  </span><span leaf=""><br/></span><span leaf="">const _vt_interruption_vector vector = (_vt_interruption_vector)(exception.fields.vector);                  </span><span leaf=""><br/></span><span leaf="">ULONG_PTR guest_inst_length;                  </span><span leaf=""><br/></span><span leaf="">__vmx_vmread((ULONG_PTR)_vt_vmcs_field::_vt_vmcs_vmexitinstructionlen, &amp;guest_inst_length);                  </span><span leaf=""><br/></span><span leaf="">ULONG_PTR error_code = 0;                  </span><span leaf=""><br/></span><span leaf="">__vmx_vmread((ULONG32)_vt_vmcs_field::_vt_vmcs_vmexitintrerrorcode, &amp;error_code);                  </span><span leaf=""><br/></span><span leaf="">if (interruption_type == _vt_interruption_type::_vt_interruption_hardwareexception) {                  </span><span leaf=""><br/></span><span leaf="">// Hardware exception                  </span><span leaf=""><br/></span><span leaf="">if (vector == _vt_interruption_vector::_vt_intteruptionvec_debugexception)                  </span><span leaf=""><br/></span><span leaf="">{                  </span><span leaf=""><br/></span><span leaf="">DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, &#34;GetInt1 %p\n&#34;, PsGetCurrentProcessId());                  </span><span leaf=""><br/></span><span leaf="">vt_vmm_injectinterruption(_vt_interruption_type::_vt_interruption_hardwareexception, vector, exception.fields.error_code_valid, error_code);                  </span><span leaf=""><br/></span><span leaf="">__vmx_vmwrite((ULONG32)_vt_vmcs_field::_vt_vmcs_vmentryinstructionlen, guest_inst_length);                  </span><span leaf=""><br/></span><span leaf="">}                  </span><span leaf=""><br/></span><span leaf="">else {                  </span><span leaf=""><br/></span><span leaf="">vt_vmm_injectinterruption(interruption_type, vector, exception.fields.error_code_valid, error_code);                  </span><span leaf=""><br/></span><span leaf="">__vmx_vmwrite((ULONG32)_vt_vmcs_field::_vt_vmcs_vmentryinstructionlen, guest_inst_length);                  </span><span leaf=""><br/></span><span leaf="">}                  </span><span leaf=""><br/></span><span leaf="">}                  </span><span leaf=""><br/></span><span leaf="">else {                  </span><span leaf=""><br/></span><span leaf="">vt_vmm_injectinterruption(interruption_type, vector, exception.fields.error_code_valid, error_code);                  </span><span leaf=""><br/></span><span leaf="">__vmx_vmwrite((ULONG32)_vt_vmcs_field::_vt_vmcs_vmentryinstructionlen, guest_inst_length);                  </span><span leaf=""><br/></span><span leaf="">}                  </span><span leaf=""><br/></span><span leaf="">}</span></span><o:page></o:page></p></td></tr></tbody></table><p style="margin-top:16.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:2;"><span style="mso-bookmark:heading_6;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;color:#3370FF;"><span leaf="">3. </span></span></span><span style="mso-bookmark:heading_6;"><span style="font-size:16.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">代码测试</span></span></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">我们将驱动在测试环境中加载起来，此时我们需要触发#DB，才能在驱动的输出中看是否拦截到了，所以，在这里需要打开调试器对文件进行单步，笔者使用了x64dbg对一个exe进行调试，可以看到，笔者单步两次后，debug中是可以打印出对应的日志的，证明此时host拦截到正确的数据了</span></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:center;margin-left:0.0pt;line-height:120%;"><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"><span leaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.6430379746835443" data-w="1185" style="width:552.010009765625px;height:354.010009765625px;" src="https://wechat2rss.xlab.app/img-proxy/?k=a5c64012&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1woCcbOsjVNY9fiajLzdMnIhia1b6ztwZBHs9TaUCENtEfB3bU4IN9FlDafUK2bXprO74C7tz7qG34gRKdgAGzC2iciapiaTSVtyTuN250CtmRBY%2F640%3Fwx_fmt%3Dpng"/></span></span></p><p style="margin-top:19.0pt;margin-bottom:7.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:1;"><span style="mso-bookmark:heading_7;"><span style="font-size:18.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">Guest代码转向</span></span></span><o:page></o:page></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">现在，我们开始编写guest代码，guest的流程主要为，host注入guest转向，guest代码跳转到我们自己的stub上，stub最后触发host处理，最后host恢复环境，然后ring3继续执行，这里触发host处理，我们用vmcall指令即可</span></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">首先，我们在汇编中添加：</span></span></p><table style="margin-left: 0.0;border: none;border-collapse: collapse;mso-table-layout-alt: fixed;mso-border-top-alt: solid #DEE0E3 0.25pt;mso-border-left-alt: solid #DEE0E3 0.25pt;mso-border-bottom-alt: solid #DEE0E3 0.25pt;mso-border-right-alt: solid #DEE0E3 0.25pt;mso-padding-alt: 0pt 5.4pt 0pt 5.4pt;width: 100%;"><tbody><tr><td data-colwidth="552" width="552" valign="top" style="background: rgb(245, 246, 247);border-width: 1pt;border-style: solid;border-color: rgb(222, 224, 227);padding: 3pt 6pt 1.5pt;"><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;color:#646A73;"><span leaf="">C++                  </span></span><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;"><span leaf="">asm_dbg_entry proc                  </span><span leaf=""><br/></span><span leaf="">mov rcx, 1340h                  </span><span leaf=""><br/></span><span leaf="">vmcall                  </span><span leaf=""><br/></span><span leaf="">int 3 ;不该执行到这里                  </span><span leaf=""><br/></span><span leaf="">asm_dbg_entry endp</span></span></p></td></tr></tbody></table><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">其次，我们在#DB中添加注入RIP的代码</span></span></p><table style="margin-left: 0.0;border: none;border-collapse: collapse;mso-table-layout-alt: fixed;mso-border-top-alt: solid #DEE0E3 0.25pt;mso-border-left-alt: solid #DEE0E3 0.25pt;mso-border-bottom-alt: solid #DEE0E3 0.25pt;mso-border-right-alt: solid #DEE0E3 0.25pt;mso-padding-alt: 0pt 5.4pt 0pt 5.4pt;width: 100%;"><tbody><tr><td data-colwidth="552" width="552" valign="top" style="background: rgb(245, 246, 247);border-width: 1pt;border-style: solid;border-color: rgb(222, 224, 227);padding: 3pt 6pt 1.5pt;"><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;color:#646A73;"><span leaf="">C++                  </span></span><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;"><span leaf="">....                  </span><span leaf=""><br/></span><span leaf="">   if (interruption_type == _vt_interruption_type::_vt_interruption_hardwareexception) {                  </span><span leaf=""><br/></span><span leaf="">// Hardware exception                  </span><span leaf=""><br/></span><span leaf="">if (vector == _vt_interruption_vector::_vt_intteruptionvec_debugexception)                  </span><span leaf=""><br/></span><span leaf="">{                  </span><span leaf=""><br/></span><span leaf="">DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, &#34;GetInt1 %p\n&#34;, PsGetCurrentProcessId());                  </span><span leaf=""><br/></span><span leaf="">__vmx_vmwrite((ULONG32)_vt_vmcs_field::_vt_vmcs_guestrip, (ULONG_PTR)&amp;asm_dbg_entry);                  </span><span leaf=""><br/></span><span leaf="">}                  </span><span leaf=""><br/></span><span leaf="">else {                  </span><span leaf=""><br/></span><span leaf="">vt_vmm_injectinterruption(interruption_type, vector, exception.fields.error_code_valid, error_code);                  </span><span leaf=""><br/></span><span leaf="">__vmx_vmwrite((ULONG32)_vt_vmcs_field::_vt_vmcs_vmentryinstructionlen, guest_inst_length);                  </span><span leaf=""><br/></span><span leaf="">}</span></span></p></td></tr></tbody></table><p style="margin-top:19.0pt;margin-bottom:7.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:1;"><span style="mso-bookmark:heading_8;"><span style="font-size:18.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">KVA功能的影响</span></span></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">在注入代码后，我们需要考虑的一个问题，就是KVA的问题，如果windows启动了KVA，那么我们还需要更改cr3到kernel态下的CR3，毕竟shadow Cr3只有当前进程的ring3地址，以及ntkernel中的.KVSCode段的地址，我们的驱动不在这个段中，所以需要切CR3；如果没有开启，那么就不需要切了，可以用下面的ps脚本进行判断</span></span><o:page></o:page></p><table style="margin-left: 0.0;border: none;border-collapse: collapse;mso-table-layout-alt: fixed;mso-border-top-alt: solid #DEE0E3 0.25pt;mso-border-left-alt: solid #DEE0E3 0.25pt;mso-border-bottom-alt: solid #DEE0E3 0.25pt;mso-border-right-alt: solid #DEE0E3 0.25pt;mso-padding-alt: 0pt 5.4pt 0pt 5.4pt;width: 100%;"><tbody><tr><td data-colwidth="552" width="552" valign="top" style="background: rgb(245, 246, 247);border-width: 1pt;border-style: solid;border-color: rgb(222, 224, 227);padding: 3pt 6pt 1.5pt;"><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;color:#646A73;"><span leaf="">C++                  </span></span><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;"><span leaf="">Install-Module SpeculationControl -Force                  </span><span leaf=""><br/></span><span leaf="">Import-Module SpeculationControl                  </span><span leaf=""><br/></span><span leaf="">Get-SpeculationControlSettings</span></span></p></td></tr></tbody></table><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">笔者的电脑，执行后发现没有开启KVA，查阅相关资料发现在最新的CPU上，已经修复了这个漏洞，所以，windows不再开启了</span></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:center;margin-left:0.0pt;line-height:120%;"><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"><span leaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.7710557532621589" data-w="843" style="width:552.010009765625px;height:425.010009765625px;" src="https://wechat2rss.xlab.app/img-proxy/?k=a04b8be6&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1woCcbOsjVOBOmCS0K6ttvPZQvr8pv7eibw6COmzS1iafQibZ1rkJEZqff8Rjv9KENgkY1lAxq9Bfp3gucjL1nDXBjYL2iac65crCOB316uV3GQ%2F640%3Fwx_fmt%3Dpng"/></span></span></p><p style="margin-top:19.0pt;margin-bottom:7.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:1;"><span style="mso-bookmark:heading_9;"><span style="font-size:18.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">需要保留的寄存器：</span></span></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">以上的代码展示了核心部分，但不是完整流程，因为在vmcall后，host需要恢复现场内容，所以需要将现场数据进行保存</span></span></p><p style="margin-top:16.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:2;"><span style="mso-bookmark:heading_10;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;color:#3370FF;"><span leaf="">1. </span></span></span><span style="mso-bookmark:heading_10;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">eflags寄存器</span></span></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">该寄存器必然会被修改，因为至少tf位会被置为0，否则当注入guest后，会再次触发#DB，最后走入异常状态，我们根据Intel手册中对eflags的描述，我们将Eflags置为2，原始值保存</span></span><o:page></o:page></p><p style="margin-top:16.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:2;"><span style="mso-bookmark:heading_11;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;color:#3370FF;"><span leaf="">2. </span></span></span><span style="mso-bookmark:heading_11;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">DR寄存器</span></span></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">和eflags的理由相同，当启动Dr时，如果地址被ring3精心构造，那么我们会在stub的某个地方触发#DB异常，导致异常状态，我们把Dr7改为0x400，屏蔽掉其他的Dr寄存器，避免触发</span></span></p><p style="margin-top:16.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:2;"><span style="mso-bookmark:heading_12;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;color:#3370FF;"><span leaf="">3. </span></span></span><span style="mso-bookmark:heading_12;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">Guest context寄存器</span></span></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">包含cs和ss、rip、rsp、rcx，为了在vmcall的时候直接恢复，所以这几个段需要保存，这里可能会有读者有些疑问，为什么rcx也需要保存呢？因为我们在再次进入host时，用的vmcall，为了判断编号，所以用的时rcx，所以这个rcx是需要保存的</span></span></p><p style="margin-top:16.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:2;"><span style="mso-bookmark:heading_13;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;color:#3370FF;"><span leaf="">4. </span></span></span><span style="mso-bookmark:heading_13;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">guest_exceptionreason、error_code、指令长度等</span></span></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">这些都和guest注入异常有关系，所以也需要进行保存，这样可以避免后续未处理时，注入错了异常</span></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">我们总结一下整体的结构</span></span></p><table style="margin-left: 0.0;border: none;border-collapse: collapse;mso-table-layout-alt: fixed;mso-border-top-alt: solid #DEE0E3 0.25pt;mso-border-left-alt: solid #DEE0E3 0.25pt;mso-border-bottom-alt: solid #DEE0E3 0.25pt;mso-border-right-alt: solid #DEE0E3 0.25pt;mso-padding-alt: 0pt 5.4pt 0pt 5.4pt;width: 100%;"><tbody><tr><td data-colwidth="552" width="552" valign="top" style="background: rgb(245, 246, 247);border-width: 1pt;border-style: solid;border-color: rgb(222, 224, 227);padding: 3pt 6pt 1.5pt;"><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;color:#646A73;"><span leaf="">C++                  </span></span><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;"><span leaf="">struct DBG_Stack {                  </span><span leaf=""><br/></span><span leaf="">ULONG_PTR Dr7;                  </span><span leaf=""><br/></span><span leaf="">ULONG_PTR guest_inst_length;                  </span><span leaf=""><br/></span><span leaf="">ULONG_PTR exception_type;                  </span><span leaf=""><br/></span><span leaf="">ULONG_PTR exception_vector;                  </span><span leaf=""><br/></span><span leaf="">ULONG_PTR csbase;                  </span><span leaf=""><br/></span><span leaf="">ULONG_PTR cslimit;                  </span><span leaf=""><br/></span><span leaf="">ULONG_PTR csselector;                  </span><span leaf=""><br/></span><span leaf="">ULONG_PTR ssselector;                  </span><span leaf=""><br/></span><span leaf="">ULONG_PTR csarbytes;                  </span><span leaf=""><br/></span><span leaf="">ULONG_PTR ssbase;                  </span><span leaf=""><br/></span><span leaf="">ULONG_PTR sslimit;                  </span><span leaf=""><br/></span><span leaf="">ULONG_PTR ssarbytes;                  </span><span leaf=""><br/></span><span leaf="">ULONG_PTR ip;                  </span><span leaf=""><br/></span><span leaf="">ULONG_PTR eflags;                  </span><span leaf=""><br/></span><span leaf="">ULONG_PTR sp;                  </span><span leaf=""><br/></span><span leaf="">ULONG_PTR original_rcx;                  </span><span leaf=""><br/></span><span leaf="">};</span></span><o:page></o:page></p></td></tr></tbody></table><p style="margin-top:19.0pt;margin-bottom:7.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:1;"><span style="mso-bookmark:heading_14;"><span style="font-size:18.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">申请并填充栈</span></span></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">为了保存我们需要的数据，我们需要将我们的数据保存在栈上，并为了避免返回Ring3的时候，Ring3找到相关的数据，所以我们需要自己申请一块地址，保存context</span></span></p><table style="margin-left: 0.0;border: none;border-collapse: collapse;mso-table-layout-alt: fixed;mso-border-top-alt: solid #DEE0E3 0.25pt;mso-border-left-alt: solid #DEE0E3 0.25pt;mso-border-bottom-alt: solid #DEE0E3 0.25pt;mso-border-right-alt: solid #DEE0E3 0.25pt;mso-padding-alt: 0pt 5.4pt 0pt 5.4pt;width: 100%;"><tbody><tr><td data-colwidth="552" width="552" valign="top" style="background: rgb(245, 246, 247);border-width: 1pt;border-style: solid;border-color: rgb(222, 224, 227);padding: 3pt 6pt 1.5pt;"><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;color:#646A73;"><span leaf="">C++                  </span></span><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;"><span leaf="">PHYSICAL_ADDRESS phys = { 0 };                  </span><span leaf=""><br/></span><span leaf="">phys.QuadPart = ~0ULL;                  </span><span leaf=""><br/></span><span leaf="">auto stack = (ULONG_PTR)MmAllocateContiguousMemory(PAGE_SIZE, phys);                  </span><span leaf=""><br/></span><span leaf="">DBG_Stack* guest_stack = (DBG_Stack*)(stack + PAGE_SIZE - sizeof(DBG_Stack));                  </span><span leaf=""><br/></span><span leaf="">__vmx_vmread((size_t)_vt_vmcs_field::_vt_vmcs_guestdr7, &amp;guest_stack-&gt;Dr7);                  </span><span leaf=""><br/></span><span leaf="">guest_stack-&gt;guest_inst_length = guest_inst_length;                  </span><span leaf=""><br/></span><span leaf="">guest_stack-&gt;exception_type = (ULONG_PTR)interruption_type;                  </span><span leaf=""><br/></span><span leaf="">guest_stack-&gt;exception_vector = (ULONG_PTR)vector;                  </span><span leaf=""><br/></span><span leaf="">guest_stack-&gt;ip = (ULONG_PTR)guest_context-&gt;ip;                  </span><span leaf=""><br/></span><span leaf="">guest_stack-&gt;eflags = guest_context-&gt;flag_reg.all;                  </span><span leaf=""><br/></span><span leaf="">guest_stack-&gt;sp = (ULONG_PTR)guest_context-&gt;stack-&gt;gp_regs.Rsp;                  </span><span leaf=""><br/></span><span leaf="">guest_stack-&gt;original_rcx = guest_context-&gt;stack-&gt;gp_regs.Rcx;                  </span><span leaf=""><br/></span><span leaf="">__vmx_vmread((size_t)_vt_vmcs_field::_vt_vmcs_guestcsbase, &amp;guest_stack-&gt;csbase);                  </span><span leaf=""><br/></span><span leaf="">__vmx_vmread((size_t)_vt_vmcs_field::_vt_vmcs_guestssbase, &amp;guest_stack-&gt;ssbase);                  </span><span leaf=""><br/></span><span leaf="">__vmx_vmread((size_t)_vt_vmcs_field::_vt_vmcs_guestcsarbytes, &amp;guest_stack-&gt;csarbytes);                  </span><span leaf=""><br/></span><span leaf="">__vmx_vmread((size_t)_vt_vmcs_field::_vt_vmcs_guestssarbytes, &amp;guest_stack-&gt;ssarbytes);                  </span><span leaf=""><br/></span><span leaf="">__vmx_vmread((size_t)_vt_vmcs_field::_vt_vmcs_guestcslimit, &amp;guest_stack-&gt;cslimit);                  </span><span leaf=""><br/></span><span leaf="">__vmx_vmread((size_t)_vt_vmcs_field::_vt_vmcs_guestsslimit, &amp;guest_stack-&gt;sslimit);                  </span><span leaf=""><br/></span><span leaf="">__vmx_vmread((size_t)_vt_vmcs_field::_vt_vmcs_guestcsselector, &amp;guest_stack-&gt;csselector);                  </span><span leaf=""><br/></span><span leaf="">__vmx_vmread((size_t)_vt_vmcs_field::_vt_vmcs_guestssselector, &amp;guest_stack-&gt;ssselector);                  </span><span leaf=""><br/></span><span leaf="">__vmx_vmread((size_t)_vt_vmcs_field::_vt_vmcs_guestdr7, &amp;guest_stack-&gt;Dr7);                  </span><span leaf=""><br/></span><span leaf="">__vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_guestcsselector, asm_readcs());                  </span><span leaf=""><br/></span><span leaf="">__vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_guestssselector, asm_readss());                  </span><span leaf=""><br/></span><span leaf="">__vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_guestcsarbytes, vmx_getsegment_accessright(asm_readcs()));                  </span><span leaf=""><br/></span><span leaf="">__vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_guestssarbytes, vmx_getsegment_accessright(asm_readss()));                  </span><span leaf=""><br/></span><span leaf="">__vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_guestcslimit, __segmentlimit(asm_readcs()));                  </span><span leaf=""><br/></span><span leaf="">__vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_guestsslimit, __segmentlimit(asm_readss()));                  </span><span leaf=""><br/></span><span leaf="">__vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_guestdr7, 0x400);                  </span><span leaf=""><br/></span><span leaf="">__vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_guestrflags, 2);                  </span><span leaf=""><br/></span><span leaf="">__vmx_vmwrite((ULONG32)_vt_vmcs_field::_vt_vmcs_guestrsp, (ULONG_PTR)guest_stack);                  </span><span leaf=""><br/></span><span leaf="">__vmx_vmwrite((ULONG32)_vt_vmcs_field::_vt_vmcs_guestrip, (ULONG_PTR)&amp;asm_dbg_entry);</span></span><o:page></o:page></p></td></tr></tbody></table><p style="margin-top:19.0pt;margin-bottom:7.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:1;"><span style="mso-bookmark:heading_15;"><span style="font-size:18.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">VMCALL代码的实现：</span></span></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">首先，我们先针对VMACALL做一下接管，之前的逻辑是直接注入GP异常，现在不需要了</span></span></p><table style="margin-left: 0.0;border: none;border-collapse: collapse;mso-table-layout-alt: fixed;mso-border-top-alt: solid #DEE0E3 0.25pt;mso-border-left-alt: solid #DEE0E3 0.25pt;mso-border-bottom-alt: solid #DEE0E3 0.25pt;mso-border-right-alt: solid #DEE0E3 0.25pt;mso-padding-alt: 0pt 5.4pt 0pt 5.4pt;width: 100%;"><tbody><tr><td data-colwidth="552" width="552" valign="top" style="background: rgb(245, 246, 247);border-width: 1pt;border-style: solid;border-color: rgb(222, 224, 227);padding: 3pt 6pt 1.5pt;"><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;color:#646A73;"><span leaf="">C++                  </span></span><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;"><span leaf="">void vt_vmm_handlevmexit(_vt_vmhandle_guestcontext* guest_context) {                  </span><span leaf=""><br/></span><span leaf="">....                  </span><span leaf=""><br/></span><span leaf="">case _vt_vmx_exitreason::_vt_exitreason_vmcall:                  </span><span leaf=""><br/></span><span leaf="">vt_vmm_handle_vmcall(guest_context);                  </span><span leaf=""><br/></span><span leaf="">break;                  </span><span leaf=""><br/></span><span leaf="">   }</span></span></p></td></tr></tbody></table><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;"><o:page></o:page></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">我们开始继续封装handle_vmcall函数，当得到rcx为0x1340时，我们直接注入系统异常，后续ring0、ring3的调试器就可以接到内容了</span></span></p><table style="margin-left: 0.0;border: none;border-collapse: collapse;mso-table-layout-alt: fixed;mso-border-top-alt: solid #DEE0E3 0.25pt;mso-border-left-alt: solid #DEE0E3 0.25pt;mso-border-bottom-alt: solid #DEE0E3 0.25pt;mso-border-right-alt: solid #DEE0E3 0.25pt;mso-padding-alt: 0pt 5.4pt 0pt 5.4pt;width: 100%;"><tbody><tr><td data-colwidth="552" width="552" valign="top" style="background: rgb(245, 246, 247);border-width: 1pt;border-style: solid;border-color: rgb(222, 224, 227);padding: 3pt 6pt 1.5pt;"><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;color:#646A73;"><span leaf="">C++                  </span></span><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;"><span leaf="">#define vmcall_db_dispatch_system 0x1340                  </span><span leaf=""><br/></span><span leaf="">void vt_vmm_handle_vmcall(_vt_vmhandle_guestcontext* guest_context) {                  </span><span leaf=""><br/></span><span leaf="">const auto hypercall_number = guest_context-&gt;stack-&gt;gp_regs.Rcx;                  </span><span leaf=""><br/></span><span leaf="">switch (hypercall_number) {                  </span><span leaf=""><br/></span><span leaf="">case vmcall_db_dispatch_system:                  </span><span leaf=""><br/></span><span leaf="">vt_vmm_handle_DB_exception(guest_context, guest_context-&gt;stack-&gt;gp_regs.Rsp, true);                  </span><span leaf=""><br/></span><span leaf="">break;                  </span><span leaf=""><br/></span><span leaf="">default:                  </span><span leaf=""><br/></span><span leaf="">break;                  </span><span leaf=""><br/></span><span leaf="">}                  </span><span leaf=""><br/></span><span leaf="">}</span></span></p></td></tr></tbody></table><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">我们继续封装vt_vmm_handle_DB_exception用于处理相关逻辑，其中封装了一个vt_vmm_restore_context函数，用于处理堆栈上的数据恢复guest的状态，段、栈、ip、flags、原始rcx等</span></span></p><table style="margin-left: 0.0;border: none;border-collapse: collapse;mso-table-layout-alt: fixed;mso-border-top-alt: solid #DEE0E3 0.25pt;mso-border-left-alt: solid #DEE0E3 0.25pt;mso-border-bottom-alt: solid #DEE0E3 0.25pt;mso-border-right-alt: solid #DEE0E3 0.25pt;mso-padding-alt: 0pt 5.4pt 0pt 5.4pt;width: 100%;"><tbody><tr><td data-colwidth="552" width="552" valign="top" style="background: rgb(245, 246, 247);border-width: 1pt;border-style: solid;border-color: rgb(222, 224, 227);padding: 3pt 6pt 1.5pt;"><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;color:#646A73;"><span leaf="">C++                  </span></span><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;"><span leaf="">void vt_vmm_restore_context(_vt_vmhandle_guestcontext* guest_context, ULONG_PTR guestRsp, bool dispatch_into_system, ULONG_PTR&amp; exception_reason, ULONG_PTR&amp; error_code) {                  </span><span leaf=""><br/></span><span leaf="">DBG_Stack* dbgFrame = (DBG_Stack*)guestRsp;                  </span><span leaf=""><br/></span><span leaf="">guest_context-&gt;stack-&gt;gp_regs.Rcx = dbgFrame-&gt;original_rcx;                  </span><span leaf=""><br/></span><span leaf="">exception_reason = (ULONG_PTR)dbgFrame-&gt;exception_type;                  </span><span leaf=""><br/></span><span leaf="">__vmx_vmwrite((ULONG_PTR)_vt_vmcs_field::_vt_vmcs_guestrip, (ULONG_PTR)dbgFrame-&gt;ip);                  </span><span leaf=""><br/></span><span leaf="">__vmx_vmwrite((ULONG_PTR)_vt_vmcs_field::_vt_vmcs_guestcsselector, (ULONG_PTR)dbgFrame-&gt;csselector);                  </span><span leaf=""><br/></span><span leaf="">__vmx_vmwrite((ULONG_PTR)_vt_vmcs_field::_vt_vmcs_guestrflags, (ULONG_PTR)dbgFrame-&gt;eflags);                  </span><span leaf=""><br/></span><span leaf="">__vmx_vmwrite((ULONG_PTR)_vt_vmcs_field::_vt_vmcs_guestrsp, (ULONG_PTR)dbgFrame-&gt;sp);                  </span><span leaf=""><br/></span><span leaf="">__vmx_vmwrite((ULONG_PTR)_vt_vmcs_field::_vt_vmcs_guestssselector, (ULONG_PTR)dbgFrame-&gt;ssselector);                  </span><span leaf=""><br/></span><span leaf="">__vmx_vmwrite((ULONG32)_vt_vmcs_field::_vt_vmcs_vmentryinstructionlen, dbgFrame-&gt;guest_inst_length);                  </span><span leaf=""><br/></span><span leaf="">__vmx_vmwrite((ULONG32)_vt_vmcs_field::_vt_vmcs_guestdr7, dbgFrame-&gt;Dr7);                  </span><span leaf=""><br/></span><span leaf="">__vmx_vmwrite((ULONG32)_vt_vmcs_field::_vt_vmcs_guestcslimit, dbgFrame-&gt;cslimit);                  </span><span leaf=""><br/></span><span leaf="">__vmx_vmwrite((ULONG32)_vt_vmcs_field::_vt_vmcs_guestcsarbytes, dbgFrame-&gt;csarbytes);                  </span><span leaf=""><br/></span><span leaf="">__vmx_vmwrite((ULONG32)_vt_vmcs_field::_vt_vmcs_guestsslimit, dbgFrame-&gt;sslimit);                  </span><span leaf=""><br/></span><span leaf="">__vmx_vmwrite((ULONG32)_vt_vmcs_field::_vt_vmcs_guestssarbytes, dbgFrame-&gt;ssarbytes);                  </span><span leaf=""><br/></span><span leaf="">__vmx_vmwrite((ULONG32)_vt_vmcs_field::_vt_vmcs_guestcsbase, dbgFrame-&gt;csbase);                  </span><span leaf=""><br/></span><span leaf="">__vmx_vmwrite((ULONG32)_vt_vmcs_field::_vt_vmcs_guestssbase, dbgFrame-&gt;ssbase);                  </span><span leaf=""><br/></span><span leaf="">}                  </span><span leaf=""><br/></span><span leaf="">void vt_vmm_handle_DB_exception(_vt_vmhandle_guestcontext* guest_context, ULONG_PTR guestRsp, bool inject_into_system) {                  </span><span leaf=""><br/></span><span leaf="">ULONG_PTR excetpion_reason;                  </span><span leaf=""><br/></span><span leaf="">ULONG_PTR error_code;                  </span><span leaf=""><br/></span><span leaf="">vt_vmm_restore_context(guest_context, guestRsp, inject_into_system, excetpion_reason, error_code);                  </span><span leaf=""><br/></span><span leaf="">if (inject_into_system)                  </span><span leaf=""><br/></span><span leaf="">{                  </span><span leaf=""><br/></span><span leaf="">vt_vmm_injectinterruption(_vt_interruption_type::_vt_interruption_hardwareexception, _vt_interruption_vector::_vt_intteruptionvec_debugexception, false, error_code);                  </span><span leaf=""><br/></span><span leaf="">DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, &#34;vt_vmm_handle_DB_exception\n&#34;);                  </span><span leaf=""><br/></span><span leaf="">}                  </span><span leaf=""><br/></span><span leaf="">}</span></span><o:page></o:page></p></td></tr></tbody></table><p style="margin-top:19.0pt;margin-bottom:7.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:1;"><span style="mso-bookmark:heading_16;"><span style="font-size:18.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">运行效果：</span></span></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">我们加载驱动后，打开x64dbg，并开始调试任意exe，我们在代码中，接到#DB异常时，打印了一条GetInt，在vmcall恢复的时候，打印了一条vt_vmm_handle_DB_exception，我们在x64dbg下执行两次单步后，发现windbg中日志已经可以正常打印了，切x64dbg下一切正常，没有任何的调试问题，我们再执行两次，发现rcx也是没有被变动的，证明，本次代码改动已经完成了</span></span><o:page></o:page></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:center;margin-left:0.0pt;line-height:120%;"><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"><span leaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.5021186440677966" data-w="1416" style="width:552.010009765625px;height:277.0px;" src="https://wechat2rss.xlab.app/img-proxy/?k=bb4c37c3&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1woCcbOsjVP8TUoxvFt49mPoju3fnNXa2Uo4M5LWt6fKIFHkLlA2QG45KT9jwpUG4ES7tcHQQ7N6FewqbicTD1A5PTnGqH4sGybeRebcIdaA%2F640%3Fwx_fmt%3Dpng"/></span></span></p><p style="margin-top:19.0pt;margin-bottom:7.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:1;"><span style="mso-bookmark:heading_17;"><span style="font-size:18.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">工程代码：</span></span></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf=""><a href="https://git.key08.com/CrazyHarb/VirtualizeDBG" target="_blank">https://git.key08.com/CrazyHarb/VirtualizeDBG</a> v0.0.2</span></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;"><o:page></o:page></p><p style="display: none;"><mp-style-type data-value="3"></mp-style-type></p>



<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=87d4d6e5&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzkyOTc0NDY2Nw%3D%3D%26mid%3D2247485990%26idx%3D1%26sn%3D8b48a6c24677302fcddab9fd4dfdea46">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Sun, 29 Mar 2026 10:01:00 +0800</pubDate>
    </item>
    <item>
      <title>从0开始开发VT调试器（一）</title>
      <link>https://mp.weixin.qq.com/s?__biz=MzkyOTc0NDY2Nw==&amp;mid=2247485989&amp;idx=1&amp;sn=244f30b755ffa00e6cfcd7898c9a81d9</link>
      <description>从0开始开发VT调试器（一）背景：      这个项目其实很早就想写了，但一直没有机会，最近忙里偷闲赶紧写一下</description>
      <content:encoded><![CDATA[<p>原创 <span>CrazyHarb</span> <span>2026-03-28 10:01</span> <span style="display: inline-block;">北京</span></p>






  
  <p><img src="https://wechat2rss.xlab.app/img-proxy/?k=fd27963d&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2F1woCcbOsjVN2qGhqqick9C4Sicj2aGqy7FlKFicLiaO5MVC7npUIutpy82xGbDcjzzg3co85H2Endh5lR6lVKQOLt0AHJPAMl33lfGlBQm4MicP4%2F0%3Fwx_fmt%3Djpeg"/></p>
  <p>从0开始开发VT调试器（一）背景：      这个项目其实很早就想写了，但一直没有机会，最近忙里偷闲赶紧写一下</p>
  <p style="margin-top:24.0pt;margin-bottom:24.0pt;margin-left:0.0pt;line-height:120%;"><span style="font-size:26.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">从0开始开发VT调试器（一）</span></span></p><p style="margin-top:19.0pt;margin-bottom:7.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:1;"><span style="mso-bookmark:heading_0;"><span style="font-size:18.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">背景：</span></span></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">这个项目其实很早就想写了，但一直没有机会，最近忙里偷闲赶紧写一下，目前相关的中文资料不多，所以也当记录一下，避免未来自己也遗忘了。本文</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">不会</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">完成一个完全可用的调试器，仅做技术验证VT调试的链路不会涉及EPT等其他功能，及抛砖引玉供大家讨论，内容有瑕疵的地方，请帮忙指出。</span></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">既然是VT调试器，那么必然少不了虚拟化相关的代码，我们就先从虚拟化开始吧！之前已经有相关的资料如何进入虚拟化，各位可以先参考一下下面的参考资料</span></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf=""><a href="https://mp.weixin.qq.com/s/PVIkx0FDnZzo5idM3-NSSg" target="_blank">https://mp.weixin.qq.com/s/PVIkx0FDnZzo5idM3-NSSg</a> (huoji:《国庆专题: 深度了解”核晶“的工作原理并且手动实现一个自己的&#34;核晶&#34;》)</span></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf=""><a href="https://mp.weixin.qq.com/s/nIovO0W8QW2YemZ5HCYkQg" target="_blank">https://mp.weixin.qq.com/s/nIovO0W8QW2YemZ5HCYkQg</a> (手工编写linux下的intel虚拟化驱动)</span></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf=""><a href="https://mp.weixin.qq.com/s/mowc1iUJ1F2QghdyWgrrjw" target="_blank">https://mp.weixin.qq.com/s/mowc1iUJ1F2QghdyWgrrjw</a> (手工编写linux下的intel虚拟化驱动(二))</span></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf=""><a href="https://mp.weixin.qq.com/s/a39NgPrKgk2wQNMD8nj5YA" target="_blank">https://mp.weixin.qq.com/s/a39NgPrKgk2wQNMD8nj5YA</a> (INTEL CPU虚拟化特性研究&amp;初探 (三))</span></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf=""><a href="https://github.com/CrazyHarb/VmxProject" target="_blank">https://github.com/CrazyHarb/VmxProject</a> (linux下简易VT源码)</span></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">接下来，在正式的代码处理前，我们本章节将对VT进行简易回顾，简单的讲一下进入VT的代码</span></span></p><p style="margin-top:19.0pt;margin-bottom:7.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:1;"><span style="mso-bookmark:heading_1;"><span style="font-size:18.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">环境配置：</span></span></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">vs2022 + WDK + vmware + windbg</span></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">这里就不再赘述了，按照网上的来就可以了，实在不行就问AI也行，我们直接进入代码编写吧</span></span><o:page></o:page></p><p style="margin-top:19.0pt;margin-bottom:7.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:1;"><span style="mso-bookmark:heading_2;"><span style="font-size:18.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">VMX环境支持检测：</span></span></span></p><p style="mso-list:l0 level1 lfo1;margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;text-indent:0.0pt;line-height:120%;"><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"><span leaf="">1</span></span><span style="font-size:11.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">Cpuid 1号功能的vmx位</span></span></p><p style="mso-list:l1 level1 lfo1;margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;text-indent:0.0pt;line-height:120%;"><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"><span leaf="">1</span></span><span style="font-size:11.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">Msr的ia32_msr_vmx_basic功能，判断memory_type</span></span></p><p style="mso-list:l2 level1 lfo1;margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;text-indent:0.0pt;line-height:120%;"><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"><span leaf="">1</span></span><span style="font-size:11.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">Msr的ia32_msr_feature_control lock位及enable_vmxon位</span></span></p><p style="mso-list:l3 level1 lfo1;margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;text-indent:0.0pt;line-height:120%;"><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"><span leaf="">1</span></span><span style="font-size:11.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">Msr ia32_msr_vmx_ept_vpid_cap功能，判断是否支持EPT</span></span></p><p style="mso-list:l4 level1 lfo1;margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;text-indent:0.0pt;line-height:120%;"><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"><span leaf="">1</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">具体的结构大家可以参考前面的文章，这就不再赘述了</span></span></p><table style="margin-left: 0.0;border: none;border-collapse: collapse;mso-table-layout-alt: fixed;mso-border-top-alt: solid #DEE0E3 0.25pt;mso-border-left-alt: solid #DEE0E3 0.25pt;mso-border-bottom-alt: solid #DEE0E3 0.25pt;mso-border-right-alt: solid #DEE0E3 0.25pt;mso-padding-alt: 0pt 5.4pt 0pt 5.4pt;width: 100%;"><tbody><tr><td data-colwidth="552" width="552" valign="top" style="background: rgb(245, 246, 247);border-width: 1pt;border-style: solid;border-color: rgb(222, 224, 227);padding: 3pt 6pt 1.5pt;"><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;color:#646A73;"><span leaf="">Java                  </span></span><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;"><span leaf="">bool set_feature_control_lockbits() {                  </span><span leaf=""><br/></span><span leaf="">for (unsigned iter = 0; iter &lt; KeQueryActiveProcessorCountEx(ALL_PROCESSOR_GROUPS); iter++) {                  </span><span leaf=""><br/></span><span leaf="">PROCESSOR_NUMBER processor_number;                  </span><span leaf=""><br/></span><span leaf="">GROUP_AFFINITY affinity, old_affinity;                  </span><span leaf=""><br/></span><span leaf="">KeGetProcessorNumberFromIndex(iter, &amp;processor_number);                  </span><span leaf=""><br/></span><span leaf="">RtlSecureZeroMemory(&amp;affinity, sizeof(GROUP_AFFINITY));                  </span><span leaf=""><br/></span><span leaf="">affinity.Group = processor_number.Group;                  </span><span leaf=""><br/></span><span leaf="">affinity.Mask = (KAFFINITY)1 &lt;&lt; processor_number.Number;                  </span><span leaf=""><br/></span><span leaf="">KeSetSystemGroupAffinityThread(&amp;affinity, &amp;old_affinity);                  </span><span leaf=""><br/></span><span leaf="">_ia32_feature_control_msr vmx_feature_control = {                  </span><span leaf=""><br/></span><span leaf="">__readmsr(ia32_msr_feature_control) };                  </span><span leaf=""><br/></span><span leaf="">if (vmx_feature_control.fields.lock == false) {                  </span><span leaf=""><br/></span><span leaf="">vmx_feature_control.fields.lock = true;                  </span><span leaf=""><br/></span><span leaf="">__writemsr(ia32_msr_feature_control,                  </span><span leaf=""><br/></span><span leaf="">vmx_feature_control.all);                  </span><span leaf=""><br/></span><span leaf="">vmx_feature_control.all =                  </span><span leaf=""><br/></span><span leaf="">__readmsr(ia32_msr_feature_control);                  </span><span leaf=""><br/></span><span leaf="">if (vmx_feature_control.fields.lock == false) {                  </span><span leaf=""><br/></span><span leaf="">DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, &#34;[VirtualizeDBG] can&#39;t set lockbit in %d \n&#34;, iter);                  </span><span leaf=""><br/></span><span leaf="">return false;                  </span><span leaf=""><br/></span><span leaf="">}                  </span><span leaf=""><br/></span><span leaf="">}                  </span><span leaf=""><br/></span><span leaf="">KeRevertToUserGroupAffinityThread(&amp;old_affinity);                  </span><span leaf=""><br/></span><span leaf="">}                  </span><span leaf=""><br/></span><span leaf="">return true;                  </span><span leaf=""><br/></span><span leaf="">}                  </span><span leaf=""><br/></span><span leaf="">bool issupportept() {                  </span><span leaf=""><br/></span><span leaf="">_ia32_vmxeptvpidcap_msr vmx_eptvpidcap_msr = {                  </span><span leaf=""><br/></span><span leaf="">__readmsr(ia32_msr_vmx_ept_vpid_cap) };                  </span><span leaf=""><br/></span><span leaf="">if (!vmx_eptvpidcap_msr.fields.support_page_walk_length4 ||                  </span><span leaf=""><br/></span><span leaf="">!vmx_eptvpidcap_msr.fields.support_write_back_memory_type ||                  </span><span leaf=""><br/></span><span leaf="">!vmx_eptvpidcap_msr.fields.support_invept ||                  </span><span leaf=""><br/></span><span leaf="">!vmx_eptvpidcap_msr.fields.support_single_context_invept ||                  </span><span leaf=""><br/></span><span leaf="">!vmx_eptvpidcap_msr.fields.support_all_context_invept ||                  </span><span leaf=""><br/></span><span leaf="">!vmx_eptvpidcap_msr.fields.support_invvpid ||                  </span><span leaf=""><br/></span><span leaf="">!vmx_eptvpidcap_msr.fields.support_individual_address_invvpid ||                  </span><span leaf=""><br/></span><span leaf="">!vmx_eptvpidcap_msr.fields.support_single_context_invvpid ||                  </span><span leaf=""><br/></span><span leaf="">!vmx_eptvpidcap_msr.fields.support_all_context_invvpid ||                  </span><span leaf=""><br/></span><span leaf="">!vmx_eptvpidcap_msr.fields.support_single_context_retaining_globals_invvpid) {                  </span><span leaf=""><br/></span><span leaf="">DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, &#34;EPT Setting: %p \n&#34;, (ULONG64)vmx_eptvpidcap_msr.all);                  </span><span leaf=""><br/></span><span leaf="">return false;                  </span><span leaf=""><br/></span><span leaf="">}                  </span><span leaf=""><br/></span><span leaf="">else {                  </span><span leaf=""><br/></span><span leaf="">return true;                  </span><span leaf=""><br/></span><span leaf="">}                  </span><span leaf=""><br/></span><span leaf="">}                  </span><span leaf=""><br/></span><span leaf="">bool checkVMXFeature() {                  </span><span leaf=""><br/></span><span leaf="">int registers[4];                  </span><span leaf=""><br/></span><span leaf="">__cpuidex(registers, 1, 0);                  </span><span leaf=""><br/></span><span leaf="">bool result = false;                  </span><span leaf=""><br/></span><span leaf="">do {                  </span><span leaf=""><br/></span><span leaf="">_vt_cpu_features cpu_features = { static_cast</span><ulong32><span leaf="">(registers[2]) };          </span><span leaf=""><br/></span><span leaf="">if (!cpu_features.fields.vmx) {          </span><span leaf=""><br/></span><span leaf="">break;          </span><span leaf=""><br/></span><span leaf="">}          </span><span leaf=""><br/></span><span leaf="">_ia32_vmbasic_msr vmx_basic_msr = { __readmsr(ia32_msr_vmx_basic) };          </span><span leaf=""><br/></span><span leaf="">if ((_ia32_memory_type)vmx_basic_msr.fields.memory_type !=          </span><span leaf=""><br/></span><span leaf="">_ia32_memory_type::write_back) {          </span><span leaf=""><br/></span><span leaf="">break;          </span><span leaf=""><br/></span><span leaf="">}          </span><span leaf=""><br/></span><span leaf="">_ia32_feature_control_msr vmx_feature_control = {          </span><span leaf=""><br/></span><span leaf="">__readmsr(ia32_msr_feature_control) };          </span><span leaf=""><br/></span><span leaf="">if (!vmx_feature_control.fields.lock) {          </span><span leaf=""><br/></span><span leaf="">bool status = set_feature_control_lockbits();          </span><span leaf=""><br/></span><span leaf="">if (!status) {          </span><span leaf=""><br/></span><span leaf="">break;          </span><span leaf=""><br/></span><span leaf="">}          </span><span leaf=""><br/></span><span leaf="">}          </span><span leaf=""><br/></span><span leaf="">if (!vmx_feature_control.fields.enable_vmxon) {          </span><span leaf=""><br/></span><span leaf="">break;          </span><span leaf=""><br/></span><span leaf="">}          </span><span leaf=""><br/></span><span leaf="">if (!issupportept()) {          </span><span leaf=""><br/></span><span leaf="">break;          </span><span leaf=""><br/></span><span leaf="">}          </span><span leaf=""><br/></span><span leaf="">result = true;          </span><span leaf=""><br/></span><span leaf="">} while (false);          </span><span leaf=""><br/></span><span leaf="">return result;          </span><span leaf=""><br/></span><span leaf="">}</span></ulong32></span><o:page></o:page></p></td></tr></tbody></table><p style="margin-top:19.0pt;margin-bottom:7.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:1;"><span style="mso-bookmark:heading_3;"><span style="font-size:18.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">虚拟化环境初始化：</span></span></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">在进入虚拟化之前，我们需要对vmcs进行初始化，配置host、guest环境后再进入host</span></span></p><p style="margin-top:16.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:2;"><span style="mso-bookmark:heading_4;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;color:#3370FF;"><span leaf="">1. </span></span></span><span style="mso-bookmark:heading_4;"><span style="font-size:16.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">首先我们开启vmx的Crx标志位</span></span></span></p><table style="margin-left: 0.0;border: none;border-collapse: collapse;mso-table-layout-alt: fixed;mso-border-top-alt: solid #DEE0E3 0.25pt;mso-border-left-alt: solid #DEE0E3 0.25pt;mso-border-bottom-alt: solid #DEE0E3 0.25pt;mso-border-right-alt: solid #DEE0E3 0.25pt;mso-padding-alt: 0pt 5.4pt 0pt 5.4pt;width: 100%;"><tbody><tr><td data-colwidth="552" width="552" valign="top" style="background: rgb(245, 246, 247);border-width: 1pt;border-style: solid;border-color: rgb(222, 224, 227);padding: 3pt 6pt 1.5pt;"><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;color:#646A73;"><span leaf="">C++                  </span></span><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;"><span leaf="">void enable_vmx() {                  </span><span leaf=""><br/></span><span leaf="">uintptr_t cr0 = __readcr0();                  </span><span leaf=""><br/></span><span leaf="">uintptr_t cr4 = __readcr4();                  </span><span leaf=""><br/></span><span leaf="">cr0 |= __readmsr(ia32_msr_vmx_cr0_fixed0);                  </span><span leaf=""><br/></span><span leaf="">cr0 &amp;= __readmsr(ia32_msr_vmx_cr0_fixed1);                  </span><span leaf=""><br/></span><span leaf="">cr4 |= __readmsr(ia32_msr_vmx_cr4_fixed0);                  </span><span leaf=""><br/></span><span leaf="">cr4 &amp;= __readmsr(ia32_msr_vmx_cr4_fixed1);                  </span><span leaf=""><br/></span><span leaf="">__writecr0(cr0);                  </span><span leaf=""><br/></span><span leaf="">__writecr4(cr4);                  </span><span leaf=""><br/></span><span leaf="">}</span></span></p></td></tr></tbody></table><p style="margin-top:16.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:2;"><span style="mso-bookmark:heading_5;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;color:#3370FF;"><span leaf="">2. </span></span></span><span style="mso-bookmark:heading_5;"><span style="font-size:16.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">分配栈、vmcs、vmxon空间</span></span></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">栈空间我们定义为0x6000大小，剩下两个定义为0x1000，并对头写入标志位即可，栈空间主要是为了我们进入host时，供CPU使用</span></span></p><table style="margin-left: 0.0;border: none;border-collapse: collapse;mso-table-layout-alt: fixed;mso-border-top-alt: solid #DEE0E3 0.25pt;mso-border-left-alt: solid #DEE0E3 0.25pt;mso-border-bottom-alt: solid #DEE0E3 0.25pt;mso-border-right-alt: solid #DEE0E3 0.25pt;mso-padding-alt: 0pt 5.4pt 0pt 5.4pt;width: 100%;"><tbody><tr><td data-colwidth="552" width="552" valign="top" style="background: rgb(245, 246, 247);border-width: 1pt;border-style: solid;border-color: rgb(222, 224, 227);padding: 3pt 6pt 1.5pt;"><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;color:#646A73;"><span leaf="">C++                  </span></span><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;"><span leaf="">void init_vmxon(_vt_vcpu_context* vcpu) {                  </span><span leaf=""><br/></span><span leaf="">_ia32_vmbasic_msr vmx_basic = {                  </span><span leaf=""><br/></span><span leaf="">__readmsr(ia32_msr_vmx_basic) };                  </span><span leaf=""><br/></span><span leaf="">PHYSICAL_ADDRESS phys = { 0 };                  </span><span leaf=""><br/></span><span leaf="">phys.QuadPart = ~0ULL;                  </span><span leaf=""><br/></span><span leaf="">vcpu-&gt;vmxon = (__vt_vmcs_t*)MmAllocateContiguousMemory(PAGE_SIZE, phys);                  </span><span leaf=""><br/></span><span leaf="">RtlZeroMemory(vcpu-&gt;vmxon, PAGE_SIZE);                  </span><span leaf=""><br/></span><span leaf="">auto mmPhyAddress = MmGetPhysicalAddress((PVOID)vcpu-&gt;vmxon);                  </span><span leaf=""><br/></span><span leaf="">vcpu-&gt;vmxon_physical = mmPhyAddress.QuadPart;                  </span><span leaf=""><br/></span><span leaf="">if (!vcpu-&gt;vmxon_physical) {                  </span><span leaf=""><br/></span><span leaf="">return;                  </span><span leaf=""><br/></span><span leaf="">}                  </span><span leaf=""><br/></span><span leaf="">vcpu-&gt;vmxon-&gt;header.all = vmx_basic.fields.revision_identifier;                  </span><span leaf=""><br/></span><span leaf="">// function                  </span><span leaf=""><br/></span><span leaf="">if (__vmx_on((unsigned long long*) &amp; vcpu-&gt;vmxon_physical)) {                  </span><span leaf=""><br/></span><span leaf="">}                  </span><span leaf=""><br/></span><span leaf="">}                  </span><span leaf=""><br/></span><span leaf="">void init_vmxcs(_vt_vcpu_context* vcpu) {                  </span><span leaf=""><br/></span><span leaf="">_ia32_vmbasic_msr vmx_basic = {                  </span><span leaf=""><br/></span><span leaf="">__readmsr(ia32_msr_vmx_basic) };                  </span><span leaf=""><br/></span><span leaf="">PHYSICAL_ADDRESS phys = { 0 };                  </span><span leaf=""><br/></span><span leaf="">phys.QuadPart = ~0ULL;                  </span><span leaf=""><br/></span><span leaf="">vcpu-&gt;vmcs = (__vt_vmcs_t*)MmAllocateContiguousMemory(PAGE_SIZE, phys);                  </span><span leaf=""><br/></span><span leaf="">RtlZeroMemory(vcpu-&gt;vmcs, PAGE_SIZE);                  </span><span leaf=""><br/></span><span leaf="">vcpu-&gt;stack = (void*)MmAllocateContiguousMemory(kernel_stack_szie, phys);                  </span><span leaf=""><br/></span><span leaf="">auto mmPhyAddress = MmGetPhysicalAddress((PVOID)vcpu-&gt;vmcs);                  </span><span leaf=""><br/></span><span leaf="">vcpu-&gt;vmcs_physical = mmPhyAddress.QuadPart;                  </span><span leaf=""><br/></span><span leaf="">vcpu-&gt;vmcs-&gt;header.all = vmx_basic.fields.revision_identifier;                  </span><span leaf=""><br/></span><span leaf="">if (__vmx_vmclear((unsigned long long*) &amp; vcpu-&gt;vmcs_physical)) {                  </span><span leaf=""><br/></span><span leaf="">return;                  </span><span leaf=""><br/></span><span leaf="">}                  </span><span leaf=""><br/></span><span leaf="">if (__vmx_vmptrld((unsigned long long*) &amp; vcpu-&gt;vmcs_physical)) {                  </span><span leaf=""><br/></span><span leaf="">return;                  </span><span leaf=""><br/></span><span leaf="">}                  </span><span leaf=""><br/></span><span leaf="">return;                  </span><span leaf=""><br/></span><span leaf="">}</span></span></p></td></tr></tbody></table><p style="margin-top:16.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:2;"><span style="mso-bookmark:heading_6;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;color:#3370FF;"><span leaf="">3. </span></span></span><span style="mso-bookmark:heading_6;"><span style="font-size:16.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">初始化vmcs内容</span></span></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">这里简单讲一下主要就是将vmcs中的数据进行填入，包括guest和host，我们直接上代码，由于篇幅有限，这里不再展开各个字段的含义，如果有需要进一步了解，可以参考上面的几个链接，或者intel手册</span></span></p><table style="margin-left: 0.0;border: none;border-collapse: collapse;mso-table-layout-alt: fixed;mso-border-top-alt: solid #DEE0E3 0.25pt;mso-border-left-alt: solid #DEE0E3 0.25pt;mso-border-bottom-alt: solid #DEE0E3 0.25pt;mso-border-right-alt: solid #DEE0E3 0.25pt;mso-padding-alt: 0pt 5.4pt 0pt 5.4pt;width: 100%;"><tbody><tr><td data-colwidth="552" width="552" valign="top" style="background: rgb(245, 246, 247);border-width: 1pt;border-style: solid;border-color: rgb(222, 224, 227);padding: 3pt 6pt 1.5pt;"><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;color:#646A73;"><span leaf="">C++                  </span></span><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;"><span leaf="">void setup_vmcs(uintptr_t guest_stack_pointer, uintptr_t guest_instruction_pointer, _vt_vcpu_context* vcpu) {                  </span><span leaf=""><br/></span><span leaf="">__pseudo_descriptor_64_t gdtr, idtr;                  </span><span leaf=""><br/></span><span leaf="">_sgdt(&amp;gdtr);                  </span><span leaf=""><br/></span><span leaf="">__sidt(&amp;idtr);                  </span><span leaf=""><br/></span><span leaf="">//asm_lidt(&amp;vcpu-&gt;idtr);                  </span><span leaf=""><br/></span><span leaf="">_ia32_vmbasic_msr vmx_basic_msr = {                  </span><span leaf=""><br/></span><span leaf="">__readmsr(ia32_msr_vmx_basic) };                  </span><span leaf=""><br/></span><span leaf="">ULONG use_true_msrs = vmx_basic_msr.fields.vmx_capability_hint;                  </span><span leaf=""><br/></span><span leaf="">_ia32_vmx_vmentry_controls vm_entryctl_requested = { 0 };                  </span><span leaf=""><br/></span><span leaf="">//vm_entryctl_requested.fields.load_debug_controls = true;                  </span><span leaf=""><br/></span><span leaf="">vm_entryctl_requested.fields.ia32e_mode_guest = true;                  </span><span leaf=""><br/></span><span leaf="">_ia32_vmx_vmentry_controls vm_entryctl;                  </span><span leaf=""><br/></span><span leaf="">vm_entryctl.all = vmx_adjust_controlvalue(                  </span><span leaf=""><br/></span><span leaf="">use_true_msrs ? ia32_msr_vmx_true_entry_ctrl : ia32_msr_vmx_entry_ctrl,                  </span><span leaf=""><br/></span><span leaf="">vm_entryctl_requested.all);                  </span><span leaf=""><br/></span><span leaf="">_ia32_vmx_vmexit_controls vm_exitctl_requested = { 0 };                  </span><span leaf=""><br/></span><span leaf="">vm_exitctl_requested.fields.host_address_space_size = true;                  </span><span leaf=""><br/></span><span leaf="">_ia32_vmx_vmexit_controls vm_exitctl;                  </span><span leaf=""><br/></span><span leaf="">vm_exitctl.all = vmx_adjust_controlvalue(                  </span><span leaf=""><br/></span><span leaf="">use_true_msrs ? ia32_msr_vmx_true_exit_ctrl : ia32_msr_vmx_exit_ctrl,                  </span><span leaf=""><br/></span><span leaf="">vm_exitctl_requested.all);                  </span><span leaf=""><br/></span><span leaf="">_ia32_vmx_pinbased_controls vm_pinctl_requested = { 0 };                  </span><span leaf=""><br/></span><span leaf="">// vm_pinctl_requested.fields.nmi_exiting = true;                  </span><span leaf=""><br/></span><span leaf="">// vm_pinctl_requested.fields.virtual_nmis = true;                  </span><span leaf=""><br/></span><span leaf="">_ia32_vmx_pinbased_controls vm_pinctl = {                  </span><span leaf=""><br/></span><span leaf="">vmx_adjust_controlvalue(use_true_msrs ? ia32_msr_vmx_true_pinbased_ctrl                  </span><span leaf=""><br/></span><span leaf="">: ia32_msr_vmx_pinbased_ctrl,                  </span><span leaf=""><br/></span><span leaf="">vm_pinctl_requested.all) };                  </span><span leaf=""><br/></span><span leaf="">_ia32_vmx_processorbased_controls vm_procctl_requested = { 0 };                  </span><span leaf=""><br/></span><span leaf="">//vm_procctl_requested.fields.cr3_load_exiting = true;                  </span><span leaf=""><br/></span><span leaf="">vm_procctl_requested.fields.rdtsc_exiting = false;                  </span><span leaf=""><br/></span><span leaf="">vm_procctl_requested.fields.use_tsc_offseting = true;                  </span><span leaf=""><br/></span><span leaf="">vm_procctl_requested.fields.mov_dr_exiting = false;                  </span><span leaf=""><br/></span><span leaf="">vm_procctl_requested.fields.use_io_bitmaps = false;                  </span><span leaf=""><br/></span><span leaf="">vm_procctl_requested.fields.use_msr_bitmaps = false;                  </span><span leaf=""><br/></span><span leaf="">vm_procctl_requested.fields.activate_secondary_control = true;                  </span><span leaf=""><br/></span><span leaf="">// initialize time offset.                  </span><span leaf=""><br/></span><span leaf="">__vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_tscoffset, 0);                  </span><span leaf=""><br/></span><span leaf="">__vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_tscoffsethigh, 0);                  </span><span leaf=""><br/></span><span leaf="">_ia32_vmx_processorbased_controls vmx_procctl;                  </span><span leaf=""><br/></span><span leaf="">vmx_procctl.all =                  </span><span leaf=""><br/></span><span leaf="">vmx_adjust_controlvalue(use_true_msrs ? ia32_msr_vmx_true_priproc_ctrl                  </span><span leaf=""><br/></span><span leaf="">: ia32_msr_vmx_priproc_ctrl,                  </span><span leaf=""><br/></span><span leaf="">vm_procctl_requested.all);                  </span><span leaf=""><br/></span><span leaf="">_ia32_vmx_secondaryprocessorbased_controls vm_procctls2_requested = { 0 };                  </span><span leaf=""><br/></span><span leaf="">vm_procctls2_requested.fields.enable_rdtscp = true;                  </span><span leaf=""><br/></span><span leaf="">vm_procctls2_requested.fields.enable_invpcid = true;                  </span><span leaf=""><br/></span><span leaf="">vm_procctls2_requested.fields.enable_vpid = true;                  </span><span leaf=""><br/></span><span leaf="">vm_procctls2_requested.fields.enable_xsaves_xstors = true;                  </span><span leaf=""><br/></span><span leaf="">_ia32_vmx_secondaryprocessorbased_controls vm_procctls2;                  </span><span leaf=""><br/></span><span leaf="">vm_procctls2.all = vmx_adjust_controlvalue(ia32_msr_vmx_2ndproc_ctrl,                  </span><span leaf=""><br/></span><span leaf="">vm_procctls2_requested.all);                  </span><span leaf=""><br/></span><span leaf="">uintptr_t exception_bitmap = 0;                  </span><span leaf=""><br/></span><span leaf="">uintptr_t cr0_mask = 0;                  </span><span leaf=""><br/></span><span leaf="">uintptr_t cr0_shadow = __readcr0();                  </span><span leaf=""><br/></span><span leaf="">uintptr_t cr4_mask = 0;                  </span><span leaf=""><br/></span><span leaf="">uintptr_t cr4_shadow = __readcr4();                  </span><span leaf=""><br/></span><span leaf="">uintptr_t nerror =                  </span><span leaf=""><br/></span><span leaf="">__vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_virtualprocessorid,                  </span><span leaf=""><br/></span><span leaf="">KeGetCurrentProcessorNumberEx(NULL) + 1);                  </span><span leaf=""><br/></span><span leaf="">nerror |= __vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_guestesselector,                  </span><span leaf=""><br/></span><span leaf="">asm_reades());                  </span><span leaf=""><br/></span><span leaf="">nerror |= __vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_guestcsselector,                  </span><span leaf=""><br/></span><span leaf="">asm_readcs());                  </span><span leaf=""><br/></span><span leaf="">nerror |= __vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_guestssselector,                  </span><span leaf=""><br/></span><span leaf="">asm_readss());                  </span><span leaf=""><br/></span><span leaf="">nerror |= __vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_guestdsselector,                  </span><span leaf=""><br/></span><span leaf="">asm_readds());                  </span><span leaf=""><br/></span><span leaf="">nerror |= __vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_guestfsselector,                  </span><span leaf=""><br/></span><span leaf="">asm_readfs());                  </span><span leaf=""><br/></span><span leaf="">nerror |= __vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_guestgsselector,                  </span><span leaf=""><br/></span><span leaf="">asm_readgs());                  </span><span leaf=""><br/></span><span leaf="">nerror |= __vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_guestldtrselector,                  </span><span leaf=""><br/></span><span leaf="">asm_readldtr());                  </span><span leaf=""><br/></span><span leaf="">nerror |= __vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_guesttrselector,                  </span><span leaf=""><br/></span><span leaf="">asm_readtr());                  </span><span leaf=""><br/></span><span leaf="">nerror |= __vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_hostesselector,                  </span><span leaf=""><br/></span><span leaf="">asm_reades() &amp; 0xf8);                  </span><span leaf=""><br/></span><span leaf="">nerror |= __vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_hostcsselector,                  </span><span leaf=""><br/></span><span leaf="">asm_readcs() &amp; 0xf8);                  </span><span leaf=""><br/></span><span leaf="">nerror |= __vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_hostssselector,                  </span><span leaf=""><br/></span><span leaf="">asm_readss() &amp; 0xf8);                  </span><span leaf=""><br/></span><span leaf="">nerror |= __vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_hostdsselector,                  </span><span leaf=""><br/></span><span leaf="">asm_readds() &amp; 0xf8);                  </span><span leaf=""><br/></span><span leaf="">nerror |= __vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_hostfsselector,                  </span><span leaf=""><br/></span><span leaf="">asm_readfs() &amp; 0xf8);                  </span><span leaf=""><br/></span><span leaf="">nerror |= __vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_hostgsselector,                  </span><span leaf=""><br/></span><span leaf="">asm_readgs() &amp; 0xf8);                  </span><span leaf=""><br/></span><span leaf="">nerror |= __vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_hosttrselector,                  </span><span leaf=""><br/></span><span leaf="">asm_readtr() &amp; 0xf8);                  </span><span leaf=""><br/></span><span leaf="">//PHYSICAL_ADDRESS phyAddress = {};                  </span><span leaf=""><br/></span><span leaf="">//nerror |= __vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_msrbitmap,                  </span><span leaf=""><br/></span><span leaf="">//(uintptr_t)MmGetVirtualForPhysical(phyAddress));                  </span><span leaf=""><br/></span><span leaf="">nerror |= __vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_vmcslinkpointer,                  </span><span leaf=""><br/></span><span leaf="">MAXULONG64);                  </span><span leaf=""><br/></span><span leaf="">_ia32_vmx_debugctl_register l_temp_debugReg = { __readmsr(ia32_msr_debug_control) };                  </span><span leaf=""><br/></span><span leaf="">l_temp_debugReg.fields.reserved1 = 0;                  </span><span leaf=""><br/></span><span leaf="">l_temp_debugReg.fields.reserved2 = 0;                  </span><span leaf=""><br/></span><span leaf="">nerror |= __vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_guestia32debugctl,                  </span><span leaf=""><br/></span><span leaf="">l_temp_debugReg.all);                  </span><span leaf=""><br/></span><span leaf="">nerror |= __vmx_vmwrite(                  </span><span leaf=""><br/></span><span leaf="">(size_t)_vt_vmcs_field::_vt_vmcs_pinbasedvmexeccontrol, vm_pinctl.all);                  </span><span leaf=""><br/></span><span leaf="">nerror |=                  </span><span leaf=""><br/></span><span leaf="">__vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_cpubasedvmexeccontrol,                  </span><span leaf=""><br/></span><span leaf="">vmx_procctl.all);                  </span><span leaf=""><br/></span><span leaf="">nerror |= __vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_exceptionbitmap,                  </span><span leaf=""><br/></span><span leaf="">exception_bitmap);                  </span><span leaf=""><br/></span><span leaf="">nerror |= __vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_vmexitcontrols,                  </span><span leaf=""><br/></span><span leaf="">vm_exitctl.all);                  </span><span leaf=""><br/></span><span leaf="">nerror |= __vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_vmentrycontrols,                  </span><span leaf=""><br/></span><span leaf="">vm_entryctl.all);                  </span><span leaf=""><br/></span><span leaf="">nerror |=                  </span><span leaf=""><br/></span><span leaf="">__vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_secondaryvmexeccontrol,                  </span><span leaf=""><br/></span><span leaf="">vm_procctls2.all);                  </span><span leaf=""><br/></span><span leaf="">nerror |= __vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_guesteslimit,                  </span><span leaf=""><br/></span><span leaf="">__segmentlimit(asm_reades()));                  </span><span leaf=""><br/></span><span leaf="">nerror |= __vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_guestdslimit,                  </span><span leaf=""><br/></span><span leaf="">__segmentlimit(asm_readds()));                  </span><span leaf=""><br/></span><span leaf="">nerror |= __vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_guestcslimit,                  </span><span leaf=""><br/></span><span leaf="">__segmentlimit(asm_readcs()));                  </span><span leaf=""><br/></span><span leaf="">nerror |= __vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_guestsslimit,                  </span><span leaf=""><br/></span><span leaf="">__segmentlimit(asm_readss()));                  </span><span leaf=""><br/></span><span leaf="">nerror |= __vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_guestfslimit,                  </span><span leaf=""><br/></span><span leaf="">__segmentlimit(asm_readfs()));                  </span><span leaf=""><br/></span><span leaf="">nerror |= __vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_guestgslimit,                  </span><span leaf=""><br/></span><span leaf="">__segmentlimit(asm_readgs()));                  </span><span leaf=""><br/></span><span leaf="">nerror |= __vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_guestldtrlimit,                  </span><span leaf=""><br/></span><span leaf="">__segmentlimit(asm_readldtr()));                  </span><span leaf=""><br/></span><span leaf="">nerror |= __vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_guesttrlimit,                  </span><span leaf=""><br/></span><span leaf="">__segmentlimit(asm_readtr()));                  </span><span leaf=""><br/></span><span leaf="">// uintptr_t nerror |= __vmx_vmwrite(_vt_vmcs_field::, function::);                  </span><span leaf=""><br/></span><span leaf="">nerror |= __vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_guestgdtrlimit,                  </span><span leaf=""><br/></span><span leaf="">gdtr.limit);                  </span><span leaf=""><br/></span><span leaf="">nerror |= __vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_guestidtrlimit,                  </span><span leaf=""><br/></span><span leaf="">idtr.limit);                  </span><span leaf=""><br/></span><span leaf="">nerror |= __vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_guestesarbytes,                  </span><span leaf=""><br/></span><span leaf="">vmx_getsegment_accessright(asm_reades()));                  </span><span leaf=""><br/></span><span leaf="">nerror |= __vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_guestcsarbytes,                  </span><span leaf=""><br/></span><span leaf="">vmx_getsegment_accessright(asm_readcs()));                  </span><span leaf=""><br/></span><span leaf="">nerror |= __vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_guestssarbytes,                  </span><span leaf=""><br/></span><span leaf="">vmx_getsegment_accessright(asm_readss()));                  </span><span leaf=""><br/></span><span leaf="">nerror |= __vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_guestdsarbytes,                  </span><span leaf=""><br/></span><span leaf="">vmx_getsegment_accessright(asm_readds()));                  </span><span leaf=""><br/></span><span leaf="">nerror |= __vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_guestfsarbytes,                  </span><span leaf=""><br/></span><span leaf="">vmx_getsegment_accessright(asm_readfs()));                  </span><span leaf=""><br/></span><span leaf="">nerror |= __vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_guestgsarbytes,                  </span><span leaf=""><br/></span><span leaf="">vmx_getsegment_accessright(asm_readgs()));                  </span><span leaf=""><br/></span><span leaf="">nerror |= __vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_guestldtrarbytes,                  </span><span leaf=""><br/></span><span leaf="">vmx_getsegment_accessright(asm_readldtr()));                  </span><span leaf=""><br/></span><span leaf="">nerror |= __vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_guesttrarbytes,                  </span><span leaf=""><br/></span><span leaf="">vmx_getsegment_accessright(asm_readtr()));                  </span><span leaf=""><br/></span><span leaf="">nerror |=                  </span><span leaf=""><br/></span><span leaf="">__vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_guestsysentercs,                  </span><span leaf=""><br/></span><span leaf="">__readmsr(                  </span><span leaf=""><br/></span><span leaf="">(unsigned long)_vt_msr_value::_vt_msr_sysentercs));                  </span><span leaf=""><br/></span><span leaf="">nerror |=                  </span><span leaf=""><br/></span><span leaf="">__vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_hostia32sysentercs,                  </span><span leaf=""><br/></span><span leaf="">__readmsr(                  </span><span leaf=""><br/></span><span leaf="">(unsigned long)_vt_msr_value::_vt_msr_sysentercs));                  </span><span leaf=""><br/></span><span leaf="">nerror |= __vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_cr0guesthostmask,                  </span><span leaf=""><br/></span><span leaf="">cr0_mask);                  </span><span leaf=""><br/></span><span leaf="">nerror |= __vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_cr4guesthostmask,                  </span><span leaf=""><br/></span><span leaf="">cr4_mask);                  </span><span leaf=""><br/></span><span leaf="">nerror |= __vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_cr0readshadow,                  </span><span leaf=""><br/></span><span leaf="">cr0_shadow);                  </span><span leaf=""><br/></span><span leaf="">nerror |= __vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_cr4readshadow,                  </span><span leaf=""><br/></span><span leaf="">cr4_shadow);                  </span><span leaf=""><br/></span><span leaf="">nerror |= __vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_guestcr0,                  </span><span leaf=""><br/></span><span leaf="">__readcr0());                  </span><span leaf=""><br/></span><span leaf="">nerror |= __vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_guestcr3,                  </span><span leaf=""><br/></span><span leaf="">__readcr3());                  </span><span leaf=""><br/></span><span leaf="">nerror |= __vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_guestcr4,                  </span><span leaf=""><br/></span><span leaf="">__readcr4());                  </span><span leaf=""><br/></span><span leaf="">nerror |= __vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_guestesbase, 0);                  </span><span leaf=""><br/></span><span leaf="">nerror |= __vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_guestcsbase, 0);                  </span><span leaf=""><br/></span><span leaf="">nerror |= __vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_guestssbase, 0);                  </span><span leaf=""><br/></span><span leaf="">nerror |= __vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_guestdsbase, 0);                  </span><span leaf=""><br/></span><span leaf="">nerror |= __vmx_vmwrite(                  </span><span leaf=""><br/></span><span leaf="">(size_t)_vt_vmcs_field::_vt_vmcs_guestfsbase,                  </span><span leaf=""><br/></span><span leaf="">__readmsr((unsigned long)_vt_msr_value::_vt_msr_fsbase));                  </span><span leaf=""><br/></span><span leaf="">nerror |= __vmx_vmwrite(                  </span><span leaf=""><br/></span><span leaf="">(size_t)_vt_vmcs_field::_vt_vmcs_guestgsbase,                  </span><span leaf=""><br/></span><span leaf="">__readmsr((unsigned long)_vt_msr_value::_vt_msr_gsbase));                  </span><span leaf=""><br/></span><span leaf="">nerror |=                  </span><span leaf=""><br/></span><span leaf="">__vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_guestldtrbase,                  </span><span leaf=""><br/></span><span leaf="">vmx_get_segmentbase(gdtr.base_address, asm_readldtr()));                  </span><span leaf=""><br/></span><span leaf="">nerror |=                  </span><span leaf=""><br/></span><span leaf="">__vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_guesttrbase,                  </span><span leaf=""><br/></span><span leaf="">vmx_get_segmentbase(gdtr.base_address, asm_readtr()));                  </span><span leaf=""><br/></span><span leaf="">nerror |= __vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_guestgdtrbase,                  </span><span leaf=""><br/></span><span leaf="">gdtr.base_address);                  </span><span leaf=""><br/></span><span leaf="">nerror |= __vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_guestidtrbase,                  </span><span leaf=""><br/></span><span leaf="">idtr.base_address);                  </span><span leaf=""><br/></span><span leaf="">nerror |=                  </span><span leaf=""><br/></span><span leaf="">__vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_guestdr7, __readdr(7));                  </span><span leaf=""><br/></span><span leaf="">ULONG_PTR rflags = __readeflags();                  </span><span leaf=""><br/></span><span leaf="">nerror |= __vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_guestrflags,                  </span><span leaf=""><br/></span><span leaf="">rflags);                  </span><span leaf=""><br/></span><span leaf="">nerror |=                  </span><span leaf=""><br/></span><span leaf="">__vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_guestsysenteresp,                  </span><span leaf=""><br/></span><span leaf="">__readmsr(                  </span><span leaf=""><br/></span><span leaf="">(unsigned long)_vt_msr_value::_vt_msr_sysenteresp));                  </span><span leaf=""><br/></span><span leaf="">nerror |=                  </span><span leaf=""><br/></span><span leaf="">__vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_guestsysentereip,                  </span><span leaf=""><br/></span><span leaf="">__readmsr(                  </span><span leaf=""><br/></span><span leaf="">(unsigned long)_vt_msr_value::_vt_msr_sysentereip));                  </span><span leaf=""><br/></span><span leaf="">nerror |= __vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_hostcr0,                  </span><span leaf=""><br/></span><span leaf="">__readcr0());                  </span><span leaf=""><br/></span><span leaf="">nerror |= __vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_hostcr3,                  </span><span leaf=""><br/></span><span leaf="">__readcr3());                  </span><span leaf=""><br/></span><span leaf="">nerror |= __vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_hostcr4,                  </span><span leaf=""><br/></span><span leaf="">__readcr4());                  </span><span leaf=""><br/></span><span leaf="">nerror |= __vmx_vmwrite(                  </span><span leaf=""><br/></span><span leaf="">(size_t)_vt_vmcs_field::_vt_vmcs_hostfsbase,                  </span><span leaf=""><br/></span><span leaf="">__readmsr((unsigned long)_vt_msr_value::_vt_msr_fsbase));                  </span><span leaf=""><br/></span><span leaf="">nerror |= __vmx_vmwrite(                  </span><span leaf=""><br/></span><span leaf="">(size_t)_vt_vmcs_field::_vt_vmcs_hostgsbase,                  </span><span leaf=""><br/></span><span leaf="">__readmsr((unsigned long)_vt_msr_value::_vt_msr_gsbase));                  </span><span leaf=""><br/></span><span leaf="">nerror |=                  </span><span leaf=""><br/></span><span leaf="">__vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_hosttrbase,                  </span><span leaf=""><br/></span><span leaf="">vmx_get_segmentbase(gdtr.base_address, asm_readtr()));                  </span><span leaf=""><br/></span><span leaf="">nerror |= __vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_hostgdtrbase,                  </span><span leaf=""><br/></span><span leaf="">gdtr.base_address);                  </span><span leaf=""><br/></span><span leaf="">nerror |= __vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_hostidtrbase,                  </span><span leaf=""><br/></span><span leaf="">idtr.base_address);                  </span><span leaf=""><br/></span><span leaf="">nerror |=                  </span><span leaf=""><br/></span><span leaf="">__vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_hostia32sysenteresp,                  </span><span leaf=""><br/></span><span leaf="">__readmsr(                  </span><span leaf=""><br/></span><span leaf="">(unsigned long)_vt_msr_value::_vt_msr_sysenteresp));                  </span><span leaf=""><br/></span><span leaf="">nerror |=                  </span><span leaf=""><br/></span><span leaf="">__vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_hostia32sysentereip,                  </span><span leaf=""><br/></span><span leaf="">__readmsr(                  </span><span leaf=""><br/></span><span leaf="">(unsigned long)_vt_msr_value::_vt_msr_sysentereip));                  </span><span leaf=""><br/></span><span leaf="">uintptr_t vmm_stack_region_base = (uintptr_t)(vcpu-&gt;stack) + kernel_stack_szie;                  </span><span leaf=""><br/></span><span leaf="">uintptr_t vmm_stack_data = (uintptr_t)(vmm_stack_region_base)-sizeof(void*);                  </span><span leaf=""><br/></span><span leaf="">*(_vt_vcpu_context**)vmm_stack_data = vcpu;                  </span><span leaf=""><br/></span><span leaf="">ULONG_PTR vmm_stack_base = vmm_stack_region_base - sizeof(_vt_vcpu_context*) - sizeof(_result_registers);                  </span><span leaf=""><br/></span><span leaf="">//nerror |= __vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_eptpointer, 0);                  </span><span leaf=""><br/></span><span leaf="">nerror |= __vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_hostrsp, vmm_stack_base);                  </span><span leaf=""><br/></span><span leaf="">nerror |= __vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_hostrip, (size_t)asm_vmmentrypoint);                  </span><span leaf=""><br/></span><span leaf="">nerror |= __vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_guestrsp, guest_stack_pointer);                  </span><span leaf=""><br/></span><span leaf="">nerror |= __vmx_vmwrite((size_t)_vt_vmcs_field::_vt_vmcs_guestrip, guest_instruction_pointer);                  </span><span leaf=""><br/></span><span leaf="">__vmx_vmlaunch();                  </span><span leaf=""><br/></span><span leaf="">}                  </span><span leaf=""><br/></span></span></p></td></tr></tbody></table><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">这里，我们只简单讲解最后几行的代码，其他的设置可以参考上面的文章引用，有更详细的解释，我们设置了hostrsp、hostrip、guestrsp、guestrip，并执行vmlaunch，当代码正常运行时，我们的cpu会自动进入guest模式，再guestrip处开始执行，如果cpu触发了某些vt的事件导致退出，那么会导致cpu进入host模式，并执行hostrip处的代码</span></span></p><p style="margin-top:19.0pt;margin-bottom:7.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:1;"><span style="mso-bookmark:heading_7;"><span style="font-size:18.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">VT Host的handler处理：</span></span></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">为了压缩篇幅，我们将尽可能的减少功能的实现，除非一些&#34;必不可少的功能&#34;，例如，我们需要实现cpuid、msr、nmi、vmx指令的处理，其余的暂时不涉及</span></span></p><p style="margin-top:16.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:2;"><span style="mso-bookmark:heading_8;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;color:#3370FF;"><span leaf="">1. </span></span></span><span style="mso-bookmark:heading_8;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">NMI</span></span></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">针对NMI，我们选择直接注入到guest的方式进行，但需要注意的是，不需要挪动guest环境中的RIP</span></span></p><table style="margin-left: 0.0;border: none;border-collapse: collapse;mso-table-layout-alt: fixed;mso-border-top-alt: solid #DEE0E3 0.25pt;mso-border-left-alt: solid #DEE0E3 0.25pt;mso-border-bottom-alt: solid #DEE0E3 0.25pt;mso-border-right-alt: solid #DEE0E3 0.25pt;mso-padding-alt: 0pt 5.4pt 0pt 5.4pt;width: 100%;"><tbody><tr><td data-colwidth="552" width="552" valign="top" style="background: rgb(245, 246, 247);border-width: 1pt;border-style: solid;border-color: rgb(222, 224, 227);padding: 3pt 6pt 1.5pt;"><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;color:#646A73;"><span leaf="">C++                  </span></span><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;"><span leaf="">void vt_vmm_handleexception(_vt_vmhandle_guestcontext* guest_context) {                  </span><span leaf=""><br/></span><span leaf="">size_t exit_exception_value = 0;                  </span><span leaf=""><br/></span><span leaf="">__vmx_vmread((size_t)_vt_vmcs_field::_vt_vmcs_vmexitintrinfo, &amp;exit_exception_value);                  </span><span leaf=""><br/></span><span leaf="">const _vt_vmexit_interruptioninformationfield exception = { exit_exception_value };                  </span><span leaf=""><br/></span><span leaf="">const _vt_interruption_type interruption_type = (_vt_interruption_type)(exception.fields.interruption_type);                  </span><span leaf=""><br/></span><span leaf="">const _vt_interruption_vector vector = (_vt_interruption_vector)(exception.fields.vector);                  </span><span leaf=""><br/></span><span leaf="">ULONG_PTR guest_inst_length;                  </span><span leaf=""><br/></span><span leaf="">__vmx_vmread((ULONG_PTR)_vt_vmcs_field::_vt_vmcs_vmexitinstructionlen, &amp;guest_inst_length);                  </span><span leaf=""><br/></span><span leaf="">ULONG_PTR error_code = 0;                  </span><span leaf=""><br/></span><span leaf="">__vmx_vmread((ULONG32)_vt_vmcs_field::_vt_vmcs_vmexitintrerrorcode, &amp;error_code);                  </span><span leaf=""><br/></span><span leaf="">vt_vmm_injectinterruption(interruption_type, vector, exception.fields.error_code_valid, error_code);                  </span><span leaf=""><br/></span><span leaf="">__vmx_vmwrite((ULONG32)_vt_vmcs_field::_vt_vmcs_vmentryinstructionlen, guest_inst_length);                  </span><span leaf=""><br/></span><span leaf="">}</span></span></p></td></tr></tbody></table><p style="margin-top:16.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:2;"><span style="mso-bookmark:heading_9;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;color:#3370FF;"><span leaf="">2. </span></span></span><span style="mso-bookmark:heading_9;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">Cpuid</span></span></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">针对CPUID，我们直接通过调用CPUID，将返回值直接进行写入的方式进行处理，尽管这种处理是存在漏洞的，但本次的完成目标不涉及这块</span></span></p><table style="margin-left: 0.0;border: none;border-collapse: collapse;mso-table-layout-alt: fixed;mso-border-top-alt: solid #DEE0E3 0.25pt;mso-border-left-alt: solid #DEE0E3 0.25pt;mso-border-bottom-alt: solid #DEE0E3 0.25pt;mso-border-right-alt: solid #DEE0E3 0.25pt;mso-padding-alt: 0pt 5.4pt 0pt 5.4pt;width: 100%;"><tbody><tr><td data-colwidth="552" width="552" valign="top" style="background: rgb(245, 246, 247);border-width: 1pt;border-style: solid;border-color: rgb(222, 224, 227);padding: 3pt 6pt 1.5pt;"><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;color:#646A73;"><span leaf="">C++                  </span></span><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;"><span leaf="">void vt_vmm_handlecpuid(_vt_vmhandle_guestcontext* guest_context) {                  </span><span leaf=""><br/></span><span leaf="">int buf[4];                  </span><span leaf=""><br/></span><span leaf="">__cpuidex(buf, guest_context-&gt;stack-&gt;gp_regs.Rax, guest_context-&gt;stack-&gt;gp_regs.Rcx);                  </span><span leaf=""><br/></span><span leaf="">guest_context-&gt;stack-&gt;gp_regs.Rax = buf[0];                  </span><span leaf=""><br/></span><span leaf="">guest_context-&gt;stack-&gt;gp_regs.Rbx = buf[1];                  </span><span leaf=""><br/></span><span leaf="">guest_context-&gt;stack-&gt;gp_regs.Rcx = buf[2];                  </span><span leaf=""><br/></span><span leaf="">guest_context-&gt;stack-&gt;gp_regs.Rdx = buf[3];                  </span><span leaf=""><br/></span><span leaf="">guest_context-&gt;vm_movinstruction = true;                  </span><span leaf=""><br/></span><span leaf="">}</span></span></p></td></tr></tbody></table><p style="margin-top:16.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:2;"><span style="mso-bookmark:heading_10;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;color:#3370FF;"><span leaf="">3. </span></span></span><span style="mso-bookmark:heading_10;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">Msr</span></span></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">针对msr的读取和写入，我们也是采取相同的方式进行，但是得套一层异常处理，因为在读写时，可能会导致CPU抛出来异常。在针对一些特殊的msr寄存器时，我们需要用特殊的vmcs段进行代替</span></span></p><table style="margin-left: 0.0;border: none;border-collapse: collapse;mso-table-layout-alt: fixed;mso-border-top-alt: solid #DEE0E3 0.25pt;mso-border-left-alt: solid #DEE0E3 0.25pt;mso-border-bottom-alt: solid #DEE0E3 0.25pt;mso-border-right-alt: solid #DEE0E3 0.25pt;mso-padding-alt: 0pt 5.4pt 0pt 5.4pt;width: 100%;"><tbody><tr><td data-colwidth="552" width="552" valign="top" style="background: rgb(245, 246, 247);border-width: 1pt;border-style: solid;border-color: rgb(222, 224, 227);padding: 3pt 6pt 1.5pt;"><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;color:#646A73;"><span leaf="">C++                  </span></span><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;"><span leaf="">bool vt_vmm_handlemsraccess(                  </span><span leaf=""><br/></span><span leaf="">_vt_vmhandle_guestcontext* guest_context, bool read_access) {                  </span><span leaf=""><br/></span><span leaf="">const auto msr = (_vt_msr_value)(guest_context-&gt;stack-&gt;gp_regs.Rcx);                  </span><span leaf=""><br/></span><span leaf="">bool transfer_to_vmcs = false;                  </span><span leaf=""><br/></span><span leaf="">_vt_vmcs_field vmcs_field = {};                  </span><span leaf=""><br/></span><span leaf="">switch (msr) {                  </span><span leaf=""><br/></span><span leaf="">case _vt_msr_value::_vt_msr_sysentercs:                  </span><span leaf=""><br/></span><span leaf="">vmcs_field = _vt_vmcs_field::_vt_vmcs_guestsysentercs;                  </span><span leaf=""><br/></span><span leaf="">transfer_to_vmcs = true;                  </span><span leaf=""><br/></span><span leaf="">break;                  </span><span leaf=""><br/></span><span leaf="">case _vt_msr_value::_vt_msr_sysenteresp:                  </span><span leaf=""><br/></span><span leaf="">vmcs_field = _vt_vmcs_field::_vt_vmcs_guestsysenteresp;                  </span><span leaf=""><br/></span><span leaf="">transfer_to_vmcs = true;                  </span><span leaf=""><br/></span><span leaf="">break;                  </span><span leaf=""><br/></span><span leaf="">case _vt_msr_value::_vt_msr_sysentereip:                  </span><span leaf=""><br/></span><span leaf="">vmcs_field = _vt_vmcs_field::_vt_vmcs_guestsysentereip;                  </span><span leaf=""><br/></span><span leaf="">transfer_to_vmcs = true;                  </span><span leaf=""><br/></span><span leaf="">break;                  </span><span leaf=""><br/></span><span leaf="">case _vt_msr_value::_vt_msr_debugctl:                  </span><span leaf=""><br/></span><span leaf="">vmcs_field = _vt_vmcs_field::_vt_vmcs_guestia32debugctl;                  </span><span leaf=""><br/></span><span leaf="">transfer_to_vmcs = true;                  </span><span leaf=""><br/></span><span leaf="">break;                  </span><span leaf=""><br/></span><span leaf="">case _vt_msr_value::_vt_msr_gsbase:                  </span><span leaf=""><br/></span><span leaf="">vmcs_field = _vt_vmcs_field::_vt_vmcs_guestgsbase;                  </span><span leaf=""><br/></span><span leaf="">transfer_to_vmcs = true;                  </span><span leaf=""><br/></span><span leaf="">break;                  </span><span leaf=""><br/></span><span leaf="">case _vt_msr_value::_vt_msr_fsbase:                  </span><span leaf=""><br/></span><span leaf="">vmcs_field = _vt_vmcs_field::_vt_vmcs_guestfsbase;                  </span><span leaf=""><br/></span><span leaf="">transfer_to_vmcs = true;                  </span><span leaf=""><br/></span><span leaf="">break;                  </span><span leaf=""><br/></span><span leaf="">default:                  </span><span leaf=""><br/></span><span leaf="">break;                  </span><span leaf=""><br/></span><span leaf="">}                  </span><span leaf=""><br/></span><span leaf="">const auto is_64bit_vmcs = (vmcs_field &gt;= _vt_vmcs_field::_vt_vmcs_iobitmapa) &amp;&amp; (vmcs_field &lt;= _vt_vmcs_field::_vt_vmcs_hostia32perfglobalctrlhigh);                  </span><span leaf=""><br/></span><span leaf="">LARGE_INTEGER msr_value = {};                  </span><span leaf=""><br/></span><span leaf="">if (read_access) {                  </span><span leaf=""><br/></span><span leaf="">if (transfer_to_vmcs) {                  </span><span leaf=""><br/></span><span leaf="">if (is_64bit_vmcs) {                  </span><span leaf=""><br/></span><span leaf="">__vmx_vmread((ULONG32)vmcs_field, (size_t*)&amp;msr_value.QuadPart);                  </span><span leaf=""><br/></span><span leaf="">}                  </span><span leaf=""><br/></span><span leaf="">else {                  </span><span leaf=""><br/></span><span leaf="">__vmx_vmread((ULONG32)vmcs_field, (size_t*)&amp;msr_value.QuadPart);                  </span><span leaf=""><br/></span><span leaf="">}                  </span><span leaf=""><br/></span><span leaf="">}                  </span><span leaf=""><br/></span><span leaf="">else {                  </span><span leaf=""><br/></span><span leaf="">msr_value.QuadPart = __readmsr((ULONG32)msr);                  </span><span leaf=""><br/></span><span leaf="">}                  </span><span leaf=""><br/></span><span leaf="">guest_context-&gt;stack-&gt;gp_regs.Rax = msr_value.LowPart;                  </span><span leaf=""><br/></span><span leaf="">guest_context-&gt;stack-&gt;gp_regs.Rdx = msr_value.HighPart;                  </span><span leaf=""><br/></span><span leaf="">}                  </span><span leaf=""><br/></span><span leaf="">else {                  </span><span leaf=""><br/></span><span leaf="">msr_value.LowPart = static_cast</span><ulong><span leaf="">(guest_context-&gt;stack-&gt;gp_regs.Rax);          </span><span leaf=""><br/></span><span leaf="">msr_value.HighPart = static_cast</span><ulong><span leaf="">(guest_context-&gt;stack-&gt;gp_regs.Rdx);           </span><span leaf=""><br/></span><span leaf="">if (transfer_to_vmcs) {           </span><span leaf=""><br/></span><span leaf="">if (is_64bit_vmcs) {           </span><span leaf=""><br/></span><span leaf="">__vmx_vmwrite((ULONG32)vmcs_field, (size_t)msr_value.QuadPart);           </span><span leaf=""><br/></span><span leaf="">}           </span><span leaf=""><br/></span><span leaf="">else {           </span><span leaf=""><br/></span><span leaf="">__vmx_vmwrite((ULONG32)vmcs_field, (size_t)msr_value.QuadPart);           </span><span leaf=""><br/></span><span leaf="">}           </span><span leaf=""><br/></span><span leaf="">}           </span><span leaf=""><br/></span><span leaf="">else {           </span><span leaf=""><br/></span><span leaf="">__writemsr((ULONG32)msr, (size_t)msr_value.QuadPart);           </span><span leaf=""><br/></span><span leaf="">}           </span><span leaf=""><br/></span><span leaf="">}           </span><span leaf=""><br/></span><span leaf="">guest_context-&gt;vm_movinstruction = true;           </span><span leaf=""><br/></span><span leaf="">return true;           </span><span leaf=""><br/></span><span leaf="">}</span></ulong></ulong></span></p></td></tr></tbody></table><p style="margin-top:16.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:2;"><span style="mso-bookmark:heading_11;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;color:#3370FF;"><span leaf="">4. </span></span></span><span style="mso-bookmark:heading_11;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">vmx指令</span></span></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">由于本期不涉及嵌套，所以相关指令，我们直接注入一个事件即可</span></span></p><table style="margin-left: 0.0;border: none;border-collapse: collapse;mso-table-layout-alt: fixed;mso-border-top-alt: solid #DEE0E3 0.25pt;mso-border-left-alt: solid #DEE0E3 0.25pt;mso-border-bottom-alt: solid #DEE0E3 0.25pt;mso-border-right-alt: solid #DEE0E3 0.25pt;mso-padding-alt: 0pt 5.4pt 0pt 5.4pt;width: 100%;"><tbody><tr><td data-colwidth="552" width="552" valign="top" style="background: rgb(245, 246, 247);border-width: 1pt;border-style: solid;border-color: rgb(222, 224, 227);padding: 3pt 6pt 1.5pt;"><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;color:#646A73;"><span leaf="">C++                  </span></span><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;"><span leaf="">void vt_vmm_handle_vmx(_vt_vmhandle_guestcontext* guest_context) {                  </span><span leaf=""><br/></span><span leaf="">vt_vmm_injectinterruption(_vt_interruption_type::_vt_interruption_hardwareexception,                  </span><span leaf=""><br/></span><span leaf="">_vt_interruption_vector::_vt_intteruptionvec_invalidopcodeexception, false,                  </span><span leaf=""><br/></span><span leaf="">0);                  </span><span leaf=""><br/></span><span leaf="">return;                  </span><span leaf=""><br/></span><span leaf="">}</span></span></p></td></tr></tbody></table><p style="margin-top:19.0pt;margin-bottom:7.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:1;"><span style="mso-bookmark:heading_12;"><span style="font-size:18.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">结尾：</span></span></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">至此，我们的代码已经可以在虚拟机中跑起来了，尽管本工程比较简陋，但对于目前接下来要做的功能，已经绰绰有余了</span></span></p><p style="display: none;"><mp-style-type data-value="3"></mp-style-type></p>



<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=a4478716&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzkyOTc0NDY2Nw%3D%3D%26mid%3D2247485989%26idx%3D1%26sn%3D244f30b755ffa00e6cfcd7898c9a81d9">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Sat, 28 Mar 2026 10:01:00 +0800</pubDate>
    </item>
    <item>
      <title>从0训练自己的AI大模型(上)</title>
      <link>https://mp.weixin.qq.com/s?__biz=MzkyOTc0NDY2Nw==&amp;mid=2247485967&amp;idx=1&amp;sn=75ccdade1b71b91fdbca718b77005975</link>
      <description>前言2026年了，随着openclaw，ai agent的爆火，越来越多的人开始研究LLM的应用领域，不过我本</description>
      <content:encoded><![CDATA[<p>原创 <span>为了安全鸭</span> <span>2026-03-27 10:01</span> <span style="display: inline-block;">北京</span></p>






  
  <p><img src="https://wechat2rss.xlab.app/img-proxy/?k=a73f2750&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2F1woCcbOsjVNDsPaU3Pljqw8WDPEGyibHquRqJFepvIbRYbbTTXg4TNuQT3WxdnvoI84rgnGmcRuZ8z53YbnqUP30Gx3xPibmIwkuV0q7Kf5zg%2F0%3Fwx_fmt%3Djpeg"/></p>
  
  <h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf="">前言</span></h2><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">2026年了，随着openclaw，ai agent的爆火，越来越多的人开始研究LLM的应用领域，不过我本人对它不咋感冒，一个是我无论是工作上还是生活中agent写得用的够多了</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">《[2025]中外AI大战!让AI们通过MCP玩帝国时代2》</span><span leaf=""><br/></span><span leaf=""><a href="https://key08.com/index.php/2025/10/04/2816.html" target="_blank">https://key08.com/index.php/2025/10/04/2816.html</a></span><span leaf=""><br/></span><span leaf="">另外一个是，我觉得agent这些应用层的东西不够底层，没有什么价值。所以快过新年的时候，就打算年后学习咋做LLM，自己搞个AI大模型出来。不过年后公司业务真的忙，一直没空，到3月份也很忙。</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">ps:现在AI写代码了，理论上更轻松了，但是现实中怎么更忙了。</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">但是没办法了，我觉得自己不能被垃圾业务代码淹没，所以再怎么忙也抽时间开始这个项目了。</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><strong style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-weight: bolder;"><span leaf="">首先声明，虽然我之前懂机器学习/深度学习/强化学习，不过这些都只会一点点，我不是LLM领域专家，要是写的不好或者有问题请评论区请指出我的错误。</span></strong></p><h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">前期准备</span></h2><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">明确自己要干什么</span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">在训练的第一步，我们确定自己要搞什么，我确定我是搞网络安全的，我要最低代价训练一个看起来不错的小模型就行，其他的能力拉了就拉了，专项训练不是那么容易的。</span><span leaf=""><br/></span><span leaf="">因此我们确定：</span></p><ol style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" class="list-paddingleft-1"><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">我们是小模型，不用太多资源</span></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">搞着玩的，自己学习大模型训练，他基本只是个DEMO，不要做太好，不要花太多钱。</span></p></li></ol><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">服务器配置</span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">基本上，我们前期要准备一个AI训练服务器，我准备训练的模型大小是0.6b，所以两张A100就行了，太多了资源溢出了。但是硬盘和带宽要稍微大一点，特别是带宽，走梯子拉hf的内容，带宽32M绝对不够用。</span><span leaf=""><br/></span><span leaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002252" data-ratio="1.300556586270872" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" data-w="539" src="https://wechat2rss.xlab.app/img-proxy/?k=fc880183&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1woCcbOsjVPYMiawnwd0mbrK4zZFoXRVe342yr3eW5070pAGZ0bIQL5u8mFqPUH4D5MRdrvqd1D0yTJOocN8xlg6via5bWRRrGx6AjP6gM8v0%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">准备</span></h2><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">预训练数据集</span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">这有两个推荐的</span><span leaf=""><br/></span><span leaf="">commoncrawl -数百 TB 级别的数据，数十亿网页中提取的 TB 级原始网络数据，每月都会爬取新的数据，但我没用，因为光下完我估计我就没了几万块了。</span><span leaf=""><br/></span><span leaf=""><a href="https://commoncrawl.org/get-started" target="_blank">https://commoncrawl.org/get-started</a></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">RefinedWeb</span><span leaf=""><br/></span><span leaf="">1TB 左右，9.68亿条数据</span><span leaf=""><br/></span><span leaf="">Common Crawl 数据集的大量经过重复数据删除和过滤的标记语料库，它是为较小规模但高质量的数据集训练 Falcon-40B 模型而开发的</span><span leaf=""><br/></span><span leaf=""><a href="https://huggingface.co/datasets/tiiuae/falcon-refinedweb" target="_blank">https://huggingface.co/datasets/tiiuae/falcon-refinedweb</a></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">网络安全社区的爬虫数据/CEV/POC/exploit-db/github安全相关的东西混在一起</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">由于RefinedWeb是纯英文的，所以我又找了几个hugging face上不知名的中文数据集，中文数据集是真的难找，随便找了几个。</span></p><h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">模型架构</span></h2><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">这里我就一个经验，永远不要自己创造乱七八糟的架构(其实架构不咋重要，重要的是数据)，所以我选了llama的，由于分词表llama对中文不太好，用qwen的分词表。此外快速注意力，rope这些都上了。</span></p><h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">开始训练</span></h2><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">所以，现在训练一个模型成本极其的低廉了，我只需要搞个服务器，然后装一个opencode，我给他数据，让他搅拌在一起，就能开始预训练了。你不用关心操作，只需要关心细节就行。</span><span leaf=""><br/></span><span leaf="">模型loss降低的很快，一晚上就从9到3，似乎一切都朝着好的方向发展，我们很快就能训练一个好的模型了</span><span leaf=""><br/></span><span leaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002253" data-ratio="0.559040590405904" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" data-w="1084" src="https://wechat2rss.xlab.app/img-proxy/?k=c4bb1e96&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1woCcbOsjVOXMoh9FVvxvgORlzPkTicyhQYsyeTyxgsnOlHava1Llv0kNwE7oJcVCia3EhNm6ib8iaSU9DgddWRs5Dq4RugeUqiblJsljACcJE5M%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">LOSS居然不降低了</span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">过了大概3天后，我观察到一个问题，loss居然不继续降低了，还是在3-2左右</span><span leaf=""><br/></span><span leaf="">看了看checkpoints，成这样了</span><span leaf=""><br/></span><span leaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002257" data-ratio="0.3688172043010753" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" data-w="930" src="https://wechat2rss.xlab.app/img-proxy/?k=34ef35ba&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1woCcbOsjVMuJthx0sKb2tdQ4lGdoib0BEQFc1icOpnkdgwRC1DJNTGjZT4SBDEYTiaKibFpauXvsr1S1MBlRm8rF63v8c0N51uUf5HKTreRwPw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" nodeleaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002255" data-ratio="0.4206798866855524" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" data-w="706" src="https://wechat2rss.xlab.app/img-proxy/?k=b6d80f78&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1woCcbOsjVOy0M6TxpuzFfqfJeibnPOiaLNOPyAicgqmYta3jsQRy2QVOiaheJPm9YymyoREbzx0h5lDJXmNssKTB4OOf6TJVfbIMCjb3q8URgc%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002256" data-ratio="0.32413793103448274" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" data-w="580" src="https://wechat2rss.xlab.app/img-proxy/?k=879a5ec7&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2F1woCcbOsjVNUpY1QNgNy9LxqvLOpHalC0QBThNL1Bjra3CZbV0jSibHSst28rSR3maHwDeUXfUG84SrYiaMy7HBhdXiabghwia0YCrXtP6P9Pb0%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">为什么会这样，这个问题别让ai回答，因为我被AI坑了，AI说是训练时间不够久，然后就训练到了60000步，等回过头的时候，已经被坑惨了</span><span leaf=""><br/></span><span leaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002258" data-ratio="0.7910447761194029" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" data-w="1005" src="https://wechat2rss.xlab.app/img-proxy/?k=9db34f50&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1woCcbOsjVP3TXMu9lZe95STEFuNyqB2jzPN6hEWWzjJptpUVTWFA8hBduQZWZ3BllbDYuAHbFVMQGIVzy0Uf1ATTf4aIg7ARKCY7AmTrqs%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">让我们仔细回顾一下数据集，RefinedWeb我用了，这个应该是洗好的，网络安全社区的爬虫数据.这个是问题，它包含了大量的无用的标签，时间戳，这些标签因为我们训练的是0.6b的模型，他会让模型困惑，毫无逻辑。可能在更大的模型上他会学到这个是网页，但是对于一个0.6b的模型来说太勉强了。</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf="">因此，我们只能清洗一下数据，所谓清洗，我们直接点，国内论坛强行只保留中文，删除非中文或者非代码的内容。删掉无意义的CVE的编号，等。然后我们由于一开始就训练坏了，只能重新训练了，这次看表现还不错，几千次就这样了</span><span leaf=""><br/></span><span leaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002276" data-ratio="0.585016835016835" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" data-w="1188" src="https://wechat2rss.xlab.app/img-proxy/?k=b9776751&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2F1woCcbOsjVNOW0S5a2qAxIDVoUtKIPCruGE57HibOjm0c3EUNqDkj9ez57ibzKnWaChcXbZSe90r2ic7sXJiaYLqS3vlicEwVTgZXugGR0F9Fd4A%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">然后等吧，由于是重新再来，相当于浪费了1000多，挂了两天，看看效果：</span><span leaf=""><br/></span><span leaf="">肉眼可见loss低了：</span><span leaf=""><br/></span><span leaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002278" data-ratio="0.6039689387402933" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" data-w="1159" src="https://wechat2rss.xlab.app/img-proxy/?k=92ec342c&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2F1woCcbOsjVMrmSiaTSFnBGmHcd3ichCCV8w6cAHV13yYRHF3ILibCibFECaiamSuzxnuTdWnysRHCyfZ4VoFAftX7ETVcQhOpkzjmxoNKfnPrXzc%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">续写也很正常一点了</span><span leaf=""><br/></span><span leaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002277" data-ratio="0.11403980634749865" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" data-w="1859" src="https://wechat2rss.xlab.app/img-proxy/?k=1251d14b&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2F1woCcbOsjVM2psicKyr4BWXTFIcNOIyVPoNK0ey2W5H5wibfrcgKjS8R3UIFqHxSuAPJHcQticPJOm1hqPL3p3cnakZpvUgxgDxqko00qAMjp8%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">但是我发现，这玩意大而空：</span><span leaf=""><br/></span><span leaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002274" data-ratio="0.3300124533001245" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" data-w="803" src="https://wechat2rss.xlab.app/img-proxy/?k=60f617d6&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2F1woCcbOsjVMnLufwnwNiaENpyntMv01PR0NH9IpGM5q14h69rZYxR9LBH9cTWp3d2TvZUhXgYOz1icyNeMuXwlV1bmhwpTGcmvGa9q5YaLKf0%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">我认为是数据不够的结果，所以不管他继续训练了。</span><span leaf=""><br/></span><span leaf="">又过了一天</span><span leaf=""><br/></span><span leaf="">我发现最新的checkpoints出现损坏的情况：</span><span leaf=""><br/></span><span leaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002275" data-ratio="0.6937984496124031" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" data-w="1032" src="https://wechat2rss.xlab.app/img-proxy/?k=3150bbbb&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1woCcbOsjVPibpThTAGkEbBKLJEuFsuWiaGkPpa2ArTLicp8e0qXDxzL0vtgwYSXsIqxrgc5NKECnAvbvmuqKF8MibXibteBK8LpKSUKEZibuEyyA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">所以先回退到老版本，做一下SFT</span></p><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">SFT</span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">有了一个续写模型后，我们可以下一步，开始进行SFT微调了, 这样才有对话能力，自我认知能力。</span><span leaf=""><br/></span><strong style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-weight: bolder;"><span leaf="">这真的是一个大坑</span></strong><span leaf=""><br/></span><span leaf="">pre train还算中规中矩。post train就麻烦了，一开始我从网上随便找了数据集进行训练，发现会让模型直接损坏！</span><span leaf=""><br/></span><span leaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002280" data-ratio="0.3928748144482929" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" data-w="2021" src="https://wechat2rss.xlab.app/img-proxy/?k=2f1ddd51&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1woCcbOsjVN2XT41EmAmcKTFnbqEtjhpgndJjliaeicEeoc7wMtswmicMSlcePHtyr7prOApfjfMLSlE3ML6RJ7ZSAiaZzoN80NARicwLj0bFKFk%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" nodeleaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002282" data-ratio="0.3029835390946502" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" data-w="1944" src="https://wechat2rss.xlab.app/img-proxy/?k=933dbc62&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2F1woCcbOsjVNnD7q8o0aVibqWWqHTxqHObxb3GZbDPfe4rSDoickiaibibY9LmrZaX7oEc4L6LIKwcqNfnzPnvDLGRyQTnjnk2l4VTcKoW2wrFlCs%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">还有更离谱的,老外的训练集也带黄色废料,导致模型学了不该学的:</span><span leaf=""><br/></span><span leaf="">(当我说’你好’的时候)</span><span leaf=""><br/></span><span leaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002279" data-ratio="0.12051282051282051" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" data-w="1950" src="https://wechat2rss.xlab.app/img-proxy/?k=4a534a72&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1woCcbOsjVMgb1SmLVlpqlI7QByL0qovSKqFZ61VvEjticjVHCpYqcQqc6RDNOWJq6mkB7W5zuVIG8sUy7riblrtmVdnaZNT4VZIS8tws4pcQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">这tm是一个黄色废料….</span><span leaf=""><br/></span><span leaf="">实在不行了！业务上又有一堆事…于是乎我找了一个hf上很火的deepseek蒸馏的数据集，不带think的那个，又过了一天…</span><span leaf=""><br/></span><span leaf="">结果第二天看的时候 我特么发现不对劲..</span><span leaf=""><br/></span><span leaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002283" data-ratio="0.4649629018961253" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" data-w="1213" src="https://wechat2rss.xlab.app/img-proxy/?k=b1af39d3&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1woCcbOsjVOicaROibriazc79y0OQYlpo0W182ZIRClosia6ia1878SONC9mzTP3Ku4tzY8L939eRmhTXmLS4m1JcaNOU3w5LI9RCf6It34rk3CM%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">怎么回事，这么那么多”美人”啊</span><span leaf=""><br/></span><span leaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002281" data-ratio="0.34668892598775736" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="jpeg" data-w="1797" src="https://wechat2rss.xlab.app/img-proxy/?k=5c290cb0&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2F1woCcbOsjVN5UQzL5pI5cdoUpEqU3xgO9A523MJoich1ND78nwslh6GD5e7R7MiaRTPKUkh15pjsFZYMia1IeXiadUOdjd0iaYqwkenEnuWT6AQY%2F640%3Fwx_fmt%3Djpeg%26from%3Dappmsg"/></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">检查checkpoints，发现从很早开始，模型就学会美人了，而且他最早的时候居然在写小黄文….</span><span leaf=""><br/></span><span leaf="">倒查训练集，我发现一个绝望的事情，我的训练集里面充满了小黄文，其中美人来自这里</span><span leaf=""><br/></span><span leaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002288" data-ratio="0.09662921348314607" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="jpeg" data-w="2670" src="https://wechat2rss.xlab.app/img-proxy/?k=2fcc3feb&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2F1woCcbOsjVMpQc90G83Bicb1lYqbtnmthibA2Bs7M5ricIcXpqW69nX6DHzUK8wfzkSTg1g28Z60q0IhQ1ZqQbSsSjbaMibsv5tWG6LnKFg5zzY%2F640%3Fwx_fmt%3Djpeg%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">完了，又白训练了.</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">捣鼓半天，试了N个数据集，效果还是不明显。其实后来写文章的时候看，这就触发了我前面说的两个大坑</span><span leaf=""><br/></span><span leaf="">我们用了RefinedWeb，并且用了一些受污染的/完全不知名的中文训练集来做预训练，这导致，模型的底座中文能力其实是偏差的，即便是有合成数据在，一开始的混入的中文低质量语料去不掉了，除非</span><strong style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-weight: bolder;"><span leaf="">重新训练</span></strong></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">第二个问题，我们的模型比较小，只有0.6b，他受到post train的影响非常大，他并不是一个通用模型，如果我们再拿网上的一些数据去给他做SFT，他只会学到乱七八糟的 杂七杂八的内容，除非我们预训练做的非常充分。</span><span leaf=""><br/></span><strong style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-weight: bolder;"><span leaf="">而看起来，我们的预训练也不充分，数据集不够多，次数也不够多，数据配比也有问题。一系列问题导致我们到了如今的情况。</span></strong></p><h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf="">make duckgpt greate again</span></h2><blockquote style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin: 5px 0px 15px;overflow: hidden;border-width: 0px 0px 0px 4px;border-top-style: initial;border-right-style: initial;border-bottom-style: initial;border-left-style: solid;border-top-color: initial;border-right-color: initial;border-bottom-color: initial;border-left-color: rgb(122, 208, 58);border-image: initial;padding: 8px 12px;background-color: rgb(241, 241, 241);box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 1px 0px;font-size: 14.992px;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;"><span leaf="">其实前面写了一大堆废话的原因是因为，很明显，我前面的各种操作导致模型训练失败了。这种感觉就像是，</span><strong style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-weight: bolder;"><span leaf="">你想去送外卖但是没有电动车，冰箱里面有泡面但是没有卤蛋，塞满了资料的硬盘说挂，很好的朋友突然翻脸，认真做的东西没人喜欢,你又会发现龟苓膏里面没有龟，老婆饼里面没有老婆，你以为的通常都不是通常，生气没用，愤怒徒劳，不行就是不行</span></strong><span leaf="">，但是失败并不丢人，只要总结原因，我们一定能解决各种未知的困难，毕竟这不是物理学。而经过冷静思考，我发现我前几天失败的原因是，在没有科学的进行学习的情况下干某件事，就跟《勇哥说餐饮》里面的蜘蛛侠一样失败。</span></p></blockquote><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">于是乎为了解决问题，我重新进行了大量的资料学习，并且我仔细思考了一下目前的困境:</span><span leaf=""><br/></span><span leaf="">英文的效果都是好的，英文看起来至少都正常，比如这个，但是模型完全不会中文</span><span leaf=""><br/></span><span leaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002297" data-ratio="0.062377402903099254" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" data-w="2549" src="https://wechat2rss.xlab.app/img-proxy/?k=08410af9&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1woCcbOsjVOibDroN0LgSRuxZ0QgPlY7Ropiah1quibRfkGN91p2uamoCawqmvue3jCd0oLJuePKLGtcErRMO7OCwhrNy53OPVUu3OwmRJ4J7s%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">因此本质上，需要的是pre train足够扎实，但是我们的pre train并不扎实</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">经过一段时间的学习和资料查找和别人的大模型POC学习（minimind），我发现，我们的重大失误:</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">首先，我们需要我们正确配比数据，正确的做法是，模型大小 x 20，比如我是0.6b的模型，则需要12b的数据。此外这之，我也不打算先训练网络安全的数据了，用完90%是通用数据，10%是合成的网络安全数据</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">此外，我们不能用野鸡的数据集，HF上很多数据集并没有进行很好的清理，一味的追求数据大规模，只会导致模型啥也学不到，除非模型参数是真的大，大到无视这种杂七杂八的数据，但是那种几百B的我们个人是搞不定的。</span><strong style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-weight: bolder;"><em style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><span leaf="">小模型对输入的数据很敏感</span></em></strong><span leaf="">。</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">最后，我的SFT数据集也有问题，我们太相信网上的数据了，但是网上数据他并不是正常分布的，他充斥着很多人对AI的想法，比如有人拿AI做数学题，有人让AI写小黄文，有人让AI解决数学作业。这些如果是大模型搞通用大模型是可以的，但是这些数据对于我们来说，有毒。会拉低整体模型水平，正规做法是base+通用任务SFT+领域任务SFT，而不是一股脑全塞进去会导致出问题。</span><span leaf=""><br/></span><span leaf="">因此SFT数据配比我90%都是大模型合成，10%是网上通用数据。并且SFT训练率通常要是pre train的0.1左右，大了可能不收敛。</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">最后的最后，</span><strong style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-weight: bolder;"><span leaf="">我发现的模型架构也有问题</span><span leaf=""><br/></span><span leaf="">我们用了Qwen的分词器，Qwen的分词器占用大概151k 加上并没有用tie，导致实际上attention就会很小很小</span></strong><span leaf="">，解决方案是换一个词表+用TIE</span><span leaf=""><br/></span><span leaf="">(实际上，在QWEN3里面的说法中，4B以下的模型都用tie)</span><span leaf=""><br/></span><span leaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002299" data-ratio="0.9177215189873418" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" data-w="790" src="https://wechat2rss.xlab.app/img-proxy/?k=a74e7421&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1woCcbOsjVOHFuPcZHM3m70X8H9Qk4bQQ3J5XnFCIvG40Bic0lrOLs6G2gKS8MYsSHia05MWQDaj9ct8LHibpVuTSg72IicC3khggibPQa77Y8L0%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">合成数据</span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">现在大模型厂商训练开始用合成数据来进行训练，即用一个更大的模型合成数据给小模型出来用，自然语言数据已经快到头了对于很多大模型来说（当然对于我来说不是）。</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">我们可以从中获得的启发是，大模型合成的数据，相比从网上爬来的野鸡数据，至少清洗过，可靠。另外对于raw data，做数据清洗是一个体力活，我一个人时间有限，而且这个吞金兽还开着，时间很珍贵。所以我立刻开始了下一步，用本地模型进行合成数据的操作</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">我准备用两种模型来合成数据，一个是本地的qewn3.5,他们做的非常不错，本地成本低，另外一个是云端的大模型，为了实现合成数据，我让AI写了一个发散脚本，即自己思考自己下一步要生成什么，因为我们是做pre train，所以做的是续写而不是对话。</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">我的配置是云端大模型占了30%，本地小模型占了70%</span><span leaf=""><br/></span><span leaf="">为什么用本地模型，因为在线大模型耗钱啊！</span><span leaf=""><br/></span><span leaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002298" data-ratio="0.15376984126984128" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" data-w="1008" src="https://wechat2rss.xlab.app/img-proxy/?k=618ac2ec&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2F1woCcbOsjVOoHNFNicZFRg3ENEN76FYgZazyNRWwIKf9VL7ukoIiccLMCdxGwZziaDQiaml2jKHE1ZaEJffIbUt4aqK1MunTETmEPYWI2ibamia8o%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">先让大模型无限自动生成种子数据：</span><span leaf=""><br/></span><span leaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002295" data-ratio="0.6357947434292867" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" data-w="799" src="https://wechat2rss.xlab.app/img-proxy/?k=d0403dab&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2F1woCcbOsjVMN2TIa9YictNjicyCyHNG3Uoa9uG767lowVPvbicXIfyT0yfnU2v11cicXBjQB2dSENUCrDyxkt78eadyJjnOFFxRWPpK6Sye4soY%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">然后拿这些东西去让大模型续写：</span><span leaf=""><br/></span><span leaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002296" data-ratio="0.3489749430523918" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" data-w="2195" src="https://wechat2rss.xlab.app/img-proxy/?k=fff38c4b&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1woCcbOsjVORP82jBAXvKOiaQpBh7ms4e6VjrvfbTzvqKvTVQGKoxl619ZZZO9no5ecfuE8RI5icP2SCGzyNd1kSZTYtNnybrnxm0AD11qaY4%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">这样就得到了一批高质量的数据，虽然还是有问题，比如大模型的幻觉会会影响数据质量，而且我也没清洗过，但是至少靠谱一点了.</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">结果，又过了两天（-400rmb）</span></p><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf="">重新预训练</span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">所以，我重新进行了预训练，搞了几个高质量的通用任务数据集:</span><span leaf=""><br/></span><span leaf=""><a href="https://huggingface.co/datasets/Goose-World/RWKV-World-v3" target="_blank">https://huggingface.co/datasets/Goose-World/RWKV-World-v3</a></span><span leaf=""><br/></span><span leaf=""><a href="https://huggingface.co/datasets/opencsg/Fineweb-Edu-Chinese-V2.2" target="_blank">https://huggingface.co/datasets/opencsg/Fineweb-Edu-Chinese-V2.2</a></span><span leaf=""><br/></span><span leaf=""><a href="https://huggingface.co/datasets/shareAI/ShareGPT-Chinese-English-90k" target="_blank">https://huggingface.co/datasets/shareAI/ShareGPT-Chinese-English-90k</a></span><span leaf=""><br/></span><span leaf="">等等..</span><span leaf=""><br/></span><span leaf="">然后继续合成数据:</span><span leaf=""><br/></span><span leaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002303" data-ratio="0.4432348367029549" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" data-w="1929" src="https://wechat2rss.xlab.app/img-proxy/?k=e4cf8278&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1woCcbOsjVPjkZQP8kqdb8auGhYfZ4vFX7oyQIsguUiboSvecSxb18IVzLFiaGObsrLmqJC1TBib8fxcUnIoG5AqUw9wQZhobFBNcGk0CBJpKw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">数据大小限制在12b左右，不扩大。</span><span leaf=""><br/></span><span leaf="">终于，在睡了一觉后，loss终于稳定在2.5-3左右了：</span><span leaf=""><br/></span><span leaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002302" data-ratio="0.2939890710382514" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" data-w="915" src="https://wechat2rss.xlab.app/img-proxy/?k=e908f45a&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2F1woCcbOsjVPSIl0L2Ps0aXpnXoKcqO73YEwXnHmibbE2cZE5PPs0YJZcJK5ma3JNS8xGqQzFtaK2icwSoOoAjk5uCYlStfbHueNaiakTgurxvY%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" nodeleaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002304" data-ratio="1.0545790934320074" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" data-w="1081" src="https://wechat2rss.xlab.app/img-proxy/?k=8fa64d58&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2F1woCcbOsjVONKMLBkXOtyjSEWib6To9uChrowcmIEM3pvOmibqOiaJms5kku7F1PnJWaycDEGJfzvUR54LCbUibSbnBIoxbNn0aBRqIdj84Tmms%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">看起来靠谱一点了，没之前那么离谱</span><span leaf=""><br/></span><span leaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002301" data-ratio="0.4440357330530741" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" data-w="1903" src="https://wechat2rss.xlab.app/img-proxy/?k=0e352f80&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2F1woCcbOsjVNOBzzkxHhdMnmUGDfg6I80mPMzoCx64UrDYnOuTuQJVqED5LINR3ZjYdhCq4xsUNIXj8iarIPmvlG0AgjYLq1ZulgSTavFnWDY%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">于是我们得到了一个pre train训练好的模型。虽然这个模型很垃圾，其他领域续写一窍不通，因为我们没有给他投喂太多的语料。但是对于安全领域，属于是能跑吧</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">现在再对其做SFT。用了合成数据，其他没什么特别的</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">做完后效果如下:</span><span leaf=""><br/></span><span leaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002300" data-ratio="0.23833333333333334" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" data-w="1200" src="https://wechat2rss.xlab.app/img-proxy/?k=0052fae8&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2F1woCcbOsjVN6BgR4g4N5ffaZvpgiaqicsoWnPRnYZI0ucibS2U34TzKPTEtWBPia6befP1Pm7HfKw9sFVmbO7Kiad6ILQiagOYQh1icHvoHtPD1LTU%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">当然也有幻觉，比如这个中国美食带了日本寿司:</span><span leaf=""><br/></span><span leaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002305" data-ratio="0.2092436974789916" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" data-w="1190" src="https://wechat2rss.xlab.app/img-proxy/?k=96d6c79d&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1woCcbOsjVM78HzxDsy8T6iaZtQGpicR9sZyxEKichFManuibk0jyd8Gvs4d0mCIBaWcFNat0hYm2fKC2bxtBcnPGu4e43AuxgkS4rYxfzXBoF8%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">然后弄了一个版本的SFT纠正了一下：</span><span leaf=""><br/></span><span leaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002307" data-ratio="0.27346041055718473" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" data-w="1364" src="https://wechat2rss.xlab.app/img-proxy/?k=4f90106c&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2F1woCcbOsjVNfDa8hA1AbuuicUfboynbexibTz0DPnapUPz2L1bZn3BSE97IJfZia9rzyQm2J0sdlSJwtk1ibBtHH751Ezo2JRk0R8icF48ECl9uM%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">不过我也不知道他学了什么…可能是学到合成数据里面的拒绝语句了，对于代码题目是拒绝的</span><span leaf=""><br/></span><span leaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002306" data-ratio="0.16822429906542055" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" data-w="1284" src="https://wechat2rss.xlab.app/img-proxy/?k=d784365e&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1woCcbOsjVNiaoUPMbicr34atClHN1LSbgF0ATnWk5YaCV0MguHuxQPwYMfABVL2MPibeetDqzphrqKZibMlsibKuqbrAgb5L09z3ib3iaeFHBGJuA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">然后我们用了QWEN作为合成数据，所以这个模型自我认知里面认为自己是qwen的，我也懒得再合成一些自我认知数据去修正他的认知了，反正是做着玩的</span><span leaf=""><br/></span><span leaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002308" data-ratio="0.27854195323246217" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" data-w="1454" src="https://wechat2rss.xlab.app/img-proxy/?k=cee0219d&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2F1woCcbOsjVPNAboICpgDGUHBs9j1IRXcibicJF4JLvzwgQiaCiaRox8xWDn3vsjg8wlpxD1IBTuKLUXsYwBdnNmtq0qDFWQ7VOSfhZyAiaDiagDWc%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">幻觉依然是存在的，而且非常大，并且对于不懂的问题，就会变得笨笨的：</span><span leaf=""><br/></span><span leaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002309" data-ratio="0.17162629757785466" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" data-w="1445" src="https://wechat2rss.xlab.app/img-proxy/?k=9e5efb14&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2F1woCcbOsjVMMZicbkib3ltnAvvU0KXLMqKTVy0NhGjW9sGEibnN49JibXzDSqbPjnfPCc2bnuVs25eZrpkQl90tOwjztbDR2j5ER0icRQlSJHu90%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">(我们的训练集里面没有银狐木马，所以AI完全无法找到有用的东西，所以就会这样)</span></p><h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">总结反思</span></h2><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">这次一共花了5000RMB，而其实跑通后实现同样的效果的模型，只需要800rmb左右，大部分时间花费在边学边测边用上:</span><span leaf=""><br/></span><span leaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002310" data-ratio="0.875" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" data-w="320" src="https://wechat2rss.xlab.app/img-proxy/?k=4544ebd2&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2F1woCcbOsjVN8TpMBglWpE4E1S0v39wNicPDJh2GHuwVTNHdf7fbBfXAqSHvsKJgUwqMic6tAVD2uic09LBKPTqLcXevERCLjJwSA6vBgNZJQKc%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">这是因为我选了一个错误的路线，0.6b对于模型来说还是太大了，应该先从极小的参数开始，比如0.1b或者0.01b先做实验。实验跑通了再堆数据规模。从而避免时间/金钱的耗费。</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">无论怎么样，我们都跑通了整体的路线，下次就不会那么吃瘪了，这次没有做工具调用训练以及RL以及实现COT(思维链推理)效果也是一种遗憾，因为花的钱太多了，所以先抱有遗憾的止血，等回血一波后，攒一波再来一次更好的训练，敬请关注冲鸭安全。</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">这边非常感谢minimind,所有想训练的人但是不是搞模型专业的人应该先复现一下这个,节约大量时间,避免跟我一样一头撞到墙上:</span><span leaf=""><br/></span><span leaf=""><a href="https://github.com/jingyaogong/minimind" target="_blank">https://github.com/jingyaogong/minimind</a></span></p><p style="display: none;"><mp-style-type data-value="3"></mp-style-type></p>



<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=289a676c&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzkyOTc0NDY2Nw%3D%3D%26mid%3D2247485967%26idx%3D1%26sn%3D75ccdade1b71b91fdbca718b77005975">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Fri, 27 Mar 2026 10:01:00 +0800</pubDate>
    </item>
    <item>
      <title>Windows下不触发任何进程监控的创建进程</title>
      <link>https://mp.weixin.qq.com/s?__biz=MzkyOTc0NDY2Nw==&amp;mid=2247485866&amp;idx=1&amp;sn=027c346f42696ff753a8681b2308e3c2</link>
      <description>前言这几年AI用多了,脑子坏了,比如之前写代码很容易进入心流解决问题,这个过程很爽,但是现在只会开五六个ai的</description>
      <content:encoded><![CDATA[<p>原创 <span>为了安全鸭</span> <span>2026-01-24 16:30</span> <span style="display: inline-block;">北京</span></p>






  
  <p><img src="https://wechat2rss.xlab.app/img-proxy/?k=5ea60fd0&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FejibWMxI7nWLGKcY4e7q0ANGY1jt6sG6MM5rWyS7kMa8O0y2pac1CMwu95GEeZuXahuv57ey9yhsiafXlCkpmngw%2F0%3Fwx_fmt%3Djpeg"/></p>
  
  <h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf="">前言</span></h2><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">这几年AI用多了,脑子坏了,比如之前写代码很容易进入心流解决问题,这个过程很爽,但是现在只会开五六个ai的console让他帮我打工。</span><span leaf=""><br/></span><span leaf="">一开始是很急的让AI写功能，</span><span leaf=""><br/></span><span leaf="">但是到后来恨不得遇到bug，编译不通过，甚至是思考都托管给AI。</span><span leaf=""><br/></span><span leaf="">我把它叫做脑腐现象.所以为了避免这种现象,我准备用纯手工打造的方式搞点项目做。锻炼一下大脑。正巧，操作系统内核目前还是AI无法触及的领域。所以，here we go。</span></p><h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">内核创建进程</span></h2><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">所以，让我们来复习一下内核创建进程，这里不会说太多的基础，因为chatgpt都能回答了。我们直接说简单一点的。我们先实现一个简单的调用ntcreateuserprocess创建进程的例子，在内核里面这需要三步:</span></p><ol style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" class="list-paddingleft-1"><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">定位ntcreateuserprocess</span></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">填好参数</span></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">call</span></p></li></ol><p><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: inherit;font-weight: 500;line-height: 1.2;color: inherit;font-size: 1.75rem;"><span leaf="">定位ntcreateuserprocess</span></h3><span leaf="">定位方式有很多，比如经典款祖传找SSDT table,但是</span><span leaf=""><br/></span><span leaf="">我是懒得定位了，直接特征码写死了:</span><span leaf=""><br/></span><span leaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.7611111111111111" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-imgfileid="100002178" src="https://wechat2rss.xlab.app/img-proxy/?k=ca885c51&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLGKcY4e7q0ANGY1jt6sG6McmIoGvS1oYTXtg29g4joF2GjicicUibc86ib9yUKRJkzGzbOwyY7BkH1bw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">填好参数</span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">ntcreateuserpcoess在R3的执行的时候需要用到RtlCreateProcessParametersEx和RtlDestroyProcessParameters去填_RTL_USER_PROCESS_PARAMETERS</span><span leaf=""><br/></span><span leaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.20277777777777778" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-imgfileid="100002176" src="https://wechat2rss.xlab.app/img-proxy/?k=66af4f89&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLGKcY4e7q0ANGY1jt6sG6MAiacUg5Nym2svYicPm1xz6uk5YRQk1WdLPpLQCkucUptsE9IILYTgnHg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">我们R0是没有这个两个参数的，所以要自己填.填完直接call就行:</span><span leaf=""><br/></span><span leaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.5685185185185185" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-imgfileid="100002177" src="https://wechat2rss.xlab.app/img-proxy/?k=9d8b7976&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLGKcY4e7q0ANGY1jt6sG6MTibmXfwsQBRtpicNuQ4RWJB5RFW4ZgyE1FlnjXL0R9r14VvIfUplMGAg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.14074074074074075" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-imgfileid="100002175" src="https://wechat2rss.xlab.app/img-proxy/?k=a9529ab4&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLGKcY4e7q0ANGY1jt6sG6M7X4xQXBkd3hN43kC5NIibxF4ZtmZaL1PCBEmkVPJbbcibxRxzeSCou9g%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">但是坑来了,</span><span leaf=""><br/></span><span leaf="">而这个RTL_USER_PROCESS_PARAMETERS 微软故意隐藏了东西，导致如果你按照微软的来写是没有办法跑起来的，跑起来会直接segment fault.这是因为没有正确的填参数,CRT初始化的时候就崩溃了。因此我写了一个R3程序，打印一下里面需要什么东西:</span></p><pre style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 13.118px;margin-top: 0px;margin-bottom: 1rem;overflow: auto;display: block;color: rgb(33, 37, 41);max-height: 400px;background-color: rgb(245, 245, 245);border: 1px solid rgb(204, 204, 204);padding: 0.5em;border-radius: 4px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><code style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: inherit;color: inherit;word-break: normal;white-space: pre-wrap;"><span leaf="">// ConsoleApplication1.cpp</span><span leaf=""><br/></span><span leaf="">// Dumps the raw payload produced by RtlCreateProcessParametersEx (user-mode).</span><span leaf=""><br/></span><span leaf=""><a class="wx_topic_link" topic-id="mks1pt8l-00ye8f" style="color: #576B95 !important;" data-topic="1">#define</a> WIN32_LEAN_AND_MEAN</span><span leaf=""><br/></span><span leaf=""><a class="wx_topic_link" topic-id="mks1pt8l-lrckh7" style="color: #576B95 !important;" data-topic="1">#include</a> &lt;windows.h&gt;</span><span leaf=""><br/></span><span leaf=""><a class="wx_topic_link" topic-id="mks1pt8m-psi5gg" style="color: #576B95 !important;" data-topic="1">#include</a> &lt;winternl.h&gt;</span><span leaf=""><br/></span><span leaf=""><a class="wx_topic_link" topic-id="mks1pt8m-vlafyw" style="color: #576B95 !important;" data-topic="1">#include</a> &lt;cstdint&gt;</span><span leaf=""><br/></span><span leaf=""><a class="wx_topic_link" topic-id="mks1pt8m-923evp" style="color: #576B95 !important;" data-topic="1">#include</a> &lt;cstdio&gt;</span><span leaf=""><br/></span><span leaf=""><a class="wx_topic_link" topic-id="mks1pt8m-cu1zzv" style="color: #576B95 !important;" data-topic="1">#include</a> &lt;string&gt;</span><span leaf=""><br/></span><span leaf="">//0x18 bytes (sizeof)</span><span leaf=""><br/></span><span leaf="">struct _CURDIR</span><span leaf=""><br/></span><span leaf="">{</span><span leaf=""><br/></span><span leaf="">    struct _UNICODE_STRING DosPath;                                         //0x0</span><span leaf=""><br/></span><span leaf="">    VOID* Handle;                                                           //0x10</span><span leaf=""><br/></span><span leaf="">};</span><span leaf=""><br/></span><span leaf="">//0x18 bytes (sizeof)</span><span leaf=""><br/></span><span leaf="">struct _RTL_DRIVE_LETTER_CURDIR</span><span leaf=""><br/></span><span leaf="">{</span><span leaf=""><br/></span><span leaf="">    USHORT Flags;                                                           //0x0</span><span leaf=""><br/></span><span leaf="">    USHORT Length;                                                          //0x2</span><span leaf=""><br/></span><span leaf="">    ULONG TimeStamp;                                                        //0x4</span><span leaf=""><br/></span><span leaf="">    struct _STRING DosPath;                                                 //0x8</span><span leaf=""><br/></span><span leaf="">};</span><span leaf=""><br/></span><span leaf="">//0x410 bytes (sizeof)</span><span leaf=""><br/></span><span leaf="">struct _RTL_USER_PROCESS_PARAMETERSEX</span><span leaf=""><br/></span><span leaf="">{</span><span leaf=""><br/></span><span leaf="">    ULONG MaximumLength;                                                    //0x0</span><span leaf=""><br/></span><span leaf="">    ULONG Length;                                                           //0x4</span><span leaf=""><br/></span><span leaf="">    ULONG Flags;                                                            //0x8</span><span leaf=""><br/></span><span leaf="">    ULONG DebugFlags;                                                       //0xc</span><span leaf=""><br/></span><span leaf="">    VOID* ConsoleHandle;                                                    //0x10</span><span leaf=""><br/></span><span leaf="">    ULONG ConsoleFlags;                                                     //0x18</span><span leaf=""><br/></span><span leaf="">    VOID* StandardInput;                                                    //0x20</span><span leaf=""><br/></span><span leaf="">    VOID* StandardOutput;                                                   //0x28</span><span leaf=""><br/></span><span leaf="">    VOID* StandardError;                                                    //0x30</span><span leaf=""><br/></span><span leaf="">    struct _CURDIR CurrentDirectory;                                        //0x38</span><span leaf=""><br/></span><span leaf="">    struct _UNICODE_STRING DllPath;                                         //0x50</span><span leaf=""><br/></span><span leaf="">    struct _UNICODE_STRING ImagePathName;                                   //0x60</span><span leaf=""><br/></span><span leaf="">    struct _UNICODE_STRING CommandLine;                                     //0x70</span><span leaf=""><br/></span><span leaf="">    VOID* Environment;                                                      //0x80</span><span leaf=""><br/></span><span leaf="">    ULONG StartingX;                                                        //0x88</span><span leaf=""><br/></span><span leaf="">    ULONG StartingY;                                                        //0x8c</span><span leaf=""><br/></span><span leaf="">    ULONG CountX;                                                           //0x90</span><span leaf=""><br/></span><span leaf="">    ULONG CountY;                                                           //0x94</span><span leaf=""><br/></span><span leaf="">    ULONG CountCharsX;                                                      //0x98</span><span leaf=""><br/></span><span leaf="">    ULONG CountCharsY;                                                      //0x9c</span><span leaf=""><br/></span><span leaf="">    ULONG FillAttribute;                                                    //0xa0</span><span leaf=""><br/></span><span leaf="">    ULONG WindowFlags;                                                      //0xa4</span><span leaf=""><br/></span><span leaf="">    ULONG ShowWindowFlags;                                                  //0xa8</span><span leaf=""><br/></span><span leaf="">    struct _UNICODE_STRING WindowTitle;                                     //0xb0</span><span leaf=""><br/></span><span leaf="">    struct _UNICODE_STRING DesktopInfo;                                     //0xc0</span><span leaf=""><br/></span><span leaf="">    struct _UNICODE_STRING ShellInfo;                                       //0xd0</span><span leaf=""><br/></span><span leaf="">    struct _UNICODE_STRING RuntimeData;                                     //0xe0</span><span leaf=""><br/></span><span leaf="">    struct _RTL_DRIVE_LETTER_CURDIR CurrentDirectores[32];                  //0xf0</span><span leaf=""><br/></span><span leaf="">    ULONGLONG EnvironmentSize;                                              //0x3f0</span><span leaf=""><br/></span><span leaf="">    ULONGLONG EnvironmentVersion;                                           //0x3f8</span><span leaf=""><br/></span><span leaf="">    VOID* PackageDependencyData;                                            //0x400</span><span leaf=""><br/></span><span leaf="">    ULONG ProcessGroupId;                                                   //0x408</span><span leaf=""><br/></span><span leaf="">    ULONG LoaderThreads;                                                    //0x40c</span><span leaf=""><br/></span><span leaf="">};</span><span leaf=""><br/></span><span leaf="">// Some SDKs do not declare this prototype in user-mode headers.</span><span leaf=""><br/></span><span leaf="">using fnRtlCreateProcessParametersEx = NTSTATUS(NTAPI*)(</span><span leaf=""><br/></span><span leaf="">    _RTL_USER_PROCESS_PARAMETERSEX* pProcessParameters,</span><span leaf=""><br/></span><span leaf="">    PUNICODE_STRING ImagePathName,</span><span leaf=""><br/></span><span leaf="">    PUNICODE_STRING DllPath,</span><span leaf=""><br/></span><span leaf="">    PUNICODE_STRING CurrentDirectory,</span><span leaf=""><br/></span><span leaf="">    PUNICODE_STRING CommandLine,</span><span leaf=""><br/></span><span leaf="">    PVOID Environment,</span><span leaf=""><br/></span><span leaf="">    PUNICODE_STRING WindowTitle,</span><span leaf=""><br/></span><span leaf="">    PUNICODE_STRING DesktopInfo,</span><span leaf=""><br/></span><span leaf="">    PUNICODE_STRING ShellInfo,</span><span leaf=""><br/></span><span leaf="">    PUNICODE_STRING RuntimeData,</span><span leaf=""><br/></span><span leaf="">    ULONG Flags</span><span leaf=""><br/></span><span leaf="">);</span><span leaf=""><br/></span><span leaf="">using fnRtlDestroyProcessParameters = NTSTATUS(NTAPI*)(_RTL_USER_PROCESS_PARAMETERSEX ProcessParameters);</span><span leaf=""><br/></span><span leaf="">static UNICODE_STRING MakeUnicodeString(const std::wstring&amp; s)</span><span leaf=""><br/></span><span leaf="">{</span><span leaf=""><br/></span><span leaf="">    UNICODE_STRING us{};</span><span leaf=""><br/></span><span leaf="">    us.Buffer = const_cast&lt;PWSTR&gt;(s.c_str());</span><span leaf=""><br/></span><span leaf="">    us.Length = static_cast&lt;USHORT&gt;(s.size() * sizeof(wchar_t));</span><span leaf=""><br/></span><span leaf="">    us.MaximumLength = us.Length + sizeof(wchar_t);</span><span leaf=""><br/></span><span leaf="">    return us;</span><span leaf=""><br/></span><span leaf="">}</span><span leaf=""><br/></span><span leaf="">static void HexDump(const void* data, size_t size)</span><span leaf=""><br/></span><span leaf="">{</span><span leaf=""><br/></span><span leaf="">    const auto* p = static_cast&lt;const unsigned char*&gt;(data);</span><span leaf=""><br/></span><span leaf="">    for (size_t i = 0; i &lt; size; i += 16) {</span><span leaf=""><br/></span><span leaf="">        std::printf(&#34;%08zx  &#34;, i);</span><span leaf=""><br/></span><span leaf="">        for (size_t j = 0; j &lt; 16; ++j) {</span><span leaf=""><br/></span><span leaf="">            if (i + j &lt; size) std::printf(&#34;%02X &#34;, p[i + j]);</span><span leaf=""><br/></span><span leaf="">            else std::printf(&#34;   &#34;);</span><span leaf=""><br/></span><span leaf="">        }</span><span leaf=""><br/></span><span leaf="">        std::printf(&#34; &#34;);</span><span leaf=""><br/></span><span leaf="">        for (size_t j = 0; j &lt; 16 &amp;&amp; i + j &lt; size; ++j) {</span><span leaf=""><br/></span><span leaf="">            unsigned char c = p[i + j];</span><span leaf=""><br/></span><span leaf="">            std::printf(&#34;%c&#34;, (c &gt;= 32 &amp;&amp; c &lt;= 126) ? c : &#39;.&#39;);</span><span leaf=""><br/></span><span leaf="">        }</span><span leaf=""><br/></span><span leaf="">        std::printf(&#34;\n&#34;);</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span leaf="">}</span><span leaf=""><br/></span><span leaf="">static void PrintUs(const char* name, const UNICODE_STRING&amp; us, const void* base)</span><span leaf=""><br/></span><span leaf="">{</span><span leaf=""><br/></span><span leaf="">    const auto baseAddr = reinterpret_cast&lt;uintptr_t&gt;(base);</span><span leaf=""><br/></span><span leaf="">    const auto bufAddr = reinterpret_cast&lt;uintptr_t&gt;(us.Buffer);</span><span leaf=""><br/></span><span leaf="">    std::wprintf(L&#34;%hs: Len=%u Max=%u Buf=%p (off=0x%Ix)  \&#34;%.*s\&#34;\n&#34;,</span><span leaf=""><br/></span><span leaf="">        name,</span><span leaf=""><br/></span><span leaf="">        us.Length,</span><span leaf=""><br/></span><span leaf="">        us.MaximumLength,</span><span leaf=""><br/></span><span leaf="">        us.Buffer,</span><span leaf=""><br/></span><span leaf="">        (bufAddr &gt;= baseAddr) ? (bufAddr - baseAddr) : 0,</span><span leaf=""><br/></span><span leaf="">        us.Length / 2,</span><span leaf=""><br/></span><span leaf="">        us.Buffer ? us.Buffer : L&#34;&#34;);</span><span leaf=""><br/></span><span leaf="">}</span><span leaf=""><br/></span><span leaf="">int wmain()</span><span leaf=""><br/></span><span leaf="">{</span><span leaf=""><br/></span><span leaf="">    // Example payload: create cmd.exe parameters (NOT actually launching here).</span><span leaf=""><br/></span><span leaf="">    std::wstring imagePath = L&#34;\\??\\C:\\Windows\\System32\\cmd.exe&#34;;</span><span leaf=""><br/></span><span leaf="">    std::wstring cmdLine = L&#34;\&#34;C:\\Windows\\System32\\cmd.exe\&#34;&#34;;</span><span leaf=""><br/></span><span leaf="">    UNICODE_STRING usImage = MakeUnicodeString(imagePath);</span><span leaf=""><br/></span><span leaf="">    UNICODE_STRING usCmd = MakeUnicodeString(cmdLine);</span><span leaf=""><br/></span><span leaf="">    HMODULE ntdll = ::GetModuleHandleW(L&#34;ntdll.dll&#34;);</span><span leaf=""><br/></span><span leaf="">    if (!ntdll) {</span><span leaf=""><br/></span><span leaf="">        std::printf(&#34;GetModuleHandleW(ntdll) failed: %lu\n&#34;, ::GetLastError());</span><span leaf=""><br/></span><span leaf="">        return 1;</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span leaf="">    auto pRtlCreate = reinterpret_cast&lt;fnRtlCreateProcessParametersEx&gt;(</span><span leaf=""><br/></span><span leaf="">        ::GetProcAddress(ntdll, &#34;RtlCreateProcessParametersEx&#34;));</span><span leaf=""><br/></span><span leaf="">    auto pRtlDestroy = reinterpret_cast&lt;fnRtlDestroyProcessParameters&gt;(</span><span leaf=""><br/></span><span leaf="">        ::GetProcAddress(ntdll, &#34;RtlDestroyProcessParameters&#34;));</span><span leaf=""><br/></span><span leaf="">    if (!pRtlCreate || !pRtlDestroy) {</span><span leaf=""><br/></span><span leaf="">        std::printf(&#34;GetProcAddress failed. RtlCreate=%p RtlDestroy=%p\n&#34;, pRtlCreate, pRtlDestroy);</span><span leaf=""><br/></span><span leaf="">        return 1;</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span leaf="">    _RTL_USER_PROCESS_PARAMETERSEX* p = nullptr;</span><span leaf=""><br/></span><span leaf="">    constexpr ULONG RTL_USER_PROCESS_PARAMETERS_NORMALIZED = 0x01;</span><span leaf=""><br/></span><span leaf="">    NTSTATUS st = pRtlCreate(</span><span leaf=""><br/></span><span leaf="">        (_RTL_USER_PROCESS_PARAMETERSEX*)&amp;p,</span><span leaf=""><br/></span><span leaf="">        &amp;usImage,</span><span leaf=""><br/></span><span leaf="">        nullptr,</span><span leaf=""><br/></span><span leaf="">        nullptr,</span><span leaf=""><br/></span><span leaf="">        &amp;usCmd,</span><span leaf=""><br/></span><span leaf="">        nullptr,</span><span leaf=""><br/></span><span leaf="">        nullptr,</span><span leaf=""><br/></span><span leaf="">        nullptr,</span><span leaf=""><br/></span><span leaf="">        nullptr,</span><span leaf=""><br/></span><span leaf="">        nullptr,</span><span leaf=""><br/></span><span leaf="">        RTL_USER_PROCESS_PARAMETERS_NORMALIZED);</span><span leaf=""><br/></span><span leaf="">    std::printf(&#34;RtlCreateProcessParametersEx -&gt; 0x%08X, p=%p\n&#34;, static_cast&lt;unsigned&gt;(st), p);</span><span leaf=""><br/></span><span leaf="">    if (st &lt; 0 || !p)</span><span leaf=""><br/></span><span leaf="">        return 1;</span><span leaf=""><br/></span><span leaf="">    // Raw payload dump (what you&#39;d want to mirror in kernel if you&#39;re hand-building).</span><span leaf=""><br/></span><span leaf="">    HexDump(p, sizeof(_RTL_USER_PROCESS_PARAMETERSEX));</span><span leaf=""><br/></span><span leaf="">    //pRtlDestroy(p);</span><span leaf=""><br/></span><span leaf="">    return 0;</span><span leaf=""><br/></span><span leaf="">}</span></code></pre><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.6175925925925926" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-imgfileid="100002179" src="https://wechat2rss.xlab.app/img-proxy/?k=d7d7053f&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLGKcY4e7q0ANGY1jt6sG6MBYo79MCpxqZH03S7ctkgwtVIFsb0avYEhc9OTOOo0MzHm9O2Ocs9Ng%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.5138888888888888" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-imgfileid="100002180" src="https://wechat2rss.xlab.app/img-proxy/?k=f54e066a&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLGKcY4e7q0ANGY1jt6sG6MEeiaWDlEgibZYsVlibOH4oJX0XLib2ibNZjcxz9kl5vhWRTpzTmUSuBWGjA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">实际上，缺失的内容是，我们需要填工作目录，并且要有完整的结构体:</span></p><pre style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 13.118px;margin-top: 0px;margin-bottom: 1rem;overflow: auto;display: block;color: rgb(33, 37, 41);max-height: 400px;background-color: rgb(245, 245, 245);border: 1px solid rgb(204, 204, 204);padding: 0.5em;border-radius: 4px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><code style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: inherit;color: inherit;word-break: normal;white-space: pre-wrap;"><span leaf="">//0x18 bytes (sizeof)</span><span leaf=""><br/></span><span leaf="">struct _CURDIR</span><span leaf=""><br/></span><span leaf="">{</span><span leaf=""><br/></span><span leaf="">    struct _UNICODE_STRING DosPath;                                         //0x0</span><span leaf=""><br/></span><span leaf="">    VOID* Handle;                                                           //0x10</span><span leaf=""><br/></span><span leaf="">};</span><span leaf=""><br/></span><span leaf="">//0x18 bytes (sizeof)</span><span leaf=""><br/></span><span leaf="">struct _RTL_DRIVE_LETTER_CURDIR</span><span leaf=""><br/></span><span leaf="">{</span><span leaf=""><br/></span><span leaf="">    USHORT Flags;                                                           //0x0</span><span leaf=""><br/></span><span leaf="">    USHORT Length;                                                          //0x2</span><span leaf=""><br/></span><span leaf="">    ULONG TimeStamp;                                                        //0x4</span><span leaf=""><br/></span><span leaf="">    struct _STRING DosPath;                                                 //0x8</span><span leaf=""><br/></span><span leaf="">};</span><span leaf=""><br/></span><span leaf="">//0x410 bytes (sizeof)</span><span leaf=""><br/></span><span leaf="">struct _RTL_USER_PROCESS_PARAMETERSEX</span><span leaf=""><br/></span><span leaf="">{</span><span leaf=""><br/></span><span leaf="">    ULONG MaximumLength;                                                    //0x0</span><span leaf=""><br/></span><span leaf="">    ULONG Length;                                                           //0x4</span><span leaf=""><br/></span><span leaf="">    ULONG Flags;                                                            //0x8</span><span leaf=""><br/></span><span leaf="">    ULONG DebugFlags;                                                       //0xc</span><span leaf=""><br/></span><span leaf="">    VOID* ConsoleHandle;                                                    //0x10</span><span leaf=""><br/></span><span leaf="">    ULONG ConsoleFlags;                                                     //0x18</span><span leaf=""><br/></span><span leaf="">    VOID* StandardInput;                                                    //0x20</span><span leaf=""><br/></span><span leaf="">    VOID* StandardOutput;                                                   //0x28</span><span leaf=""><br/></span><span leaf="">    VOID* StandardError;                                                    //0x30</span><span leaf=""><br/></span><span leaf="">    struct _CURDIR CurrentDirectory;                                        //0x38</span><span leaf=""><br/></span><span leaf="">    struct _UNICODE_STRING DllPath;                                         //0x50</span><span leaf=""><br/></span><span leaf="">    struct _UNICODE_STRING ImagePathName;                                   //0x60</span><span leaf=""><br/></span><span leaf="">    struct _UNICODE_STRING CommandLine;                                     //0x70</span><span leaf=""><br/></span><span leaf="">    VOID* Environment;                                                      //0x80</span><span leaf=""><br/></span><span leaf="">    ULONG StartingX;                                                        //0x88</span><span leaf=""><br/></span><span leaf="">    ULONG StartingY;                                                        //0x8c</span><span leaf=""><br/></span><span leaf="">    ULONG CountX;                                                           //0x90</span><span leaf=""><br/></span><span leaf="">    ULONG CountY;                                                           //0x94</span><span leaf=""><br/></span><span leaf="">    ULONG CountCharsX;                                                      //0x98</span><span leaf=""><br/></span><span leaf="">    ULONG CountCharsY;                                                      //0x9c</span><span leaf=""><br/></span><span leaf="">    ULONG FillAttribute;                                                    //0xa0</span><span leaf=""><br/></span><span leaf="">    ULONG WindowFlags;                                                      //0xa4</span><span leaf=""><br/></span><span leaf="">    ULONG ShowWindowFlags;                                                  //0xa8</span><span leaf=""><br/></span><span leaf="">    struct _UNICODE_STRING WindowTitle;                                     //0xb0</span><span leaf=""><br/></span><span leaf="">    struct _UNICODE_STRING DesktopInfo;                                     //0xc0</span><span leaf=""><br/></span><span leaf="">    struct _UNICODE_STRING ShellInfo;                                       //0xd0</span><span leaf=""><br/></span><span leaf="">    struct _UNICODE_STRING RuntimeData;                                     //0xe0</span><span leaf=""><br/></span><span leaf="">    struct _RTL_DRIVE_LETTER_CURDIR CurrentDirectores[32];                  //0xf0</span><span leaf=""><br/></span><span leaf="">    ULONGLONG EnvironmentSize;                                              //0x3f0</span><span leaf=""><br/></span><span leaf="">    ULONGLONG EnvironmentVersion;                                           //0x3f8</span><span leaf=""><br/></span><span leaf="">    VOID* PackageDependencyData;                                            //0x400</span><span leaf=""><br/></span><span leaf="">    ULONG ProcessGroupId;                                                   //0x408</span><span leaf=""><br/></span><span leaf="">    ULONG LoaderThreads;                                                    //0x40c</span><span leaf=""><br/></span><span leaf="">};</span></code></pre><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">再然后稍微的手工填一下，这一步很想用AI忍不住了:</span><span leaf=""><br/></span><span leaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.899074074074074" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-imgfileid="100002181" src="https://wechat2rss.xlab.app/img-proxy/?k=af71de87&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLGKcY4e7q0ANGY1jt6sG6M7ZCsh2oMB9QOgXP5eA3kHn6KsDdibmOPMlV1dxDmuMGU7xYyiczlBnDw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf="">call it!</span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">然后我们就跑起来了</span><span leaf=""><br/></span><span leaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.4065040650406504" data-type="png" data-w="615" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-imgfileid="100002184" src="https://wechat2rss.xlab.app/img-proxy/?k=9dea57a2&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLGKcY4e7q0ANGY1jt6sG6MSR1fyw1U1cuia89jYd9XDXLVwhtjVETibHjWM7FUz9fKELhFJ6fnqgmg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">但是这个有第二个问题，结束了就会蓝屏:</span><span leaf=""><br/></span><span leaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.587037037037037" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-imgfileid="100002186" src="https://wechat2rss.xlab.app/img-proxy/?k=4b1134a5&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLGKcY4e7q0ANGY1jt6sG6MK4TYnXAhQ297aNUWBX6CoA7fjcBq9j3E5wB4Kw3Y9KMXtLE5bD9eiaA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">让我们调查一下,根据信息,错误代码在结束时候,</span><span leaf=""><br/></span><span leaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.3222748815165877" data-type="png" data-w="633" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-imgfileid="100002183" src="https://wechat2rss.xlab.app/img-proxy/?k=417c695f&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLGKcY4e7q0ANGY1jt6sG6M6icrJ0WraxAm2ic19Xqxpwy1MeAXZEnia5j4VvQjBKDeKbYloLqMjYBLg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">执行MmSessionGetWin32Callouts的时候:</span></p><pre style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 13.118px;margin-top: 0px;margin-bottom: 1rem;overflow: auto;display: block;color: rgb(33, 37, 41);max-height: 400px;background-color: rgb(245, 245, 245);border: 1px solid rgb(204, 204, 204);padding: 0.5em;border-radius: 4px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><code style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: inherit;color: inherit;word-break: normal;white-space: pre-wrap;"><span leaf="">.text:000000014008A220                                     MmSessionGetWin32Callouts proc near     ; CODE XREF: NtDeleteAtom+F↓p</span><span leaf=""><br/></span><span leaf="">.text:000000014008A220                                                                             ; PsConvertToGuiThread:loc_14060BEFE↓p ...</span><span leaf=""><br/></span><span leaf="">.text:000000014008A220 65 48 8B 04 25 88 01 00 00                          mov     rax, gs:188h</span><span leaf=""><br/></span><span leaf="">.text:000000014008A229 48 8B 88 B8 00 00 00                                mov     rcx, [rax+0B8h]</span><span leaf=""><br/></span><span leaf="">.text:000000014008A230 48 8B 81 00 04 00 00                                mov     rax, [rcx+400h]</span><span leaf=""><br/></span><span leaf="">.text:000000014008A237 48 83 B8 C0 03 00 00 02                             cmp     qword ptr [rax+3C0h], 2</span><span leaf=""><br/></span><span leaf="">.text:000000014008A23F 48 8D 05 52 E7 3A 00                                lea     rax, PsWin32CallBack</span><span leaf=""><br/></span><span leaf="">.text:000000014008A246 73 07                                               jnb     short locret_14008A24F</span><span leaf=""><br/></span><span leaf="">.text:000000014008A248 48 8D 05 41 E7 3A 00                                lea     rax, PsWin32NullCallBack</span><span leaf=""><br/></span><span leaf="">.text:000000014008A24F</span><span leaf=""><br/></span><span leaf="">.text:000000014008A24F                                     locret_14008A24F:                       ; CODE XREF: MmSessionGetWin32Callouts+26↑j</span><span leaf=""><br/></span><span leaf="">.text:000000014008A24F C3                                                  retn</span><span leaf=""><br/></span><span leaf="">.text:000000014008A24F                                     MmSessionGetWin32Callouts endp</span></code></pre><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">而这个MmSessionGetWin32Callouts读</span></p><pre style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 13.118px;margin-top: 0px;margin-bottom: 1rem;overflow: auto;display: block;color: rgb(33, 37, 41);max-height: 400px;background-color: rgb(245, 245, 245);border: 1px solid rgb(204, 204, 204);padding: 0.5em;border-radius: 4px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><code style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: inherit;color: inherit;word-break: normal;white-space: pre-wrap;"><span leaf="">cmp     qword ptr [rax+3C0h], 2</span></code></pre><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">的时候蓝屏了，这说明我们有什么东西没初始化。寻找这玩意的最好的办法是,ida搜索[rax+3C0h]访问的特征码:</span><span leaf=""><br/></span><span leaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.46296296296296297" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-imgfileid="100002185" src="https://wechat2rss.xlab.app/img-proxy/?k=d357edb6&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLGKcY4e7q0ANGY1jt6sG6MXcmbq2F34LTCN7thePfOicKBbEvEhnsUdxHUgMpEyEWYX4LBxZe1oag%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">根据特征码找一下cal，可以定位到，这个是在初始化win32k pfn的时候填的东西</span><span leaf=""><br/></span><span leaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.5916666666666667" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-imgfileid="100002187" src="https://wechat2rss.xlab.app/img-proxy/?k=aed75c47&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLGKcY4e7q0ANGY1jt6sG6MegV8svIfBgibF52LzyK8iaJiaaJ58VQATEFnCPqcI8H8TuT89cV6icXibAw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">就不卖关子了,我直接说为什么:</span><span leaf=""><br/></span><span leaf="">在操作系统创建进程时，分配进程内存和初始化进程的pfn的时候，会考虑进程的会话和上下文信息，以决定是否允许该进程访问 win32k 的pfn。而我们是直接在系统线程启动的进程，自然就没这些信息。</span><span leaf=""><br/></span><span leaf="">解决方法是附加到一个带界面的信息，比如我附加到资源管理器，这样会话也会自动分配到1而不是0:</span><span leaf=""><br/></span><span leaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.7212962962962963" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-imgfileid="100002188" src="https://wechat2rss.xlab.app/img-proxy/?k=150ccc6f&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLGKcY4e7q0ANGY1jt6sG6MX5xibySpTUoM4ZUY4vlQ2xWPfK00cUtX5UHXC21HTqsZvEfKg25dibXw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">这样你结束就不会蓝屏了，至此我们成功的实现了内核创建进程</span><span leaf=""><br/></span><span leaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.4601851851851852" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-imgfileid="100002189" src="https://wechat2rss.xlab.app/img-proxy/?k=b783f857&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLGKcY4e7q0ANGY1jt6sG6MgSCgrLsTdsgUh9rptERVH4V2iadJmIAYR5J04ic4ib3lvrRotOKUAeTqQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf="">进程回调</span></h2><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">我们在</span><span leaf=""><br/></span><span leaf="">《[2022]新瓶装旧酒: 微软CreateProcessNotify的设计缺陷》</span><span leaf=""><br/></span><span leaf=""><a href="https://key08.com/index.php/2022/10/12/1606.html" target="_blank">https://key08.com/index.php/2022/10/12/1606.html</a></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">中提到过 进程创建会触发createprocessnotify回调，这也是现在很多安全软件所用来监控进程创建的回调。</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.4685185185185185" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-imgfileid="100002191" src="https://wechat2rss.xlab.app/img-proxy/?k=400fc1c5&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLGKcY4e7q0ANGY1jt6sG6MGJTiaYWokrrdKkX7WGdBZlvZCM19T0fu6rH9MvickzEsAibibo3eZyHv3w%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">而这些回调会加入到PspCreateProcessNotifyRoutine里面.在有进程创建的时候，会被逐个执行</span><span leaf=""><br/></span><span leaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.3675925925925926" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-imgfileid="100002194" src="https://wechat2rss.xlab.app/img-proxy/?k=5b7b0b76&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLGKcY4e7q0ANGY1jt6sG6MQZkXeFhFvN0vGqeFR6lrozwDP4ywcDyqKe8Evr2UHxmaHlIx4y3FRw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">这些call最后被”PspCallProcessNotifyRoutines”这个执行:</span><span leaf=""><br/></span><span leaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.3675925925925926" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-imgfileid="100002190" src="https://wechat2rss.xlab.app/img-proxy/?k=306fb36e&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLGKcY4e7q0ANGY1jt6sG6MoH2QnKyaPPicZvuscYIXMSuPDbzhKCFpp46YIW62UdqSQeVdEiaRVib1g%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.649074074074074" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-imgfileid="100002193" src="https://wechat2rss.xlab.app/img-proxy/?k=6f721d51&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLGKcY4e7q0ANGY1jt6sG6MJKvGeiaMuQv5n9WZ2ibS6UPOLZh7y0vxhqQTeic7VZtE8MF666H3Eibatg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">so，有什么不搞DKOM的方法去不触发此类回调呢？有的兄弟，有的，那就是CPU模拟</span></p><h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">AMD64 CPU模拟器</span></h2><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">既然我们控制不了系统的执行流程，那么我们就不控制了，我们自己模拟一个CPU进行执行，只不过给的是真实的信息数据，唯一区别是，在执行PspCallProcessNotifyRoutines的时候,我们就跳过,其他时候跟操作系统一样就行。输入输出完全一样。</span><span leaf=""><br/></span><span leaf="">至于系统的call,我们除了PspCallProcessNotifyRoutines其他的就直接转发。这样我们就能达到目的。</span><span leaf=""><br/></span><span leaf="">如果不理解，这里有一个简单的图：</span><span leaf=""><br/></span><span leaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.6157965194109772" data-type="png" data-w="747" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-imgfileid="100002192" src="https://wechat2rss.xlab.app/img-proxy/?k=d71991ac&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLGKcY4e7q0ANGY1jt6sG6M0UtP46ThgaUMLV31gzkrhf70iad1q4JD26kkYQNSdjbvI7rwb3eJWhA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">架构设计</span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">我这边就最简单的zydis了，手搓的不需要太复杂。一个简单的X86虚拟就只需要指令行为模拟和栈就行，遇到call，我们要么选择转发，要么选择接管。</span><span leaf=""><br/></span><span leaf="">简单来说</span></p><h4 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.5rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">初始化X64的vCpu</span></h4><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="1.3825136612021858" data-type="png" data-w="732" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-imgfileid="100002195" src="https://wechat2rss.xlab.app/img-proxy/?k=b5d8a716&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLGKcY4e7q0ANGY1jt6sG6MGUJKfSr8p9f6kDpAcibrs9Ub6gzAn5X3wWiaOHCr7Z3Uw2A5bfx4rNog%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><h4 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.5rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">一次性decode 15字节</span></h4><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8064814814814815" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-imgfileid="100002197" src="https://wechat2rss.xlab.app/img-proxy/?k=51e4a350&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLGKcY4e7q0ANGY1jt6sG6M9pHIczrnEk4CGUJQZfSMnNOx6GIviafSFAzh5Qg8rbBfibQuBCjI5EYA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><h4 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.5rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">decode后，根据指令读取/写入不同的内存</span></h4><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8527777777777777" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-imgfileid="100002198" src="https://wechat2rss.xlab.app/img-proxy/?k=3a29f9ed&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLGKcY4e7q0ANGY1jt6sG6MDkuOov9wDzHRzvjISnYeWVynl2yy54EOacmQMK27aFOhJg8nKB76SQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">比如mov rax,那就是给vcpu写入值</span><span leaf=""><br/></span><span leaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.34814814814814815" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-imgfileid="100002199" src="https://wechat2rss.xlab.app/img-proxy/?k=e4c19975&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLGKcY4e7q0ANGY1jt6sG6ME9fCAXT2UVrJOe9KKGpIVEfNPpHBHPLjcdzOa7A9ViaQSauUibwq32Fg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">这一段让AI干了，纯苦力牛马活，没AI干不动</span><span leaf=""><br/></span><span leaf="">值得注意的是，一些指令会影响elflags,所以也记得让AI干好,AI会忽略这些影响elfags的指令:</span><span leaf=""><br/></span><span leaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.7175925925925926" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-imgfileid="100002196" src="https://wechat2rss.xlab.app/img-proxy/?k=6f717f7c&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLGKcY4e7q0ANGY1jt6sG6Mxe2zFByT722F7icrR7ksy7drjnUemyUOMQIicVZJ2lZd16rBiajSPK6HQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">执行他</span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">之后就能愉快的把参数PUSH到vm里面并且执行了</span><span leaf=""><br/></span><span leaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.5675925925925925" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-imgfileid="100002203" src="https://wechat2rss.xlab.app/img-proxy/?k=b52a7fff&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLGKcY4e7q0ANGY1jt6sG6MAOaMUGXEsxgEsRNG0vHtmhicYOUTzkaPVYvZ1FmVaCnoFPxiaXVt3Rjw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">值得注意的几个问题是，遇到cfg guard的时候,不要虚拟执行,因为CFG guard的bitmap会校验来源,我们的这种call肯定是非法的。最好的办法是跳过他如何call cfg,我之前手写的时候跳过是硬编码地址,但是GPT说有更好的,嗯…直接硬编码</span><span leaf=""><br/></span><span leaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.262037037037037" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-imgfileid="100002201" src="https://wechat2rss.xlab.app/img-proxy/?k=777951da&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLGKcY4e7q0ANGY1jt6sG6M2YHBlvw38qEFe7VWTHL80OzCF60uvFD19jzIZKWvxuelQ2P1uKmdpw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">如果遇到了直接跳过就行</span><span leaf=""><br/></span><span leaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.16412213740458015" data-type="png" data-w="1048" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-imgfileid="100002200" src="https://wechat2rss.xlab.app/img-proxy/?k=1b08d80b&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLGKcY4e7q0ANGY1jt6sG6MccFiaWAGxa09UicWqc8nbvDPVPb9q4lXJgGOS6yuTtYVGPvoUA25AicgA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">call转发我之前也想的是人模拟参数,但是GPT给了一个更野的,直接全参数call,爱用哪个用哪个:</span><span leaf=""><br/></span><span leaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.625" data-type="png" data-w="592" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-imgfileid="100002202" src="https://wechat2rss.xlab.app/img-proxy/?k=102fc246&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLGKcY4e7q0ANGY1jt6sG6Mompia6S4V8hP4V07Iiau0q9MQI2fYLC383pT6Qu01YL8WYiclvLWT9osQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">还得是AI,真的野，</span><span leaf=""><br/></span><span leaf="">此外我们设置返回地址为0，这样当模拟执行到0的时候，代表执行完成了。</span><span leaf=""><br/></span><span leaf="">我们来试一下直接模拟+call转发的:</span><span leaf=""><br/></span><span leaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.3453703703703704" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-imgfileid="100002204" src="https://wechat2rss.xlab.app/img-proxy/?k=61fa74ad&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLGKcY4e7q0ANGY1jt6sG6MFeK3XU8Jp0snlB4Yjf1m7Aeb5iaJWe4w3HRVcOyKkPW9ZibErB0ic69gg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">可以看到,我们成功的运行了。</span><span leaf=""><br/></span><span leaf="">接下来跳过指定的函数,这也非常容易,我们直接跳过并且返回一个自定义的rax就行,我们跳过的是PspCallProcessNotifyRoutines,他不会修改传递的参数里面的内容,所以简单点就行:</span><span leaf=""><br/></span><span leaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.2657407407407407" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-imgfileid="100002208" src="https://wechat2rss.xlab.app/img-proxy/?k=70737e0d&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLGKcY4e7q0ANGY1jt6sG6Mr89atJNkDam8hAH8e2E3lXe4EBRk8FNBvfsoaNmibgT14O4Wzqcz1DA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">这样我们就实现了完整跳过内核回调了</span></p><h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">结果</span></h2><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">让我们写个简单的createprocess回调看看，他会捕获所有cmd的执行</span><span leaf=""><br/></span><span leaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002206" data-ratio="0.9682242990654205" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" data-w="1070" src="https://wechat2rss.xlab.app/img-proxy/?k=721b41e6&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLGKcY4e7q0ANGY1jt6sG6MMOqc9JKIOQ5nVC6oyEnlIjk5kNcmxexLXaicrAjqAnP2bYGOhOUancA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">当我们执行cmd的时候,他会执行:</span><span leaf=""><br/></span><span leaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.08565928777670838" data-type="png" data-w="1039" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-imgfileid="100002207" src="https://wechat2rss.xlab.app/img-proxy/?k=cab32190&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLGKcY4e7q0ANGY1jt6sG6MkYFrXOIoE1VfoKNznicts7kkRibrmdIbUribqUtVZf4REqVON1FJPPIibw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">我们试试，传统内核直接ntcreateuserprocess:</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">很明显,因为会触发PspCallProcessNotifyRoutines,导致我们被发现:</span><span leaf=""><br/></span><span leaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.3351851851851852" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-imgfileid="100002205" src="https://wechat2rss.xlab.app/img-proxy/?k=18fe9be1&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLGKcY4e7q0ANGY1jt6sG6McYoI6TeeKYFDmiazfHRHkVYUc2rcXHniaaTSysvu5DCwyLUStn4zQydg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">而使用cpu模拟的ntcreateuserprocess,不会触发内核的进程回调的:</span><span leaf=""><br/></span><span leaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.325" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-imgfileid="100002209" src="https://wechat2rss.xlab.app/img-proxy/?k=c403869a&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLGKcY4e7q0ANGY1jt6sG6Mu0Ez6qXQrSgmuIASH055W3DjL1pC9TAHmvwRfR56R8CreDy9K8iacLA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">so…可能好奇的你问,这有什么用.</span><span leaf=""><br/></span><span leaf="">此技术有三个用途:</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">第一个是反作弊,总所周知,部分外挂会通过这些进程创建回调等回调,去拿真实的CR3或者做进程APC注入.而部分反作弊使用这种技术去不触发这些系统的回调启动游戏进程实现保护的效果</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">第二个是,目前绝大部分安全软件,都是基于</span><code style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 13.118px;color: rgb(232, 62, 140);word-break: break-word;"><span leaf="">PspCallProcessNotifyRoutines</span></code><span leaf="">里面的回调创建</span><code style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 13.118px;color: rgb(232, 62, 140);word-break: break-word;"><span leaf="">进程管理器</span></code><span leaf="">的,一旦一个进程不在安全软件自己的</span><code style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 13.118px;color: rgb(232, 62, 140);word-break: break-word;"><span leaf="">进程管理器里面</span></code><span leaf="">,会导致安全软件</span><strong style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-weight: bolder;"><span leaf="">无法监控到这个进程所有的行为</span></strong><span leaf="">,虽然有些脱裤子放屁的嫌疑,因为都驱动了都可以各种手段致盲安全软件了。</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">第三个是,他本来就没什么用,就跟大部分东西一样,写了就是为了提高自己技术.不要以”有什么用”去做某件事,要以”好玩就行”去做某件事。</span></p><p style="display: none;"><mp-style-type data-value="3"></mp-style-type></p>


<p><a href="%27%27">阅读原文</a></p>
<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=42dcfde2&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzkyOTc0NDY2Nw%3D%3D%26mid%3D2247485866%26idx%3D1%26sn%3D027c346f42696ff753a8681b2308e3c2">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Sat, 24 Jan 2026 16:30:00 +0800</pubDate>
    </item>
    <item>
      <title>现代windows内存攻防简介(2026年)</title>
      <link>https://mp.weixin.qq.com/s?__biz=MzkyOTc0NDY2Nw==&amp;mid=2247485822&amp;idx=1&amp;sn=93390a5b33f43d4822bb76b04a6ee436</link>
      <description>简介又过一年了兄弟们，是时候更新冲鸭安全和key08了。主要是1月太忙了，一直忙着新产品，一直没空更新公众号和博客，趁着现在有空赶紧更新一波。</description>
      <content:encoded><![CDATA[<p>原创 <span>为了安全鸭</span> <span>2026-01-13 09:00</span> <span style="display: inline-block;">北京</span></p>






  
  <p><img src="https://wechat2rss.xlab.app/img-proxy/?k=e3e3d85f&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FejibWMxI7nWLiaoSiaatuXoGtnHaD0qljUfiarPowJd4nnyHQCzCyyxG26m2nH5hv1xr3FLt2HqsBkeibogxsNQnazA%2F0%3Fwx_fmt%3Djpeg"/></p>
  
  <h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf="">简介</span></h2><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">又过一年了兄弟们，是时候更新冲鸭安全和key08了。主要是1月太忙了，一直忙着新产品，一直没空更新公众号和博客，趁着现在有空赶紧更新一波。</span></p><h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">shellcode</span></h2><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">安全软件对抗中,常用shellcode作为规避杀毒软件文件查杀的办法,因为shellcode可以内存执行,可以随时抹掉,并且容易变形.</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">一段经典的shellcode loader如下:</span></p><pre style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 13.118px;margin-top: 0px;margin-bottom: 1rem;overflow: auto;display: block;color: rgb(33, 37, 41);max-height: 400px;background-color: rgb(245, 245, 245);border: 1px solid rgb(204, 204, 204);padding: 0.5em;border-radius: 4px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><code style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: inherit;color: inherit;word-break: normal;white-space: pre-wrap;"><span leaf="">    char* shellcode = (char*)VirtualAlloc(</span><br/><span leaf="">        NULL,</span><br/><span leaf="">        shellcode_size,</span><br/><span leaf="">        MEM_COMMIT,</span><br/><span leaf="">        PAGE_EXECUTE_READWRITE);</span><br/><span leaf="">    CopyMemory(shellcode, buf, shellcode_size);</span><br/><span leaf="">    //CreateThread函数，创建线程</span><br/><span leaf="">    hThread = CreateThread(</span><br/><span leaf="">        NULL, // 安全描述符</span><br/><span leaf="">        NULL, // 栈的大小</span><br/><span leaf="">        (LPTHREAD_START_ROUTINE)shellcode, // 函数</span><br/><span leaf="">        NULL, // 参数</span><br/><span leaf="">        NULL, // 线程标志</span><br/><span leaf="">        &amp;dwThreadId // 若成功，接收新创建的线程的线程ID DWORD变量的地址。</span><br/><span leaf="">    );</span></code></pre><blockquote style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin: 5px 0px 15px;overflow: hidden;border-width: 0px 0px 0px 4px;border-top-style: initial;border-right-style: initial;border-bottom-style: initial;border-left-style: solid;border-top-color: initial;border-right-color: initial;border-bottom-color: initial;border-left-color: rgb(122, 208, 58);border-image: initial;padding: 8px 12px;background-color: rgb(241, 241, 241);box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 1px 0px;font-size: 14.992px;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;"><span leaf="">如果你对”他发生了什么”感兴趣自己问chatgpt的VAD/PTE吧,这里我们不废话介绍原理了.</span></p></blockquote><h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">一般检测</span></h2><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">现代的杀毒软件/或者EDR,对于这分配内存,一般会扫一下VAD里面的rwx</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002155" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=9ba67bcd&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLiaoSiaatuXoGtnHaD0qljUfWtZRhTtYabzVEXEgADD1Ha5o7Eghrz2zVALicib2Ug25EhvUmWwByeSQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">代码如下:</span></p><pre style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 13.118px;margin-top: 0px;margin-bottom: 1rem;overflow: auto;display: block;color: rgb(33, 37, 41);max-height: 400px;background-color: rgb(245, 245, 245);border: 1px solid rgb(204, 204, 204);padding: 0.5em;border-radius: 4px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><code style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: inherit;color: inherit;word-break: normal;white-space: pre-wrap;"><span leaf="">MEMORY_BASIC_INFORMATION mbi = { 0 };</span><br/><span leaf="">        SIZE_T address = 0;</span><br/><span leaf="">        while (VirtualQueryEx(hProcess.get(), reinterpret_cast&lt;LPCVOID&gt;(address), &amp;mbi, sizeof(mbi)) == sizeof(mbi))</span><br/><span leaf="">        {</span><br/><span leaf="">            // 排除模块映像段</span><br/><span leaf="">            if (mbi.Type != MEM_IMAGE)</span><br/><span leaf="">            {</span><br/><span leaf="">                // 检查是否可执行</span><br/><span leaf="">                DWORD protect = mbi.AllocationProtect;</span><br/><span leaf="">                bool checkExecuteFlag =</span><br/><span leaf="">                    (protect &amp; PAGE_EXECUTE) ||</span><br/><span leaf="">                    (protect &amp; PAGE_EXECUTE_READ) ||</span><br/><span leaf="">                    (protect &amp; PAGE_EXECUTE_READWRITE) ||</span><br/><span leaf="">                    (protect &amp; PAGE_EXECUTE_WRITECOPY);</span><br/><span leaf="">                if (checkExecuteFlag)</span><br/><span leaf="">                {</span><br/><span leaf="">                    .....</span><br/><span leaf="">                    if (!memoryAvEngin-&gt;ScanProcessBlocks(memoryStreamPtr, false, callback)) {</span><br/><span leaf="">                        printf(&#34;ScanProcessBlock error&#34;);</span><br/><span leaf="">                    }</span><br/><span leaf="">                    .....</span><br/><span leaf="">                }</span><br/><span leaf="">            }</span><br/><span leaf="">            // 跳到下一个内存区域</span><br/><span leaf="">            address = reinterpret_cast&lt;SIZE_T&gt;(mbi.BaseAddress) + mbi.RegionSize;</span><br/><span leaf="">        }</span></code></pre><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">由于VirtualAlloc分配的内存是RWX属性并且不是MEM_IMAGE,所以会被扫出来后匹配特征码。</span></p><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">缺陷</span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">实际上，与大家想的不同，安全软件通常不会直接报RWX为病毒(不过部分**EDR会这样做)。这个原因是 实际环境中，</span><strong style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-weight: bolder;"><span leaf="">基本每个电脑都会或多或少的有几个RWX内存，jit，广告软件，部分加壳软件居多。</span></strong><span leaf="">所以杀毒软件不会看到就报，他一定匹配特征码，并且做匹配:</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">比如ES的yara为例子:</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><a href="https://github.com/elastic/protections-artifacts/blob/main/yara/rules/Windows_Trojan_CobaltStrike.yar" target="_blank">https://github.com/elastic/protections-artifacts/blob/main/yara/rules/Windows_Trojan_CobaltStrike.yar</a></span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002154" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=01c74a3e&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLiaoSiaatuXoGtnHaD0qljUf8Fia1QRicMje3PNfexCUKL0lrLiaARYtVb1jryiccqLTqt1icibolvyJsr9g%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">他不能看到就直接告警，会出现严重问题。必须依赖特征码，并且还有一个致命问题: 依赖进程有RWX的内存，否则就扫不到了。</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><strong style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-weight: bolder;"><span leaf="">总结一个痛点是，必须要能扫到RWX内存，并且必须要匹配特征.</span></strong></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">所以,这种其实后来演变到所谓的”自研C2”/“二开CS”/“SleepMask”。为什么他们能工作的重要原因是,自研/二开的马，没有被拉黑特征，而Sleepmask等一派的东西，他们在休眠的时候是把RWX内存去掉了X属性甚至是混淆了shellcode，导致上面的遍历VAD的代码失效了</span></p><h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">升级检测</span></h2><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">在前面的一般检测遇到瓶颈后，安全厂商发明了新的办法，为了解决前面的所谓的匹配不到RWX的问题,可以用更激进的手段.这边有几种手段:</span></p><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">SleepMask: 检测所谓的RWX切换</span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">部分厂商,比如ES通过TI-ETW检测virtualprotect的切换RWX内存，这样就检测了所谓的SleepMask因为这玩意会切换内存，这挺草台的说实在的，但是能用就不深入说了</span></p><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">不依赖特征: 检测shellcode API调用</span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">为了更好的时机去检测,部分厂商使用API HOOK,去挂钩某些SYSCALL或者某些关键API，挂钩后，检测调用是否来自Shellcode,如果是直接拦截或者阻止,而且不止API调用,也能通过TIETW拿到某些来自shellcode的call从而检测.</span></p><blockquote style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin: 5px 0px 15px;overflow: hidden;border-width: 0px 0px 0px 4px;border-top-style: initial;border-right-style: initial;border-bottom-style: initial;border-left-style: solid;border-top-color: initial;border-right-color: initial;border-bottom-color: initial;border-left-color: rgb(122, 208, 58);border-image: initial;padding: 8px 12px;background-color: rgb(241, 241, 241);box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 1px 0px;font-size: 14.992px;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;"><span leaf="">对这块感兴趣的我强烈建议你购买一份冲鸭安全的EPP开发教程,此事在EPP开发里面有提到</span></p></blockquote><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">缺陷</span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf="">这几个检测手段的缺陷同样有问题,有几个问题:</span></p><ol style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" class="list-paddingleft-1"><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">盲目检测误报大 -生产环境几乎不能用,比如某些严格点策略的组织连x神游戏都打不开,打开直接被拦截.</span></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">为了消除误报,依然使用特征码 -虽然解决了SleepMask导致获取不到shellcode的问题,但是为了减少误报,依然会用特征码尝试对shellcode进行匹配,否则是没办法上生产环境的,依然会被自研C2绕过</span></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">各种花式syscall直接调用，ntdll unhook，调用栈欺骗绕过API的钩子</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002158" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=34118d36&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLiaoSiaatuXoGtnHaD0qljUfmtQLBnickxMQJU4NwI3iboFfK8HibLkVQITuIzhF2103qAcaB4zUlHGXw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p></li></ol><h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">继续升级检测</span></h2><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">大部分厂商在前面两个阶段就停止对抗了,毕竟用户电脑不是战场,而且手段越多误报越多,不方便运维.但是</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><strong style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-weight: bolder;"><span leaf="">部分好一点的厂商为了解决以上的手段,继续加码,对抗到底:</span></strong><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">首先,使用CET技术或者其他调用栈完整性校验技术,去检测异常调用栈,这里分两种,常见是软件类的,不太常见的是硬件类的.先说硬件类型的:</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">CET技术:</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002159" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=40d882f5&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLiaoSiaatuXoGtnHaD0qljUfrhqI8t4r4R6MOPq1FibnR6IKIPicm7iaI0eZKm98SIDasbTxmLYvUA2bg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">Intel Processor Trace技术:</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002161" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=66f67f24&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLiaoSiaatuXoGtnHaD0qljUfib98YcFTVo3MkJvCtSkIJOx5RgZQwic0fQnbeaicUibu1wiaYvVRV6mj24A%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">软件类型的:</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">[2025]SleepDuck-通用堆栈欺骗检测POC,检测SleepMask</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><a class="normal_text_link" target="_blank" style="" href="https://mp.weixin.qq.com/s?__biz=MzkyOTc0NDY2Nw==&amp;mid=2247485281&amp;idx=1&amp;sn=104dc45d47d49fb79648230372f522af&amp;scene=21#wechat_redirect" textvalue="SleepDuck：通用堆栈欺骗检测POC,检测SleepMask" data-itemshowtype="0" linktype="text" data-linktype="2">SleepDuck：通用堆栈欺骗检测POC,检测SleepMask</a></span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">TI-ETW结合调用栈:</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002160" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=3459207b&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLiaoSiaatuXoGtnHaD0qljUfhHxrJRzFBloIlQo40TRnYKibmesNEFCAN5gicuyjPLfUa9vAiazZOltvA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">天守EDR的动态指令追踪技术:</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002157" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=d54f95a3&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLiaoSiaatuXoGtnHaD0qljUfbxvcIUsXEQmU2330697aKWlZZ6uWMm4x1Lt6xM5sqVCOEPVScvLsYg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">结合虚拟执行,检测调用栈完整性:</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002162" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=23f67ac5&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLiaoSiaatuXoGtnHaD0qljUfwHxS24a7fQz7s9ToeXvaqzGHCFuau86RVSm8VhBpY8PiaexL5mUQuGw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">此类软/硬技术结合</span><strong style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-weight: bolder;"><span leaf=""> 就保证了获取的调用栈是真实可靠的,而不是被欺骗的.</span></strong><span leaf="">并且无法通过摘钩进行绕过.反而摘钩/栈欺骗会导致被检测.</span></p><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">缺陷</span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">此类技术,有严重的缺陷,基于硬件的需要硬件达标,暂且不提</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">基于软件的技术,只能EDR来处理数据,EPP是处理不了这些数据的,处理了也会卡本机系统,因此只能在EDR上使用此类技术,成本没有办法降低.</span><strong style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-weight: bolder;"><span leaf="">因此实际做到这一层的很少,实践中也遇到的非常少,总的来说因为成本太大,此类操作不太符合目前的安全市场行情</span></strong></p><h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">下一代展望</span></h2><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">这里多扯几句，如果我以后还在干安全,并且让我来设计下一代怎么检测shellcode内存加载的操作的话,我会先思考两个问题,我们需要解决什么问题? 我们需要怎么做才能彻底解决他?</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">当前所有的检测主要有几个痛点:</span></p><ol style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" class="list-paddingleft-1"><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">检测成本太高</span></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">无论什么手段,为了防止误报,依然无法离开基于特征码的检测</span></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">其实整篇文章我故意忽略了一个细节,</span><strong style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-weight: bolder;"><span leaf="">那如果我们不放到RWX内存呢,会怎么样?</span></strong><span leaf="">答案是全部拉闸,如果你了解外挂就会知道,外挂喜欢找代码洞把shellcode塞到文件段里面,这样就扫不到了.除非更进一步做CRC内存-&gt;文件完整性校验,那样成本更高了.</span></p></li></ol><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">所以,要是让我来搞,我一定会选择语义检测，在如今全是LLMs的时代,我们不能再抱着传统不放手.</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">这是有可能的,我们完全可以这样做:</span></p><ol style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" class="list-paddingleft-1"><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">把shellcode/调用堆栈/等代码变成HLIL,类似于IDA的伪代码一样</span></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">把HLIL送到transformer-base的二分类器里面,就跟以前古早时期那种什么AI检测说的话是不是恶意的话一样.剩下的等结果就行,整个过程非常快,因为不是大模型,是小小模型.</span></p></li></ol><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">这样会解决如下问题:</span></p><ol style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" class="list-paddingleft-1"><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">基于语义的分析,</span><strong style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-weight: bolder;"><span leaf="">即便是不用AI,也能用规则驱动检测</span></strong><span leaf="">,比如检测PEB直接寻找的shellcode,比如检测shellcode里面的内容到底是在干什么,是混淆还是什么</span></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">能检测出不放到RWX段的shellcodes,因为他不需要关心是不是RWX,输入应该是调用栈的各个地址就能开始检测,并且由于没有特征匹配的环节,所以他的速度非常非常的快.</span></p></li></ol><h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">扩展阅读(广告)</span></h2><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><strong style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-weight: bolder;"><span leaf="">我提到的语义分析目前真的不是什么技术难题,shellcode2hlil的引擎已经有了: </span></strong><span leaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002163" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=fd0890eb&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLiaoSiaatuXoGtnHaD0qljUfYHII1DbeYCTFcVMfseicbxqqUXz4t0aBUxVBln9yJm4gsMFSUiaTVyzA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">[2025]在线样本分析平台,下一代文件云鉴定</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><a class="normal_text_link" target="_blank" style="" href="https://mp.weixin.qq.com/s?__biz=MzkyOTc0NDY2Nw==&amp;mid=2247485767&amp;idx=1&amp;sn=2527efc71f3493583fa34c43a7eeec23&amp;scene=21#wechat_redirect" textvalue="大模型的病毒木马文件云鉴定平台(粉丝内测)" data-itemshowtype="0" linktype="text" data-linktype="2">大模型的病毒木马文件云鉴定平台(粉丝内测)</a></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">剩下的就是训练一个transformer分类器就行.</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">本系统已经有部分应用,不过目前接的是大模型,还没接transformer分类器,可以先用着,目前开放体验(还没开放shellcode/elf的检测,只开放了PE的):</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><a class="normal_text_link" target="_blank" style="" href="https://mp.weixin.qq.com/s?__biz=MzkyOTc0NDY2Nw==&amp;mid=2247485757&amp;idx=1&amp;sn=6a9abd8c76b5537f73f64671ff48a7e7&amp;scene=21#wechat_redirect" textvalue="基于大模型的病毒木马文件云鉴定" data-itemshowtype="0" linktype="text" data-linktype="2">基于大模型的病毒木马文件云鉴定</a></span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">目前对于PE的效果非常好,同时其实平台也支持ELF和SHELLCODE,但是我现在暂时没开放,还需要调试这两个</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">比如VT 1报毒的木马:</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002165" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=c66c114e&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLiaoSiaatuXoGtnHaD0qljUf2BFCBdrjtKv54icLIdqlorHOh5oQm9etnXpchicQy4tXYotzVrdicGVibg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" nodeleaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002164" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=670c0c4c&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLiaoSiaatuXoGtnHaD0qljUfsb8S8shejOZqKvIk5LSuCXXXLvsCU2v8FBibfdHb8EOSejdREOiblVwQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">常规ghost:</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002166" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=89c7ac3b&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLiaoSiaatuXoGtnHaD0qljUfQYWvHS4BIvVqrOUQ8ybGEicia2Lib7Ddy7pibGjia1qCaqvImR75HLuiaW6w%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">c#:</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002168" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=c5e9a3ef&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLiaoSiaatuXoGtnHaD0qljUfmRQ8T54LFOwyjtSvPLcFuIvibvOyqcFL6viaNhV7ZODAcVRC18ic8d7hg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">混淆:</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002170" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=9c0406dd&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLiaoSiaatuXoGtnHaD0qljUftyXNVCM7EKiaO0R53KGXLIlL1ic8IW6QQxvGkWNRiaqciaJ2cOj6ecbLsg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">重要的是,核心引擎只有6M,6M还是因为我带了一个libcurl</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002167" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=c37a325d&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLiaoSiaatuXoGtnHaD0qljUfRCbxYtZdtb5Fgpg7n5Nwvphic9Luyq2xvvl5PDeictJ3vJl3Nm0rtVibA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">所以下一步,完全可以携带到客户端,做shellcode分析/病毒分析等.</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100002169" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=9b543bda&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLiaoSiaatuXoGtnHaD0qljUfKUTQLVFfaiaDsnNVkXX5Xe2xOK7WkAk5mkiaibPnia3WjK0K00FDG6ePhg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><p style="display: none;"><mp-style-type data-value="3"></mp-style-type></p>


<p><a href="%27%27">阅读原文</a></p>
<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=6e29f660&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzkyOTc0NDY2Nw%3D%3D%26mid%3D2247485822%26idx%3D1%26sn%3D93390a5b33f43d4822bb76b04a6ee436">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Tue, 13 Jan 2026 09:00:00 +0800</pubDate>
    </item>
    <item>
      <title>大模型的病毒木马文件云鉴定平台(粉丝内测)</title>
      <link>https://mp.weixin.qq.com/s?__biz=MzkyOTc0NDY2Nw==&amp;mid=2247485767&amp;idx=1&amp;sn=2527efc71f3493583fa34c43a7eeec23</link>
      <description></description>
      <content:encoded><![CDATA[<p>原创 <span>huoji</span> <span>2025-12-24 21:17</span> <span style="display: inline-block;">北京</span></p>






  
  <p><img src="https://wechat2rss.xlab.app/img-proxy/?k=9ccd09bd&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FejibWMxI7nWJoCw7zMsqpibxLruv5xuicq4wReVxeSZanq20wJEZzOHPficQD68HTSuRcqXp7wFZhS3k7rEjuVjeyA%2F0%3Fwx_fmt%3Djpeg"/></p>
  
  <p><span leaf="">上一篇文章说到的</span></p><p><span leaf=""><a class="normal_text_link" target="_blank" style="" href="https://mp.weixin.qq.com/s?__biz=MzkyOTc0NDY2Nw==&amp;mid=2247485757&amp;idx=1&amp;sn=6a9abd8c76b5537f73f64671ff48a7e7&amp;scene=21#wechat_redirect" textvalue="基于大模型的病毒木马文件云鉴定" data-itemshowtype="0" linktype="text" data-linktype="2">基于大模型的病毒木马文件云鉴定</a></span></p><p><span leaf="">目前有粉丝内测平台了</span></p><p><span leaf="">微信回复 &#34;分析</span><span leaf="">平台</span><span leaf="">&#34; 得到访问地址</span></p><p><span leaf="">目前只支持PE文件, 这个服务器是一个1H 512M的机器 不要狠蹬</span></p><p><span leaf="">平台亮点</span></p><p><span leaf="">支持AI分析,智能出结果,准确率高,有可解释性:</span></p><p style="text-align: center;" nodeleaf=""><img class="rich_pages wxw-img" data-imgfileid="100002112" data-s="300,640" type="block" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=938a2a5e&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJoCw7zMsqpibxLruv5xuicq4Eqj5icjG1Jg1NrPvicK3tOgtgZ40oacicwx4Pyoae5tKGlNlJ2IV9NqCg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="text-align: center;" nodeleaf=""><img class="rich_pages wxw-img" data-imgfileid="100002114" data-s="300,640" type="block" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=0f28df88&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJoCw7zMsqpibxLruv5xuicq4A1BEEBMJvM6LcZOIq5bOTlKlicTueTnEnwrmzAmicvsKT2x7UW1aOD5Q%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="text-align: center;" nodeleaf=""><img class="rich_pages wxw-img" data-imgfileid="100002113" data-s="300,640" type="block" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=407866e3&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJoCw7zMsqpibxLruv5xuicq4CvGLcT3yOneicsoFbeoDobGGUwtEuQJC0kw4FkjmmtkeVlMgoqP8vCg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="text-align: center;" nodeleaf=""><img class="rich_pages wxw-img" data-imgfileid="100002115" data-s="300,640" type="block" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=7f7f1729&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJoCw7zMsqpibxLruv5xuicq4hl6cE5Ijc67PzfFjs1JDM5FjzeUtic1PYOhvT9ic5ZKBO5YzsPXDElicA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p><span leaf="">反汇编:</span></p><p style="text-align: center;" nodeleaf=""><img class="rich_pages wxw-img" data-imgfileid="100002116" data-s="300,640" type="block" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=06832ee4&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJoCw7zMsqpibxLruv5xuicq4mgBmYrt3WX4LibSNKIxGDR3Vgwl0mDialByDam3fKIoevgScEGOkc6bQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p data-pm-slice="2 1 []"><span leaf="">有任何问题加群反馈(误报/不报):</span></p><p style="text-align: center;" nodeleaf=""><img class="rich_pages wxw-img" data-imgfileid="100002111" data-ratio="1.0609756097560976" data-s="300,640" type="block" data-type="png" data-w="410" src="https://wechat2rss.xlab.app/img-proxy/?k=00bd1cb3&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJoCw7zMsqpibxLruv5xuicq4X9oNeYgjQvYxCooX8ianwqAyrXezibn2MtzAZSmIjm6ugcCP8tPy9y3w%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="display: none;"><mp-style-type data-value="3"></mp-style-type></p>


<p><a href="%27%27">阅读原文</a></p>
<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=57710e24&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzkyOTc0NDY2Nw%3D%3D%26mid%3D2247485767%26idx%3D1%26sn%3D2527efc71f3493583fa34c43a7eeec23">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Wed, 24 Dec 2025 21:17:00 +0800</pubDate>
    </item>
    <item>
      <title>基于大模型的病毒木马文件云鉴定</title>
      <link>https://mp.weixin.qq.com/s?__biz=MzkyOTc0NDY2Nw==&amp;mid=2247485757&amp;idx=1&amp;sn=6a9abd8c76b5537f73f64671ff48a7e7</link>
      <description></description>
      <content:encoded><![CDATA[<p>原创 <span>huoji</span> <span>2025-12-22 10:00</span> <span style="display: inline-block;">北京</span></p>






  
  <p><img src="https://wechat2rss.xlab.app/img-proxy/?k=343ed6cc&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FejibWMxI7nWJ40amxSiawyXpL2zH6KSkMEZFfaYBgUqdLl5768fK84BCBiaaqh9cPTkSIfCvDtDx4xCWpgk9tGL4Q%2F0%3Fwx_fmt%3Djpeg"/></p>
  
  <h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf="">前言</span></h2><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><strong style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-weight: bolder;"><span leaf="">不开玩笑的说,这玩意比实习生靠谱</span></strong><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">事情的起因是一年前我说过做基于HLIL的语义驱动的杀毒引擎,现在年底了,也应该要拿出来了:</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">《2024年终: 木马病毒自动化特征提取&amp;云端机器学习的思路分享》</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><a class="normal_text_link" target="_blank" style="" href="https://mp.weixin.qq.com/s?__biz=MzkyOTc0NDY2Nw==&amp;mid=2247484551&amp;idx=1&amp;sn=4e0edcc586ec733f9d3a8b0ba93b9069&amp;scene=21#wechat_redirect" textvalue="2024年终: 木马病毒自动化特征提取&amp;云端机器学习的思路分享" data-itemshowtype="0" linktype="text" data-linktype="2">2024年终: 木马病毒自动化特征提取&amp;云端机器学习的思路分享</a></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">如果没LLM 我会选择用规则驱动去识别异常代码,但是LLM实在是太好用了，</span><strong style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-weight: bolder;"><span leaf="">他比过去所有所谓的检出规则都好用</span></strong><span leaf="">，所以中途就修改了一下方案，就变成现在的效果了。</span></p><h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">特点</span></h2><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">他相比传统鉴定引擎，有如下优点:</span></p><ol style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" class="list-paddingleft-1"><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">大部分情况下不可绕过 传统规则引擎，能被各种混淆/加密绕过,而这个引擎,就相当于人搁那分析代码,所以各种花里胡哨的绕过反而会被标记成恶意</span></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">越来越强,检出能力和效果会随着样本积累变强</span></p></li></ol><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">当然什么事情都有缺点,实践中他也有如下缺点:</span></p><ol style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" class="list-paddingleft-1"><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">非常依赖反编译引擎,如果反编译引擎拉闸比如不支持RUST,也没办法很好的适配LLM,模型会失去效果 -这个得持续优化代码才行</span></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">大模型容易受到提示词影响比较大,是真的比较大,提示词工程可能需要一段时间的磨练和积累 -这个得通过不断人工干预，得到一个数据合集后，再做微调才行，否则没什么好的办法.</span></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">模型不是专用模型，导致数据积累知识经验不够,目前所有主流的模型都对逆向不太熟悉,幻觉率高,导致检出效果不稳定. -这个可以跟2一样用一样的方法解决</span></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">成本太高 -大模型是通用模型拿来干这种检出成本太高了，但是也可以通过2的方法，搞一个比较小的模型，应该是OK的</span></p></li></ol><h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">技术架构</span></h2><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">核心架构</span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">本质上,我们最终目的是 让大模型读代码 然后输出结果.</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">第一步我们其实是需要一个靠谱的反编译引擎，本来我想直接做MCP的，但是实测下来,IDA/BN/NSA的那个反编译工具 均不能有效的输出想要的东西,更别说遇到ZIG OLLVM RUST golang就属于拉闸的那一步,因为他们没适配，而且速度慢。最重要的是代码不可控,比如BN在跑某些混淆会直接bug闪退,以及这些都要版权费,实在是太折腾了。所以2024年年底就开始折腾一个靠谱的/快速的反汇编引擎</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">具体可以看IDA的F5制作系列</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf=""><a class="normal_text_link" target="_blank" style="" href="https://mp.weixin.qq.com/s?__biz=MzkyOTc0NDY2Nw==&amp;mid=2247484622&amp;idx=1&amp;sn=6849577c509c4243bf45ddfd1c66fe37&amp;scene=21#wechat_redirect" textvalue="IDA背后的原理入门(一): 简介&amp;函数识别" data-itemshowtype="0" linktype="text" data-linktype="2">IDA背后的原理入门(一): 简介&amp;函数识别</a></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf=""><a class="normal_text_link" target="_blank" style="" href="https://mp.weixin.qq.com/s?__biz=MzkyOTc0NDY2Nw==&amp;mid=2247484631&amp;idx=1&amp;sn=ff22b2fe52ffcca4cacee55b256ba014&amp;scene=21#wechat_redirect" textvalue="IDA背后的原理入门(二): 函数大小计算" data-itemshowtype="0" linktype="text" data-linktype="2">IDA背后的原理入门(二): 函数大小计算</a></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf=""><a class="normal_text_link" target="_blank" style="" href="https://mp.weixin.qq.com/s?__biz=MzkyOTc0NDY2Nw==&amp;mid=2247484649&amp;idx=1&amp;sn=afeeed3ec2c8d832bb65c265f1551930&amp;scene=21#wechat_redirect" textvalue="IDA原理入门(三): 控制流追踪与CFG Blocks构建" data-itemshowtype="0" linktype="text" data-linktype="2">IDA原理入门(三): 控制流追踪与CFG Blocks构建</a></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf=""><a class="normal_text_link" target="_blank" style="" href="https://mp.weixin.qq.com/s?__biz=MzkyOTc0NDY2Nw==&amp;mid=2247485061&amp;idx=1&amp;sn=e6df183f46e05b6bad1b8d79df46d2ae&amp;scene=21#wechat_redirect" textvalue="IDA原理入门(四): 函数参数识别" data-itemshowtype="0" linktype="text" data-linktype="2">IDA原理入门(四): 函数参数识别</a></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf=""><a class="normal_text_link" target="_blank" style="" href="https://mp.weixin.qq.com/s?__biz=MzkyOTc0NDY2Nw==&amp;mid=2247485332&amp;idx=1&amp;sn=25ef87ab7af839c54e8e4727bfd045cb&amp;scene=21#wechat_redirect" textvalue="从0制作IDA的F5代码还原功能(hex-rays插件) 上" data-itemshowtype="0" linktype="text" data-linktype="2">从0制作IDA的F5代码还原功能(hex-rays插件) 上</a></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">最终我实现了一个自定义的反汇编引擎,他效果比IDA差,但是给大模型读肯定是够用了,重要的是由于没有太多的编译器优化或者乱七八糟的组件,</span><strong style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-weight: bolder;"><span leaf="">他的速度非常的快而且精准</span></strong><span leaf="">,大概速度是IDA的2-4倍</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><img class="rich_pages wxw-img" data-imgfileid="100002092" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=40b39f56&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJ40amxSiawyXpL2zH6KSkMEicl2pXldF7hsY5AhpVqbXsoSHhGTiaGfCXJZcGbicuZGzAv9QWyrJAbpA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" nodeleaf=""><img class="rich_pages wxw-img" data-imgfileid="100002091" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=490afb78&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJ40amxSiawyXpL2zH6KSkMEBANpXx5AegCs2icrYQOZ3ibvlv5pvMhlceibTRiaY9cY2g32ibrUBOJSNhQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf=""><img class="rich_pages wxw-img" data-imgfileid="100002094" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=bd1dd903&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJ40amxSiawyXpL2zH6KSkMEHviawdQ3AVfakFHoohGIWbr7bvj1uKY68QLBWQuYG7slw9WbpxmxDoA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">而且也专门做了对GO的支持,可能以后要做RUST的支持:</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><img class="rich_pages wxw-img" data-imgfileid="100002093" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=ad554784&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJ40amxSiawyXpL2zH6KSkMEibicu8DU5GZGE4QD8iaVA0a48hzNbbKlTNF5f7q8OGdva1vy6aqLO1pmw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><blockquote style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin: 5px 0px 15px;overflow: hidden;border-width: 0px 0px 0px 4px;border-top-style: initial;border-right-style: initial;border-bottom-style: initial;border-left-style: solid;border-top-color: initial;border-right-color: initial;border-bottom-color: initial;border-left-color: rgb(122, 208, 58);border-image: initial;padding: 8px 12px;background-color: rgb(241, 241, 241);box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 1px 0px;font-size: 14.992px;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;"><span leaf="">对GO的符号解析感兴趣吗?感兴趣的可以私聊我感兴趣,人多了(大于100个人),出一期专门说怎么处理GO的ABI/symbols的操作</span></p></blockquote><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">反汇编引擎的技术架构上,走的是bn的路线,思路来自binnary ninja的blackhat演讲,简单来说,把汇编抽象成LLIL-&gt;MLIL-&gt;HLIL-&gt;CUSTOM IL（比如C/rust/go都行）</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">这个路线不仅成熟，而且也够现代，IDA有历史局限原因，这个就很蛋疼。</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">具体就不展开细说了，大部分时间我其实都在处理最后的HLIL的打印优化上（是的，从机器角度来说够用了，但是人要看得舒服就一定要做大量的打印优化，比如do while,for ,if else），相当于从头写了一个编译器优化pass，而retdec比较聪明，他们用LLVM做优化，但是LLVM也存在不可控，大，慢的问题，所以我最后决定还是自己做，反正是给AI看的。</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">总而言之，花了一年的摸鱼时光，我们现在就有了一个 快速，轻量，可跨平台的反编译器，支持LINUX和MAC和windows和国产系统.而且代码只有大概十万行:</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><img class="rich_pages wxw-img" data-imgfileid="100002090" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=77a35ba6&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJ40amxSiawyXpL2zH6KSkMEibMoWfcickmic5xwNZ3vagxZqto7lFsSomwvbRPYgYOML1S52soohyw2w%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">还是DeepSeek</span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">有了核心基础后,我们要考虑用什么AI模型.最终我选择了DEEPSEEK,原因无他,他便宜。</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">我们知道，工程应用和实验室不一样，工程应用一定要考虑成本，哪怕模型再好，成本太高肯定是不能接受的。DS的能力虽然在我看来做检出非常非常的中庸，但是他是最便宜的,在随随便便就没了几百万token的时代,便宜才是硬道理.</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><img class="rich_pages wxw-img" data-imgfileid="100002096" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=be815ce0&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJ40amxSiawyXpL2zH6KSkMEGz5Huib6XOmBEmiaXohpXYaBVTvcEAKVEa9bQ0mPs3r46OjpJ37ma3Ow%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">一千两百万Token只要四块钱,隔壁GPT哭晕在厕所.</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><img class="rich_pages wxw-img" data-imgfileid="100002097" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=8125f378&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJ40amxSiawyXpL2zH6KSkMEucgaVKVib5IgakLtpLWupUG56ibYBYLEprQyXOwCNicgEQs5uSWq40ArA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" nodeleaf=""><img class="rich_pages wxw-img" data-imgfileid="100002095" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=21073d45&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJ40amxSiawyXpL2zH6KSkME4an7dnvt0icThCDDvMeIUiax2wefUwFUVa9AzbKUKMH3Uy48PsIYk9Lg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">当然这也不是吹DS好,只是因为DS够便宜,所以出问题算我的.</span><strong style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-weight: bolder;"><span leaf="">他实践过程中真的有不少问题</span></strong><span leaf="">,我感觉是我为了兼容他,做了大量修改,而别的模型总是一次过,这里就不细说了,都是提示词和优化流程的问题.</span></p><h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">结论</span></h2><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">最后,我做了一个web节目和命令行,用于批量分析木马,做鉴定,并且给出结论:</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><img class="rich_pages wxw-img" data-imgfileid="100002098" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=7fd88c51&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJ40amxSiawyXpL2zH6KSkMEMlfZqQ9H6EUicdELfl6Tk3gicIh2EoyAZUgIqItWotX6U6fZckhUbEGA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">AI检测到病毒的时候:</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><img class="rich_pages wxw-img" data-imgfileid="100002099" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=05841b89&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJ40amxSiawyXpL2zH6KSkMEGRNHbzK2PJUia5Nj6nBwYEYI6p2GrCTKRbxxSF8x1GBXUvp2UesGLhg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">检测到OLLVM代码混淆</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><img class="rich_pages wxw-img" data-imgfileid="100002102" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=24a8220b&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJ40amxSiawyXpL2zH6KSkMENGIsTNhpF0HVIQSrBkIfF0LQTuicDn6iaFE4kicJEs42I8E3Y9SsDpGcQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">检测到游戏修改器:</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><img class="rich_pages wxw-img" data-imgfileid="100002101" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=1d0e544f&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJ40amxSiawyXpL2zH6KSkMEP3ts8ic1na3esU85bQnA6F1ZGo39xoK4NrTz4R1MXiaHRDboJzgnicomQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">mimikatz:</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><img class="rich_pages wxw-img" data-imgfileid="100002100" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=ddb4abe0&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJ40amxSiawyXpL2zH6KSkMEjCSwPMJzErNDVpVaubPZHMyDHYLf9grbrAk7lPsxX6NoibSw4gyhC2w%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">VT全绿银狐:</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><img class="rich_pages wxw-img" data-imgfileid="100002104" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=58f9134c&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJ40amxSiawyXpL2zH6KSkMEpay46YSoh1vldmibl2e49oR5Ypkpelwg60vxCyJKfvyvVCFCslickBWg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" nodeleaf=""><img class="rich_pages wxw-img" data-imgfileid="100002103" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=c941848f&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJ40amxSiawyXpL2zH6KSkMEojONgrzZVjT1DOJzFAulibiaFqWw3TahQzRO0AByI7wCFcbAdFb6HLPw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p><span leaf="">漏洞驱动:</span></p><p style="text-align: center;" nodeleaf=""><img class="rich_pages wxw-img" data-imgfileid="100002108" data-s="300,640" type="block" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=b3f471d1&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJ40amxSiawyXpL2zH6KSkMEuRBlb5TWAQT2ucNlSrLo5Qj5pVLjIVsvl9Fesvs60UXiaeJvajibIic8g%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">不闭门造车</span></h2><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">本来我想打着不闭门造车的想法加上马上2025年了,把这个开源的.</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">但是目前这个,完成度比较低,bug也贼多(尤其是反编译引擎),所以还是先等我把bug修的差不多了再说吧.不过目前整套引擎已经在外网部署了一套,感兴趣的朋友可以在底下投票,如果票数大于300则进一步搞一个先锋内测群.进一步探索大模型用在杀毒的能力.</span><strong style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-weight: bolder;"><span leaf="">少于300投票则算了不搞了</span></strong><span leaf="">,浪费时间.</span></p><p class="mp_vote_iframe_wrp" nodeleaf=""><mp-common-vote class="js_editor_vote_card js_uneditable custom_select_card mp_vote_iframe" data-pluginname="mpvote" data-supervoteid="459595130" data-expiretime="1767110428" data-votesubject="[{&#34;type&#34;:1,&#34;title&#34;:&#34;搞不搞这个项目的内测!&#34;,&#34;options&#34;:[{&#34;name&#34;:&#34;搞&#34;,&#34;url&#34;:&#34;&#34;,&#34;cnt&#34;:0},{&#34;name&#34;:&#34;不搞,什么电子垃圾&#34;,&#34;url&#34;:&#34;&#34;,&#34;cnt&#34;:0}],&#34;total_cnt&#34;:0}]" data-delflag="0" data-fail="0"></mp-common-vote></p><p style="display: none;"><mp-style-type data-value="3"></mp-style-type></p>


<p><a href="%27%27">阅读原文</a></p>
<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=15fc821b&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzkyOTc0NDY2Nw%3D%3D%26mid%3D2247485757%26idx%3D1%26sn%3D6a9abd8c76b5537f73f64671ff48a7e7">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Mon, 22 Dec 2025 10:00:00 +0800</pubDate>
    </item>
    <item>
      <title>DeepSeek V3.2策略游戏测试 | 进步很大</title>
      <link>https://mp.weixin.qq.com/s?__biz=MzkyOTc0NDY2Nw==&amp;mid=2247485737&amp;idx=1&amp;sn=68961c19d35699cf80801677ac9f3839</link>
      <description>众所周知昨天DS发布了V3.2.据说是极大的提高了智商,所以我准备拿上次的帝国时代2游戏竞技场来复测一次。</description>
      <content:encoded><![CDATA[<p>
原创 <span>huoji</span> <span>2025-12-02 23:42</span> <span style="display: inline-block;">北京</span>
</p>




<p><img src="https://wechat2rss.xlab.app/img-proxy/?k=42255e47&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FejibWMxI7nWLs8wh3NG5EskHDNicasOGCLWypSFRuJSwjmMMlRerMqURtOmWHBU5hLggTnPTjGc9baeWZSd4jR3w%2F0%3Fwx_fmt%3Djpeg"/></p>


<p><span leaf="">众所周知昨天DS发布了V3.2.据说是极大的提高了智商,所以我准备拿上次的帝国时代2游戏竞技场来复测一次。让AI通过MCP工具操作游戏, 玩策略游戏，最终打败对手:</span></p><p><span leaf=""><a class="normal_text_link" target="_blank" style="" href="https://mp.weixin.qq.com/s?__biz=MzkyOTc0NDY2Nw==&amp;mid=2247485632&amp;idx=1&amp;sn=5099048f6d21234acfacb5f13d2c7545&amp;scene=21#wechat_redirect" textvalue="中秋特辑:中外AI大战!让AI们通过MCP玩帝国时代2" data-itemshowtype="0" linktype="text" data-linktype="2">中秋特辑:中外AI大战!让AI们通过MCP玩帝国时代2</a></span></p><p><span leaf=""><span textstyle="" style="font-weight: bold;">这些策略游戏是一个可以很好的考验语言模型的工具。</span></span></p><p><span leaf=""><span textstyle="" style="font-weight: normal;">从资源调度，信息搜集，巨量token是否崩坏，MCP能力，战略决策能力上，能看出一个模型的综合能力.</span></span></p><p><span leaf="">上次只有两个模型是出彩的，一个是国产GLM ，另外一个是国外Claude SN 4.5，而DEEPSEEK属于是中等偏下那一桌</span></p><p><span leaf="">上次测评,DS的主要痛点是:</span></p><p><span leaf="">逐渐崩坏,一开始领先慢慢的变落后最后被反超</span></p><p style="text-align: center;" nodeleaf=""><img class="rich_pages wxw-img" data-imgfileid="100002044" data-ratio="1.037037037037037" data-s="300,640" type="block" data-type="png" data-w="945" src="https://wechat2rss.xlab.app/img-proxy/?k=bc0843ea&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIXtnMFbcKgr3Xf3hTALUw4tku5AN6uw7NA9A2YRuuRibawPFwsZ4njp3KIPBdJW5nZ8YmhMxHEVFw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p><span leaf="">唯一一个主动投降的模型:</span></p><p style="text-align: center;" nodeleaf=""><img class="rich_pages wxw-img" data-imgfileid="100002045" data-ratio="0.163855421686747" data-s="300,640" type="block" data-type="png" data-w="830" src="https://wechat2rss.xlab.app/img-proxy/?k=d13d655a&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIXtnMFbcKgr3Xf3hTALUw4FZ0HTxA8QjXnJbnRnZXjuOGO2gXovfyHMXp8HiaI2XsDcbzibyJXmNBg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p><span leaf="">还要其他的问题，比如空间感知问题(一个农田，非要叠到其他农田上去，导致建造失败-&gt;反复建造-&gt;建造失败....)</span></p><p><span leaf="">而今天晚上发布的v3.2，这些痛点都解决了,首先是thinking过程中调用工具,终于让think模型可以跑tools了而不用额外的&lt;call_tools&gt;</span></p><p style="text-align: center;" nodeleaf=""><img class="rich_pages wxw-img" data-imgfileid="100002047" data-ratio="0.412962962962963" data-s="300,640" type="block" data-type="png" data-w="1080" src="https://wechat2rss.xlab.app/img-proxy/?k=92ab6b0b&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIXtnMFbcKgr3Xf3hTALUw40ibRR8ib5GLMha6Ls5paNOaCLBibjSfKd0SNgIlegWadxL2HQJlpicIssA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p><span leaf="">不过这个东西缺点也很明显，在我的MCP里面，我也不知道为什么，他会无限在think状态调用工具....希望后续官方能出一个限制调用工具次数的东西，否则他的所有输出全部在think里面而不在正常的回复里面了.</span></p><p><span leaf="">但是这些都不是重点，这次新版本，实测几次下来，无论是空间感，资源调度能力，还是MCP调用能力，还是逐渐崩坏的问题 都已经解决了! <span textstyle="" style="font-weight: bold;">并且价格居然还是那么低,低到我不得不连夜发这一篇文章的地步.</span></span></p><p><span leaf=""><span textstyle="" style="font-size: 20px;font-weight: normal;">空间感:</span></span></p><p><span leaf=""><span textstyle="" style="font-weight: normal;">之前ds最显著的问题是,他一个建筑,非要放到另外一个建筑旁边,他对x y z的把握非常非常差差，导致他想新建建筑，但是这个建筑被其他建筑占位了，他又想调整，导致死循环，这一点在建造农田和伐木场的时候尤其明显。</span></span></p><p><span leaf=""><span textstyle="" style="font-weight: normal;">而经过多次测试，这次版本中解决了这个问题,至少农田不卡壳了...</span></span></p><p style="text-align: center;" nodeleaf=""><img class="rich_pages wxw-img" data-imgfileid="100002048" data-ratio="0.31203703703703706" data-s="300,640" type="block" data-type="png" data-w="1080" src="https://wechat2rss.xlab.app/img-proxy/?k=d57630bd&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIXtnMFbcKgr3Xf3hTALUw4o6A1OKb1aCJJ89HUxgE6kaDfFJtRRvds13tYHiaficF7XgbcIUxYprXQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p><span leaf=""><span textstyle="" style="font-weight: normal;">伐木场的摆放顺序也非常正确</span></span></p><p style="text-align: center;" nodeleaf=""><img class="rich_pages wxw-img" data-imgfileid="100002049" data-ratio="0.6802083333333333" data-s="300,640" type="block" data-type="png" data-w="960" src="https://wechat2rss.xlab.app/img-proxy/?k=1eec5e4a&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIXtnMFbcKgr3Xf3hTALUw4QQAMqUibPE9CuJUShZof7Qckyum5XaoGHLhv5Bo0OEQK62ygLakQPHA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p><span leaf=""><span textstyle="" style="font-weight: normal;">他的农田摆放居然懂得围绕磨坊来摆放,这以前版本是不可能的</span></span></p><p style="text-align: center;" nodeleaf=""><img class="rich_pages wxw-img" data-imgfileid="100002050" data-ratio="0.6628630705394191" data-s="300,640" type="block" data-type="png" data-w="964" src="https://wechat2rss.xlab.app/img-proxy/?k=20310259&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIXtnMFbcKgr3Xf3hTALUw4vPWX8Q2aAamw9ic9jTo3ic7vH01TPHXFAE2VibraibWBmuZiaIdR5cia0S5Q%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="text-align: center;" nodeleaf=""><img class="rich_pages wxw-img" data-imgfileid="100002051" data-ratio="0.3453703703703704" data-s="300,640" type="block" data-type="png" data-w="1080" src="https://wechat2rss.xlab.app/img-proxy/?k=1c22fdde&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIXtnMFbcKgr3Xf3hTALUw4mYmCObVgKWmGDpzbLmjNuSXedIyrMEaq6wbvznicvLAmBMJysAKFKlw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p><span leaf="">建造的时候已经学会正确的先观察有没有物体防止堆叠</span></p><p style="text-align: center;" nodeleaf=""><img class="rich_pages wxw-img" data-imgfileid="100002052" data-ratio="0.27037037037037037" data-s="300,640" type="block" data-type="png" data-w="1080" src="https://wechat2rss.xlab.app/img-proxy/?k=2fa7d742&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIXtnMFbcKgr3Xf3hTALUw4KrQC92JicbRRLZmIQgPe8ibQs4qv9fyvAkF1JbACr0knU0Gdykdx9u9w%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p><span leaf="" data-pm-slice="1 1 [&#34;para&#34;,{&#34;tagName&#34;:&#34;p&#34;,&#34;attributes&#34;:{},&#34;namespaceURI&#34;:&#34;http://www.w3.org/1999/xhtml&#34;}]"><span textstyle="" style="font-size: 20px;">资源调度能力</span></span></p><p><span leaf="" data-pm-slice="1 1 [&#34;para&#34;,{&#34;tagName&#34;:&#34;p&#34;,&#34;attributes&#34;:{},&#34;namespaceURI&#34;:&#34;http://www.w3.org/1999/xhtml&#34;}]"><span textstyle="" style="font-size: 17px;">之前的一大痛点就是,他的村民调度能力实在是不行,经常出现十来个村民搁那空闲不干事。这次资源调度表现比之前好很多，经过多轮测试，他现在已经有意识的让村民保持干活状态了:</span></span></p><p><span leaf=""><span textstyle="" style="font-size: 17px;">闲置率基本能保持在1-5个左右:</span></span></p><p style="text-align: center;" nodeleaf=""><img class="rich_pages wxw-img" data-imgfileid="100002053" data-ratio="0.575925925925926" data-s="300,640" type="block" data-type="png" data-w="1080" src="https://wechat2rss.xlab.app/img-proxy/?k=75f28fb1&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIXtnMFbcKgr3Xf3hTALUw4sKXEEZ3wR7MfoQ3IgkiaNQcRDdIOEHDMLNoYbd6a8Bq1qTAHxEIdQ6A%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p><span leaf=""><span textstyle="" style="font-size: 17px;">会主动让村民干活</span></span></p><p><span leaf=""><span textstyle="" style="font-size: 17px;">而升级时代的速度,和资源的分数上,也是首次出现超过AI的水平</span></span></p><p><span leaf=""><span textstyle="" style="font-size: 20px;">战略决策能力</span></span></p><p><span leaf=""><span textstyle="" style="font-size: 16px;">GLM/Claude知道在封建时代派兵骚扰，城堡时代攻城武器攻击，并且建造箭塔进行防御,之前DS只会防御不会进攻,进攻也只是搞笑的几个骑士,也不会造攻城武器,而这次有了很大进步:</span></span></p><p style="text-align: center;" nodeleaf=""><img class="rich_pages wxw-img" data-imgfileid="100002056" data-ratio="0.3861111111111111" data-s="300,640" type="block" data-type="png" data-w="1080" src="https://wechat2rss.xlab.app/img-proxy/?k=5c44b105&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIXtnMFbcKgr3Xf3hTALUw4Sy54tVPKZb56AwMZky4RQkUb0fq5buf2lSMMFdNmIibZDn0tvbllfUw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p><span leaf="">他的进攻计划,跟其他不同,他进攻之前一定要满科技:</span></p><p style="text-align: center;" nodeleaf=""><img class="rich_pages wxw-img" data-imgfileid="100002057" data-ratio="0.36574074074074076" data-s="300,640" type="block" data-type="png" data-w="1080" src="https://wechat2rss.xlab.app/img-proxy/?k=264103d8&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIXtnMFbcKgr3Xf3hTALUw40l6UpRC3Jfp1GzArQ1ySHUZB2ITTedAicCZNbzAhibu9LU1oJctR8ic7A%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p><span leaf=""><span textstyle="" style="font-size: 16px;">然后准备攻城武器:</span></span></p><p style="text-align: center;" nodeleaf=""><img class="rich_pages wxw-img" data-imgfileid="100002058" data-ratio="0.3314814814814815" data-s="300,640" type="block" data-type="png" data-w="1080" src="https://wechat2rss.xlab.app/img-proxy/?k=2afb35e5&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIXtnMFbcKgr3Xf3hTALUw4clhviae2TJBcal5JmGJoO1ZxlzXzGvF7WAfVcOz9KpXerWRVmLnc9zA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p><span leaf="">跟上次不同，他现在会袭扰农民战术:</span></p><p style="text-align: center;" nodeleaf=""><img class="rich_pages wxw-img" data-imgfileid="100002059" data-ratio="0.15925925925925927" data-s="300,640" type="block" data-type="png" data-w="1080" src="https://wechat2rss.xlab.app/img-proxy/?k=0e84f80b&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIXtnMFbcKgr3Xf3hTALUw4M6pJicXN538lpd4gef9AnOTaoq9MIk0z9GlmLkchGOd4olU3bIPZT1Q%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p><span leaf="">派出的部队:</span></p><p style="text-align: center;" nodeleaf=""><img class="rich_pages wxw-img" data-imgfileid="100002060" data-ratio="0.5740740740740741" data-s="300,640" type="block" data-type="png" data-w="1080" src="https://wechat2rss.xlab.app/img-proxy/?k=4baf3937&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIXtnMFbcKgr3Xf3hTALUw4qBUVnZEXQWTCTEVLhMg2WEGgMjLm5yRxwNIwZVTOQDHy5be6icpZrow%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p><span leaf="">不过有点搞笑,派出的部队走得太慢打不到敌人，背后跟了一堆野生动物</span></p><p style="text-align: center;" nodeleaf=""><img class="rich_pages wxw-img" data-imgfileid="100002062" data-ratio="0.372615039281706" data-s="300,640" type="block" data-type="png" data-w="891" src="https://wechat2rss.xlab.app/img-proxy/?k=bca61695&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIXtnMFbcKgr3Xf3hTALUw4EICZmMPbciaDKgUxjibHSK9p1A5o8zLVqrRDQyIhWoLRibtZ6kUmH8ibbw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p><span leaf="">然后这些部队被野生动物吃掉了</span></p><p style="text-align: center;" nodeleaf=""><img class="rich_pages wxw-img" data-imgfileid="100002063" data-ratio="0.708649468892261" data-s="300,640" type="block" data-type="png" data-w="659" src="https://wechat2rss.xlab.app/img-proxy/?k=4c39c9be&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIXtnMFbcKgr3Xf3hTALUw4f0pk4I7FXMXG5cnyLwoSfnLTI5XLdOlDRASHECUYHkFHcYx2vG7VfQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p><span leaf=""><span textstyle="" style="font-size: 16px;">标记地点,造攻城武器:</span></span></p><p style="text-align: center;" nodeleaf=""><img class="rich_pages wxw-img" data-imgfileid="100002061" data-ratio="0.39814814814814814" data-s="300,640" type="block" data-type="png" data-w="1080" src="https://wechat2rss.xlab.app/img-proxy/?k=ea91f951&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIXtnMFbcKgr3Xf3hTALUw4vjP76UlUyPlOwLhh4yPVgnEXGfR4dKia3iboJcFF81ErVian6qtlJQCMw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p><span leaf=""><span textstyle="" style="font-size: 16px;">总的来说,有进步,但是没GLM/Claude那么聪明,这两个会直城，并且派兵骚扰，建造攻城武器联合进攻，造弓箭手。而DS更倾向于两个兵种，长矛兵和骑士。。。不知道为什么</span></span></p><p style="text-align: center;" nodeleaf=""><img class="rich_pages wxw-img" data-imgfileid="100002064" data-ratio="0.6433566433566433" data-s="300,640" type="block" data-type="png" data-w="715" src="https://wechat2rss.xlab.app/img-proxy/?k=7253b70d&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIXtnMFbcKgr3Xf3hTALUw49R9D5Yxm6qpib9flkKVIg12giaPbJD6TLgHtMwYC4kJZAp0mPfSzhiaVg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p><span leaf=""><span textstyle="" style="font-size: 20px;">价格</span></span></p><p><span leaf=""><span textstyle="" style="font-size: 15px;font-weight: bold;">价格真的是这个模型最大的优势，在一场接近2小时的帝国时代2的MCP高强度调用后，我居然实际只花费了27块</span></span></p><p style="text-align: center;" nodeleaf=""><img class="rich_pages wxw-img" data-imgfileid="100002065" data-ratio="0.7314814814814815" data-s="300,640" type="block" data-type="png" data-w="1080" src="https://wechat2rss.xlab.app/img-proxy/?k=1b68b192&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIXtnMFbcKgr3Xf3hTALUw4xZ8ZxHscKC5kQIganUFEicQzwxiaia4ZxPgHYB6J1saQziaV5QySuN5MRA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p><span leaf="">而同样的模型GLM花费200左右，<span textstyle="" style="font-weight: bold;">claude花费了1200人民币 ，还是用了1rmb=1美刀的中转站。要不然我就直接破产了。</span></span></p><p><span leaf=""><span textstyle="" style="font-size: 15px;">所以别说好不好用，他价格就这样，这种价格，即便是代码写出bug了，也是我的问题</span></span></p><p><span leaf=""><span textstyle="" style="font-size: 20px;">总结</span></span></p><p><span leaf=""><span textstyle="" style="font-size: 15px;">从最终效果来看，</span><span textstyle="" style="font-size: 15px;font-weight: bold;">进步非常之大，</span><span textstyle="" style="font-size: 15px;font-weight: normal;">相当于从完全不能用的人机，变成了能跟帝国时代2里面的简单电脑切磋的水平.....虽然策略类游戏跟GLM和CLAUDE还有一段距离.但是考虑到价格因素，让我们继续拭目以待.....(话说回来，也就GLM和CLAUDE能打策略类游戏，GPT5也打不了)</span></span></p><p><span leaf=""><span textstyle="" style="font-size: 15px;font-weight: normal;">当前DSV3.2和AI的比分,两个相似,相当 于是简单人机吧:</span></span></p><p><span leaf=""><img class="rich_pages wxw-img" data-imgfileid="100002054" data-ratio="0.62109375" data-s="300,640" type="block" data-type="png" data-w="512" src="https://wechat2rss.xlab.app/img-proxy/?k=97a8ea15&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIXtnMFbcKgr3Xf3hTALUw43m0LXerIPVBqZSQkmibg4Ip0XOGLg0xxf8LriaoTNCLEn7ibpibiadE53Jg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><p><span leaf="">隔壁GLM的,碾压水平,起码相当于困难电脑:</span></p><p><span leaf=""><img class="rich_pages wxw-img" data-imgfileid="100002055" data-ratio="0.642962962962963" data-s="300,640" type="block" data-type="png" data-w="675" src="https://wechat2rss.xlab.app/img-proxy/?k=6c0fc9d7&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIXtnMFbcKgr3Xf3hTALUw4z1j92aosJMYxAXg53EZwCWqM7k9C0L67icAYJeuV23BqjQWvpan1Dbw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><p><span leaf="">现在这么便宜的东西都已经效果这么好了，已经迫不及待的等下一个大版本了</span></p><p style="display: none;"><mp-style-type data-value="3"></mp-style-type></p>


<p><a href="2247485737">阅读原文</a></p>
<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=0a202880&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzkyOTc0NDY2Nw%3D%3D%26mid%3D2247485737%26idx%3D1%26sn%3D68961c19d35699cf80801677ac9f3839">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Tue, 02 Dec 2025 23:42:00 +0800</pubDate>
    </item>
    <item>
      <title>&#34;破碎注入&#34;无痕注入不使用任何进程句柄的注入技术原理分析</title>
      <link>https://mp.weixin.qq.com/s?__biz=MzkyOTc0NDY2Nw==&amp;mid=2247485690&amp;idx=1&amp;sn=774ef1b6f5a1299414aa781c979d71f7</link>
      <description>破碎攻击(Shatter Attack)概念来源所谓 Shatter Attack 是一种早期（主要在 Win</description>
      <content:encoded><![CDATA[<p>
原创 <span>huoji</span> <span>2025-11-27 00:18</span> <span style="display: inline-block;">北京</span>
</p>




<p><img src="https://wechat2rss.xlab.app/img-proxy/?k=083006ce&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FejibWMxI7nWKfJS6hDmDibrqnegDIKSibVXEeSUdsNhMW7CBSdmxuTnv3Sf1kjY7cqPcWUcdsSnibeLj9A90XBV2hA%2F0%3Fwx_fmt%3Djpeg"/></p>


<h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf="">破碎攻击(Shatter Attack)</span></h3><h4 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.5rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">概念来源</span></h4><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">所谓 Shatter Attack 是一种早期（主要在 Windows NT、Windows 2000、Windows XP 时代被关注）的本地特权提升攻击方式。它利用的是 Windows 消息机制（Windows Messages）在同一桌面（desktop）环境下没有足够的安全隔离这一漏洞。</span></p><h4 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.5rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">Windows 消息机制的背景</span></h4><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">在 Windows 图形界面系统里，GUI 线程之间可以通过 SendMessage / PostMessage 等 API 发送消息。</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">这些消息（WM_XXX）会被目标窗口的回调过程（WindowProc 或过程函数）处理。</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">在设计上，所有同一交互会话中的应用程序都可以给彼此发送消息——包括输入消息、控制消息、甚至某些带有内存指针的结构（如 WM_TIMER、WM_COPYDATA、WM_SETTEXT）。如果目标进程是一个高权限进程（例如以管理员账户运行的 GUI 程序），而攻击者的低权限进程能向它发送精心构造的消息，就有可能诱使目标进程执行任意代码。</span></p><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">攻击原理</span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">攻击者写一个低权限程序，找到同一桌面上运行的高权限进程窗口句柄（比如系统配置工具、服务管理器 GUI）。</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">利用 Windows 消息机制，向窗口过程发送带有指针的消息，让高权限进程执行某种动作（如调用回调函数、写入/读出内存）。</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">因为消息处理代码是在目标进程的上下文中执行的，这会让攻击者的代码在高权限进程里运行，从而提升权限。</span></p><h4 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.5rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">使用的漏洞点</span></h4><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">当时的核心问题：</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">高权限 GUI 程序与低权限 GUI 程序运行在同一个交互桌面 (interactive desktop) 上。</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">Windows 消息机制在用户模式下允许跨进程发送，并且缺乏足够的权限检查。</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">这种情况就被形象地称为 “Shatter”（打碎安全界限）攻击，因为它“打碎”了权限隔离的边界。</span></p><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">影响与修复</span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">微软在后续更新（尤其是 Windows XP SP2 以后）中，加强了对 SendMessage 等 API 的检查，限制不同安全级别进程之间的消息交互。</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">从 Windows Vista 开始，引入了 “用户界面特权隔离” (User Interface Privilege Isolation, UIPI) / 低完整性级别机制，阻止低权限程序向高权限程序发送某些危险消息。</span></p><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">现代复兴</span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">这个跟Storm-0978的利用路线一样,我们先说一下时间线:</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf=""><a class="normal_text_link" target="_blank" style="" href="https://mp.weixin.qq.com/s?__biz=MzkyOTc0NDY2Nw==&amp;mid=2247484443&amp;idx=1&amp;sn=d75d5cb737745dd9d5106967bfd94f55&amp;scene=21#wechat_redirect" textvalue="深度研究APT组织Storm0978的高级注入技术StepBear" data-itemshowtype="0" linktype="text" data-linktype="2">深度研究APT组织Storm0978的高级注入技术StepBear</a></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">2017年最开始被人拿去在CSGO上搞外挂，因为这是</span><strong style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-weight: bolder;"><span leaf="">一种不用进程句柄的远程进程读写技术</span></strong><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><img class="rich_pages wxw-img" data-imgfileid="100002026" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=0eceb2cd&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWKfJS6hDmDibrqnegDIKSibVX4CyxGhrt1jtXE3ibkyca1Z47ybCZmtKebJNicK2mfg4dThaOmddNHv0g%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">2022年又被提出来了一次</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><img class="rich_pages wxw-img" data-imgfileid="100002030" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=90b9b659&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWKfJS6hDmDibrqnegDIKSibVXp6LYaxQ0v0WByOebROIYibG6r33GSsyAuUEkcPDZdUstHsdy5IjvkKg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">并且有人提到有恶意软件在使用</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><img class="rich_pages wxw-img" data-imgfileid="100002027" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=4a6d86ed&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWKfJS6hDmDibrqnegDIKSibVXrGbxQHN75v4ibQRPIvOdP7KJugVibBpJC9gXIibTian46Phcx3ia6caCMDg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><strong style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-weight: bolder;"><span leaf="">2023年的时候跟汪总稍微研究了一下,因为我发现有人利用,所以才接触到此类技术,稍微在key08提了一嘴:</span></strong><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">[2023]阻止window hook exploit meme</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><a href="https://key08.com/index.php/2023/12/30/1823.html" target="_blank">https://key08.com/index.php/2023/12/30/1823.html</a></span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><img class="rich_pages wxw-img" data-imgfileid="100002029" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=bb61ccd2&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWKfJS6hDmDibrqnegDIKSibVX0lHRqp8Kv98YyTjmyIl74iacFgibrDlWhhgcay0iaNibJmnsrHzknL5DKQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">2024年就看到毛子APT在大规模滥用了</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">再然后,这种东西就跟VMP3源码一样，传来传去,到最后免费送了, 所以</span><strong style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-weight: bolder;"><span leaf="">到现在,被开源了</span></strong><span leaf="">,那也没什么好藏着掖着的了,直接来介绍这块吧.</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">这项技术的优点的:</span></p><ol style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" class="list-paddingleft-1"><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><strong style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-weight: bolder;"><span leaf="">不用任何句柄</span></strong><p><span leaf="">,这意味着,大部分常见的EDR/EPP检测注入手段全部失效.</span></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">很难进行行为检测,恶意软件利用基本能实现断链.</span></p></li></ol><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">缺点:</span></p><ol style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" class="list-paddingleft-1"><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">开了CFG拉闸</span></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">很多窗口默认都开了CFG, 所以一般游戏用得多.但是对于安全领域,</span><strong style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-weight: bolder;"><span leaf="">总有些窗口是没CFG的</span></strong></p></li></ol><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">没开CFG的窗口</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><img class="rich_pages wxw-img" data-imgfileid="100002028" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=3a5a63c0&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWKfJS6hDmDibrqnegDIKSibVXmOU7ozlUME5JhxibR4KSJJ3m2ibCH3iaFlWiba7m9tls4InNSTbzTjd1jg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">开了的:</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><img class="rich_pages wxw-img" data-imgfileid="100002035" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=316f789f&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWKfJS6hDmDibrqnegDIKSibVXY31Ugk1DnW31uyciaIriaicyaqjXjVW8CmEcM5a77w4JdgFfwVe0QqicGQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">核心原理介绍</span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">让AI复习一下setwindowshook的工作原理</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><img class="rich_pages wxw-img" data-imgfileid="100002034" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=2ab5d385&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWKfJS6hDmDibrqnegDIKSibVXznZtRBznsbApGjdg8y07OeoUwto0gf4NF07sfQkoCPCgou0ohts5jw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">发现盲点了吗~ 通过setwindowshook我们可以实现</span><strong style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-weight: bolder;"><span leaf="">让具有窗口的程序执行任意代码</span></strong></p><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">任意代码执行</span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">SetWindowsHookEx负责设置要执行的位置,而我们还需要执行的代码，而SendMessage是非常好的执行的API,但是我们依然要找个gate,来把 </span><code style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 13.118px;color: rgb(232, 62, 140);word-break: break-word;"><span leaf="">msg-&gt;wparam</span></code><span leaf="">、</span><code style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 13.118px;color: rgb(232, 62, 140);word-break: break-word;"><span leaf="">msg-&gt;lparam</span></code><span leaf=""> 和 </span><code style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 13.118px;color: rgb(232, 62, 140);word-break: break-word;"><span leaf="">msg-&gt;id</span></code><span leaf=""> 反序列化到三个不同的寄存器，然后通过 JMP [RAX] 调用 </span><code style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 13.118px;color: rgb(232, 62, 140);word-break: break-word;"><span leaf="">msg-&gt;lparam</span></code><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">所以作者准备了两个gate,作为布局,分别是RtlpFcChangeRegistrationCallback和_PsxaCallOwner</span></p><blockquote style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin: 5px 0px 15px;overflow: hidden;border-width: 0px 0px 0px 4px;border-top-style: initial;border-right-style: initial;border-bottom-style: initial;border-left-style: solid;border-top-color: initial;border-right-color: initial;border-bottom-color: initial;border-left-color: rgb(122, 208, 58);border-image: initial;padding: 8px 12px;background-color: rgb(241, 241, 241);box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 1px 0px;font-size: 14.992px;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;"><span leaf="">而毛子的APT组织用的是I_RpcFreePipeBuffer</span></p></blockquote><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">整个流程如下</span></p><pre style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 13.118px;margin-top: 0px;margin-bottom: 1rem;overflow: auto;display: block;color: rgb(33, 37, 41);max-height: 400px;background-color: rgb(245, 245, 245);border: 1px solid rgb(204, 204, 204);padding: 0.5em;border-radius: 4px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><code style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: inherit;color: inherit;word-break: normal;white-space: pre-wrap;"><span leaf=""> SendMessageA(hwnd, WM_APPCOMMAND, wparam, lparam)</span><br/><span leaf="">      ↓</span><br/><span leaf="">  SetWindowsHookEx的 WH_SHELL Hook 被触发，执行 w (write gadget)</span><br/><span leaf="">      ↓</span><br/><span leaf="">  w 读取 wparam 结构体中的 function_ptr (即 t)</span><br/><span leaf="">      ↓</span><br/><span leaf="">  t (trampoline) 解析参数，调用 memcpy 字段指向的实际函数</span><br/><span leaf="">      ↓</span><br/><span leaf="">  实际目标函数执行 (RtlCopyString, malloc, 或任意函数)</span></code></pre><h4 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.5rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">第一个gate</span></h4><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">这个代码里面，作者第一个gate是</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">RtlpFcChangeRegistrationCallback</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">一旦发送消息后,目标进程就会执行</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">gate_one(nCode, wParam, lParam)</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">而这个地方长这样:</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><img class="rich_pages wxw-img" data-imgfileid="100002031" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=a9e69160&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWKfJS6hDmDibrqnegDIKSibVXN2fZRrFyoFGJqhDnQ1hbzRk6SAeeYXgrxNcttxujwTmPibs1lUa6ibibA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">改个名字：</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><img class="rich_pages wxw-img" data-imgfileid="100002032" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=62abe4f2&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWKfJS6hDmDibrqnegDIKSibVXXyz8qOlop08nCHJQCRibkbCiaJgzvtLz6FNm3warwr8GMoicu0k2T2ibBg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><pre style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 13.118px;margin-top: 0px;margin-bottom: 1rem;overflow: auto;display: block;color: rgb(33, 37, 41);max-height: 400px;background-color: rgb(245, 245, 245);border: 1px solid rgb(204, 204, 204);padding: 0.5em;border-radius: 4px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><code style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: inherit;color: inherit;word-break: normal;white-space: pre-wrap;"><span leaf="">__int64 __fastcall RtlpFcChangeRegistrationCallback(__int64 a1, __int64 a2)</span><br/><span leaf="">{</span><br/><span leaf="">  RtlAcquireSRWLockExclusive(a2 + 0x20);</span><br/><span leaf="">  (*(void (__fastcall **)(_QWORD))(a2 + 0x10))(*(_QWORD *)(a2 + 0x18));</span><br/><span leaf="">  return RtlReleaseSRWLockExclusive(a2 + 32);</span><br/><span leaf="">}</span></code></pre><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">他会执行wParam+0x10的代码,并且把0x18当作参数1传入到里面,也就是开始执行第二个gate</span></p><h4 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.5rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">第二个gate</span></h4><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">第二个gate在shell32里面,叫做_PsxaCallOwner,参数1成了前一个gate写的wpawn + 0x18了</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">而参数2,rdx成了之前的wpawn的0+0x8了:</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><img class="rich_pages wxw-img" data-imgfileid="100002033" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=c9a277d7&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWKfJS6hDmDibrqnegDIKSibVXSoyJ42gS57vcH3g09saB0dMeGVLAyRl5Fj2ZNHNxdSM76V291gbzXg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">然后就会call rax,这个rax本来应该是0的,但是前一个RtlpFcChangeRegistrationCallback会设置rax=rbx+0x10 也就是wpawn + 0x10 所以这玩意就成最终的call函数地址了:</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><img class="rich_pages wxw-img" data-imgfileid="100002036" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=6bd047ab&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWKfJS6hDmDibrqnegDIKSibVXUuyMQMPWp7FTyfic0rIEef5EZaG0nWric2LFaJSlW45SuBBBPtgMX00A%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">从而实现了任意进程函数调用,任意进程读写.而不用任何windows的API.一次能读写8字节数据..</span></p><h4 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.5rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">总结</span></h4><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">让AI画了个图</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><img class="rich_pages wxw-img" data-imgfileid="100002038" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=46e69575&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWKfJS6hDmDibrqnegDIKSibVXPlwBoibMJluYqibEavv5BsoTiblehDJv3hLmlY1hbnOOLNqdX7vAoySTg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">检测</span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">他不是完全不能检测,如果EDR采集了窗口数据源,或者像xxx一样有核晶或者infinityhook的话,就非常容易检测了,</span><strong style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-weight: bolder;"><span leaf="">所幸,win32k数据源，hypervisor，infinityhook这三个已经成为大部分安全软件的基础设施组件了</span></strong><span leaf="">.所以检测起来不难.就拿EDR来说,他的检测结果跟之前的APT的检测结果完全一样,就是因为EDR采集了win32k数据源</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><img class="rich_pages wxw-img" data-imgfileid="100002037" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=e2d3e90a&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWKfJS6hDmDibrqnegDIKSibVXbQmmUIpbmAKAxEic9iaah4Or5WrNubC0gRlicgibEGiaGxI56pic04l8PTbw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">源码</span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><strong style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-weight: bolder;"><span leaf="">本人不是作者,不对它具有任何法律责任</span></strong><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><a href="https://github.com/waryas/WaryasSWHE" target="_blank">https://github.com/waryas/WaryasSWHE</a></span></p><blockquote style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin: 5px 0px 15px;overflow: hidden;border-width: 0px 0px 0px 4px;border-top-style: initial;border-right-style: initial;border-bottom-style: initial;border-left-style: solid;border-top-color: initial;border-right-color: initial;border-bottom-color: initial;border-left-color: rgb(122, 208, 58);border-image: initial;padding: 8px 12px;background-color: rgb(241, 241, 241);box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 1px 0px;font-size: 14.992px;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;"><span leaf="">再次强调,本公众号不做任何红队内容.这次也只是别人的开源技术分析.</span></p></blockquote><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf="">后续</span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">现在回过头看毛子的APT的破碎注入过程,他们选择的应该是能避免CFG违规触发的调用路线,而这份代码,如果开了CFG,就举步维艰了.可能这就是APT跟民用的差距?</span></p><p style="display: none;"><mp-style-type data-value="3"></mp-style-type></p>


<p><a href="2247485690">阅读原文</a></p>
<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=4e82f699&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzkyOTc0NDY2Nw%3D%3D%26mid%3D2247485690%26idx%3D1%26sn%3D774ef1b6f5a1299414aa781c979d71f7">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Thu, 27 Nov 2025 00:18:00 +0800</pubDate>
    </item>
    <item>
      <title>安全开发(终章): 主动防御架构设计/查杀引擎设计/下一代查杀引擎展望</title>
      <link>https://mp.weixin.qq.com/s?__biz=MzkyOTc0NDY2Nw==&amp;mid=2247485673&amp;idx=1&amp;sn=e36d59a9e8830c80fac9575eefba4d6e</link>
      <description></description>
      <content:encoded><![CDATA[<p>
原创 <span>huoji</span> <span>2025-11-17 10:00</span> <span style="display: inline-block;">北京</span>
</p>




<p><img src="https://wechat2rss.xlab.app/img-proxy/?k=bb22c38d&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FejibWMxI7nWJOJ4psGfSlTQibao0ptfOwEFZicDj8GkDn0aZo0q9shAbFdgA6TOrOeApic0mPBD0K8Q9BSTJIias29g%2F0%3Fwx_fmt%3Djpeg"/></p>


<h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: inherit;font-weight: 500;line-height: 1.2;color: inherit;font-size: 2rem;" data-pm-slice="0 0 []"><span leaf="">前言</span></h2><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;"><span leaf="">终于,我们迎来了整个系列的完结,在此之前请阅读之前所有内容,因为本章包含了大量信息,不可以逃课.</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;"><span leaf=""><a class="normal_text_link" target="_blank" style="" href="https://mp.weixin.qq.com/s?__biz=MzkyOTc0NDY2Nw==&amp;mid=2247485177&amp;idx=1&amp;sn=ca5597408cb94e093d1ed07be9821337&amp;scene=21#wechat_redirect" textvalue="安全开发: 实现拦截病毒并且弹窗" data-itemshowtype="0" linktype="text" data-linktype="2">安全开发: 实现拦截病毒并且弹窗</a></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;"><span leaf=""><a class="normal_text_link" target="_blank" style="" href="https://mp.weixin.qq.com/s?__biz=MzkyOTc0NDY2Nw==&amp;mid=2247484988&amp;idx=1&amp;sn=654633f7088fe275a61f7c1ee7e628ca&amp;scene=21#wechat_redirect" textvalue="[预约订阅]高级安全研究之路:拒绝内耗,通过阅读提高自己" data-itemshowtype="0" linktype="text" data-linktype="2">[预约订阅]高级安全研究之路:拒绝内耗,通过阅读提高自己</a></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;"><span leaf="">在上一篇中,核心EPP的功能,内核通讯&lt;-&gt;查杀&lt;-&gt;UI 我们已经搞定了(虽然很多问题)</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">因此，其他的“功能” 比如主动防御/乱七八糟的杀毒/也只是基于这个核心功能的对外扩展.</span><strong style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-weight: bolder;"><em style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><span leaf="">因此我决定不再这些乱七八糟的功能具体细节代码上浪费时间,只说一下咋实现.</span></em></strong><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">本节主要内容:</span></p><ol style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;" class="list-paddingleft-1"><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">目前要解决的问题</span></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">主动防御设计</span></p></li><ol style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0px;" class="list-paddingleft-1"><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">本地规则系统设计</span></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">云主防设计</span></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">主动防御缺陷</span></p></li></ol><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">查杀引擎设计</span></p></li><ol style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0px;" class="list-paddingleft-1"><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">特征杀毒设计</span></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">启发查杀设计</span></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">AI查杀设计</span></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">云杀毒引擎设计</span></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">目前主流查杀引擎缺陷</span></p></li></ol><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">更好的查杀引擎展望</span></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">题外话: 为什么我们需要用EDR?</span></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">结语</span></p></li></ol><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;"><span leaf="">其实本来还想写更多的,但是考虑到读者消化能力有限,还是别写太多了.</span></p><h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: inherit;font-weight: 500;line-height: 1.2;color: inherit;font-size: 2rem;"><span leaf="">要解决的问题</span></h2><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;"><span leaf="">这里列举一下目前整套系统存在的问题,以及咋解决,</span><strong style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-weight: bolder;"><span leaf="">但是不给出具体解决代码了,毕竟DEMO和商业化,路差的很远.</span></strong></p><ol style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;" class="list-paddingleft-1"><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">IOCP通讯 -&gt; 我们的通讯机制还是队列通讯,这是异步的而且容易卡系统.为了实现主动防御，软件管控等功能，需要做IOCP的通讯，具体自己问GPT咋实现吧</span></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">UI/查杀分离 我们现在的R3模块是UI+查杀+高权限一起的,这不是设计失误,这只是为了简化,严格来说，查杀服务，和驱动通讯的服务，应该是单独的一个exe并且以service启动,而UI只低权限用RPC/PIPE/ALPC/GRPC等手段跟那个exe通讯.而不是在一起。在一起会有几个问题,比如UI不启动功能不生效,比如不要UAC功能就不生效,不开UI就没主动防御等问题.</span></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">UI架构,CEF过于臃肿,可能的替代方案是:QT,不过这玩意bug也多,WEBVIEW,这个不支持老版本的windows,新版本倒挺不错的.DUI这个最完美,360等一众杀毒软件都是这个做的.不过这玩意坑也多,而且对技术要求高.所以看情况来</span></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">驱动鉴权,内部签名. 如你所见,我们现在的驱动通讯是没签名验证的,所以会导致什么人都可以调用我们的驱动,从而成为漏洞驱动,所以,驱动要校验一下R3的内部签名,具体方法就不说了,自己问一下GPT,不过值得注意的是,</span><strong style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-weight: bolder;"><span leaf="">校验是不是内部签名也不安全,因为有DLL注入/白加黑劫持的风险,所以还需要校验进程内存完整性或者改用PPL保护方案</span></strong><span leaf="">.否则就会被劫持.</span></p></li></ol><h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: inherit;font-weight: 500;line-height: 1.2;color: inherit;font-size: 2rem;"><span leaf="">主动防御设计</span></h2><blockquote style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin: 5px 0px 15px;overflow: hidden;border-width: 0px 0px 0px 4px;border-top-style: initial;border-right-style: initial;border-bottom-style: initial;border-left-style: solid;border-top-color: initial;border-right-color: initial;border-bottom-color: initial;border-left-color: rgb(122, 208, 58);border-image: initial;padding: 8px 12px;background-color: rgb(241, 241, 241);box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 1px 0px;font-size: unset;"><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;"><span leaf="">注意: 设计主动防御之前,必须要先把通讯队列做成IOCP的那种优化,否则做出来的效果会不理想</span></p></blockquote><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;"><span leaf="">主动防御的设计,其实很简单,比你想的简单太多了,回顾上一章节,我们进程创建的时候就判断了MD5是不是黑的,如果是黑的就弹窗.而主动防御,就是把一堆信息,同样的方法塞到R3,然后R3写规则系统去判断.</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">当然不止进程创建,还能塞模块加载(loadimage),文件操作(minifilter),网络操作(WFP,不过注意这个只能异步,因为WFP的回调都是DPC级别的)等等的内核事件发给R3,玩的野一点的,hypervisor或者inifityhook的事件也可以发给R3.总之一句话,内核把事件发给R3.</span></p><p class="js_pay_preview_filter"><mp-pay-preview-filter data-offset="32"></mp-pay-preview-filter></p>


<p><a href="2247485673">阅读原文</a></p>
<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=96012757&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzkyOTc0NDY2Nw%3D%3D%26mid%3D2247485673%26idx%3D1%26sn%3De36d59a9e8830c80fac9575eefba4d6e">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Mon, 17 Nov 2025 10:00:00 +0800</pubDate>
    </item>
    <item>
      <title>VMP3源码学习——虚拟化</title>
      <link>https://mp.weixin.qq.com/s?__biz=MzkyOTc0NDY2Nw==&amp;mid=2247485663&amp;idx=1&amp;sn=508c4ad1f5163381c0727a6bccd48cc1</link>
      <description></description>
      <content:encoded><![CDATA[<p>
原创 <span>CrazyHarb</span> <span>2025-11-16 10:02</span> <span style="display: inline-block;">北京</span>
</p>




<p><img src="https://wechat2rss.xlab.app/img-proxy/?k=551a72cf&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FejibWMxI7nWKXFvzK5FU6EGBl0Fn5XcgOvEMpkFWrhLhAqu0iaFPLQUBZ1FWvEzzRHfCZVIaYDk52fRaCPUNg9VA%2F0%3Fwx_fmt%3Djpeg"/></p>


<p style="margin-top:24.0pt;margin-bottom:24.0pt;margin-left:0.0pt;line-height:120%;"><span style="font-size:26.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">VMP3源码学习——虚拟化</span></span></p><p style="margin-top:19.0pt;margin-bottom:7.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:1;"><span style="mso-bookmark:heading_0;"><span style="font-size:18.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">背景：</span></span></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;text-indent:21.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">前文中我们已经分析了源码中的变异核心指令，我们书接上文，本文中我们来看一下VMP中的虚拟化相关功能的代码，vmp的运行流程可以参考鸭哥的(VMP3.x内部原理详解与还原思路)，链接我放在本文最后的参考中了，说实话，我不是这方面专家，所以本文中涉及的逻辑仅限于windows x64下的PE文件的高级版本VMP</span></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;"><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"><o:p><span leaf=""> 前文摘要</span></o:p></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;"><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"><o:p><span leaf=""><a class="normal_text_link" target="_blank" style="" href="https://mp.weixin.qq.com/s?__biz=MzkyOTc0NDY2Nw==&amp;mid=2247485288&amp;idx=1&amp;sn=74c85fd0a3c61b7eb98415cb7128c40d&amp;scene=21#wechat_redirect" textvalue="VMP源码学习(1) 变异分析与代码bug" data-itemshowtype="0" linktype="text" data-linktype="2">VMP源码学习(1) 变异分析与代码bug</a></span></o:p></span></p><p style="margin-top:19.0pt;margin-bottom:7.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:1;"><span style="mso-bookmark:heading_1;"><span style="font-size:18.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">入口点：</span></span></span></p><table style="margin-left: 0.0;border: none;border-collapse: collapse;mso-table-layout-alt: fixed;mso-border-top-alt: solid #DEE0E3 0.25pt;mso-border-left-alt: solid #DEE0E3 0.25pt;mso-border-bottom-alt: solid #DEE0E3 0.25pt;mso-border-right-alt: solid #DEE0E3 0.25pt;mso-padding-alt: 0pt 5.4pt 0pt 5.4pt;width: 100%;"><tbody><tr><td data-colwidth="552" width="552" valign="top" style="background: rgb(245, 246, 247);border-width: 1pt;border-style: solid;border-color: rgb(222, 224, 227);padding: 3pt 6pt 1.5pt;"><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;color:#646A73;"><span leaf="">C                  </span></span><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;"><span leaf=""> // intel 虚拟化入口                  </span><span leaf=""><br/></span><span leaf="">   void IntelFunction::CompileToVM(const CompileContext &amp;ctx);</span></span></p></td></tr></tbody></table><p style="margin-top:19.0pt;margin-bottom:7.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:1;"><span style="mso-bookmark:heading_2;"><span style="font-size:18.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">HANDLERS分析：</span></span></span></p><p style="margin-top:16.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:2;"><span style="mso-bookmark:heading_3;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;color:#3370FF;"><span leaf="">1. </span></span></span><span style="mso-bookmark:heading_3;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">entry_command_</span></span></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;text-indent:21.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">这个就是鸭哥文章中提到的vmentry，该代码的最终效果可参考文章中的内容，它在源码中初始化流程为：</span></span></p><p style="mso-list:l0 level1 lfo1;margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:22.65pt;text-indent:0.0pt;line-height:120%;"><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"><span leaf="">1</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">初始化不使用寄存器列表，x64下是R12 ~ R15</span></span></p><p style="mso-list:l1 level1 lfo1;margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:22.65pt;text-indent:0.0pt;line-height:120%;"><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"><span leaf="">1</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">在rbx、rbp、rsi、rdi、R8~R11这几个寄存器之间，不放回取四个寄存器，分别表示</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">密钥寄存器</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">、</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">伪指令寄存器</span></span><span style="font-size:11.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">(VIP)、</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">伪栈寄存器</span></span><span style="font-size:11.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">(VSP)、</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">跳转寄存器</span></span></p><p style="mso-list:l2 level1 lfo1;margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:22.65pt;text-indent:0.0pt;line-height:120%;"><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"><span leaf="">1</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">初始化入口加密器，其实就是随机几条指令add sub xor inc dec bswap rol ror not neg这几个指令进行随机，</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">指令条数大于100</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">，或者</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">大于3且随机数的最低位为1</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">（我称它为随机数命中），则生成结束。同等道理，如果vmp选项中选中了加密字节码，也会随机一个</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">指令加密器</span></span><o:page></o:page></p><p style="mso-list:l3 level1 lfo1;margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:22.65pt;text-indent:0.0pt;line-height:120%;"><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"><span leaf="">1</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">开始填入代码，把rax、rcx、rdx、rbx、rbp、rsi、rdi、R8~R15、rflag</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">随机交换顺序</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">后，全部入栈</span></span></p><p style="mso-list:l4 level1 lfo1;margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:22.65pt;text-indent:0.0pt;line-height:120%;"><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"><span leaf="">1</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">随机一个空闲寄存器存储</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">当前段地址</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">，并把该寄存器入栈</span></span></p><p style="mso-list:l5 level1 lfo1;margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:22.65pt;text-indent:0.0pt;line-height:120%;"><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"><span leaf="">1</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">将rsp + 0x90的值赋给</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">伪指令寄存器</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">，0x90代表前面压入栈的16个寄存器+1个随机的空闲寄存器+call的返回地址，共18*8 = 0x12*8 = 0x90，取到的是vm入口入栈的参数</span></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:center;margin-left:22.65pt;line-height:120%;"><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"><span leaf=""><img style="width:548.010009765625px;height:71.0px;" class="rich_pages wxw-img" data-ratio="0.12864493996569468" data-w="1166" src="https://wechat2rss.xlab.app/img-proxy/?k=f388daac&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWKXFvzK5FU6EGBl0Fn5XcgOZT6mnV2mIP3RnpVnpyZdNVe8ZqHr4v29ibpXBRdK4fZGibKiceMXLQ3VQ%2F640%3Fwx_fmt%3Dpng"/></span></span></p><p style="mso-list:l6 level1 lfo1;margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:22.65pt;text-indent:0.0pt;line-height:120%;"><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"><span leaf="">1</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">通过入口加密器解密</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">伪指令寄存器</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">，解密后加上前面的当前的段地址，当然这些运算都是低32位的，如果镜像地址高出32位地址，就把高位地址加上</span></span></p><p style="mso-list:l7 level1 lfo1;margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:22.65pt;text-indent:0.0pt;line-height:120%;"><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"><span leaf="">1</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">把rsp栈指针赋值给</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">伪栈寄存器，</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">并执行 rsp -= 0x180后，将RSP进行对齐操作，即</span></span></p><table style="margin-left: 22.65pt;border: none;border-collapse: collapse;mso-table-layout-alt: fixed;mso-border-top-alt: solid #DEE0E3 0.25pt;mso-border-left-alt: solid #DEE0E3 0.25pt;mso-border-bottom-alt: solid #DEE0E3 0.25pt;mso-border-right-alt: solid #DEE0E3 0.25pt;mso-padding-alt: 0pt 5.4pt 0pt 5.4pt;width: 100%;"><tbody><tr><td data-colwidth="522" width="522" valign="top" style="background: rgb(245, 246, 247);border-width: 1pt;border-style: solid;border-color: rgb(222, 224, 227);padding: 3pt 6pt 1.5pt;"><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;color:#646A73;"><span leaf="">C                  </span><span leaf=""><br/></span></span><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;"><span leaf="">RSP &amp;= 0xFFFFFFFFFFFFFFF0</span></span></p></td></tr></tbody></table><table style="margin-left: 22.65pt;border: none;border-collapse: collapse;mso-table-layout-alt: fixed;mso-border-top-alt: solid #DEE0E3 0.25pt;mso-border-left-alt: solid #DEE0E3 0.25pt;mso-border-bottom-alt: solid #DEE0E3 0.25pt;mso-border-right-alt: solid #DEE0E3 0.25pt;mso-padding-alt: 0pt 5.4pt 0pt 5.4pt;width: 100%;"><tbody><tr><td data-colwidth="522" width="522" valign="top" style="background: rgb(245, 246, 247);border-width: 1pt;border-style: solid;border-color: rgb(222, 224, 227);padding: 3pt 6pt 1.5pt;"><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;color:#646A73;"><span leaf="">Assembly language                  </span><span leaf=""><br/></span><span leaf="">示例代码                  </span></span><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;"><span leaf="">push</span><span leaf="">rdi                  </span><span leaf=""><br/></span><span leaf="">push</span><span leaf="">r9                  </span><span leaf=""><br/></span><span leaf="">push</span><span leaf="">rbx                  </span><span leaf=""><br/></span><span leaf="">push</span><span leaf="">r11                  </span><span leaf=""><br/></span><span leaf="">push</span><span leaf="">rcx                  </span><span leaf=""><br/></span><span leaf="">push</span><span leaf="">rax                  </span><span leaf=""><br/></span><span leaf="">push</span><span leaf="">r12                  </span><span leaf=""><br/></span><span leaf="">push</span><span leaf="">r8                  </span><span leaf=""><br/></span><span leaf="">push</span><span leaf="">rsi                  </span><span leaf=""><br/></span><span leaf="">push</span><span leaf="">rbp                  </span><span leaf=""><br/></span><span leaf="">push</span><span leaf="">r10                  </span><span leaf=""><br/></span><span leaf="">pushfq                  </span><span leaf=""><br/></span><span leaf="">push</span><span leaf="">r14                  </span><span leaf=""><br/></span><span leaf="">push</span><span leaf="">rdx                  </span><span leaf=""><br/></span><span leaf="">push</span><span leaf="">r15                  </span><span leaf=""><br/></span><span leaf="">push</span><span leaf="">r13                  </span><span leaf=""><br/></span><span leaf="">; 以上是全部入栈                  </span><span leaf=""><br/></span><span leaf="">mov</span><span leaf="">rbp, 7FF50F570000h                  </span><span leaf=""><br/></span><span leaf="">push</span><span leaf="">rbp</span><span leaf="">; 存储当前段的地址                  </span><span leaf=""><br/></span><span leaf="">mov</span><span leaf="">rbx, [rsp+90h]</span><span leaf="">; 取到call处的参数， 17 个push</span><span leaf="">一个返回地址</span><span leaf="">18 * 8 = 0x90                  </span><span leaf=""><br/></span><span leaf="">; 解密算法开始                  </span><span leaf=""><br/></span><span leaf="">not</span><span leaf="">ebx                  </span><span leaf=""><br/></span><span leaf="">rol</span><span leaf="">ebx, 2                  </span><span leaf=""><br/></span><span leaf="">dec</span><span leaf="">ebx                  </span><span leaf=""><br/></span><span leaf="">xor</span><span leaf="">ebx, 1DBA2712h                  </span><span leaf=""><br/></span><span leaf="">; 解密算法结束                  </span><span leaf=""><br/></span><span leaf="">add</span><span leaf="">rbx, rbp</span><span leaf="">; 加上段地址算出来地址                  </span><span leaf=""><br/></span><span leaf="">mov</span><span leaf="">rax, 100000000h</span><span leaf="">; x64 位高位有1，加上                  </span><span leaf=""><br/></span><span leaf="">add</span><span leaf="">rbx, rax</span><span leaf="">; rbx 你就是伪指令寄存器了                  </span><span leaf=""><br/></span><span leaf="">mov</span><span leaf="">rsi, rsp</span><span leaf="">; rsi 你就是伪栈指针寄存器了                  </span><span leaf=""><br/></span><span leaf="">sub</span><span leaf="">rsp, 180h                  </span><span leaf=""><br/></span><span leaf="">and</span><span leaf="">rsp, 0FFFFFFFFFFFFFFF0h</span><span leaf="">; rsp 分配栈空间</span></span><o:page></o:page></p></td></tr></tbody></table><p style="margin-top:16.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:2;"><span style="mso-bookmark:heading_4;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;color:#3370FF;"><span leaf="">2. </span></span></span><span style="mso-bookmark:heading_4;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">init_command_</span></span></span></p><p style="mso-list:l8 level1 lfo1;margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:22.65pt;text-indent:0.0pt;line-height:120%;"><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"><span leaf="">1</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">初始化</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">密钥寄存器</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">，即把</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">伪指令寄存器</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">的值减掉</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">当前的段的地址</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">得到的值赋值给</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">密钥寄存器</span></span></p><p style="mso-list:l9 level1 lfo1;margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:22.65pt;text-indent:0.0pt;line-height:120%;"><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"><span leaf="">1</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">把当前的RIP赋值给</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">跳转寄存器</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">，开始添加EndHandler指令，并跳转到下一个Handler，等...等一下，这个EndHandler是啥？</span></span></p><p style="margin-top:16.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:2;"><span style="mso-bookmark:heading_5;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;color:#3370FF;"><span leaf="">3. </span></span></span><span style="mso-bookmark:heading_5;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">ReadCommand</span></span></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;text-indent:21.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">要了解EndHandler，我们首先来了解一下VMP读取指令的动作，它主要动作是滚动</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">密钥寄存器，</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">读取下一条指令码</span></span></p><p style="mso-list:l10 level1 lfo1;margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:22.65pt;text-indent:0.0pt;line-height:120%;"><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"><span leaf="">1</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">首先会从伪指令寄存器中读取4字节的下一个指令，但这个读取动作会分为两种，分为倒序和正序，这个是随机的，如果是倒序，则先给伪寄存器指令减4，再读取4字节内容；如果是正序，则先读取4字节，再给伪寄存器加4</span></span><o:page></o:page></p><p style="mso-list:l11 level1 lfo1;margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:22.65pt;text-indent:0.0pt;line-height:120%;"><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"><span leaf="">1</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">读取出来的指令值，先与</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">密钥寄存器</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">进行异或，再根据</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">指令加密器</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">（注意不是寄存器）对数据进行解密</span></span></p><p style="mso-list:l12 level1 lfo1;margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:22.65pt;text-indent:0.0pt;line-height:120%;"><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"><span leaf="">1</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">最后</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">密钥寄存器</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">会与结果进行异或，达到</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">滚动密钥寄存器</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">的目的</span></span></p><p style="mso-list:l13 level1 lfo1;margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:22.65pt;text-indent:0.0pt;line-height:120%;"><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"><span leaf="">1</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">返回解密出来的结果</span></span></p><p style="margin-top:16.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:2;"><span style="mso-bookmark:heading_6;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;color:#3370FF;"><span leaf="">4. </span></span></span><span style="mso-bookmark:heading_6;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">EndHandler</span></span></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;text-indent:21.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">好了，我们已经了解了读取指令的动作，那么HandlerEnd这部分逻辑就简单了，这部分在每一个Handler中都会出现，它主要动作是调用读取指令进行读取，然后将值加到</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">跳转寄存器</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">，并跳转过去</span></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;text-indent:21.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">这里面有一个特殊的点，如果参数指定了目标指令地址，那就会跳到目标指令地址中，但是还是会执行一次</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">读取指令</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">的动作</span></span></p><table style="margin-left: 0.0;border: none;border-collapse: collapse;mso-table-layout-alt: fixed;mso-border-top-alt: solid #DEE0E3 0.25pt;mso-border-left-alt: solid #DEE0E3 0.25pt;mso-border-bottom-alt: solid #DEE0E3 0.25pt;mso-border-right-alt: solid #DEE0E3 0.25pt;mso-padding-alt: 0pt 5.4pt 0pt 5.4pt;width: 100%;"><tbody><tr><td data-colwidth="552" width="552" valign="top" style="background: rgb(245, 246, 247);border-width: 1pt;border-style: solid;border-color: rgb(222, 224, 227);padding: 3pt 6pt 1.5pt;"><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;color:#646A73;"><span leaf="">Assembly language                  </span></span><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;"><span leaf="">mov</span><span leaf="">r10, rbx</span><span leaf="">; r10 你就是密钥寄存器了                  </span><span leaf=""><br/></span><span leaf="">mov</span><span leaf="">rdx, 7FF50F570000h                  </span><span leaf=""><br/></span><span leaf="">sub</span><span leaf="">r10, rdx</span><span leaf="">; 减掉段地址                  </span><span leaf=""><br/></span><span leaf="">lea</span><span leaf="">r11, [<a class="wx_topic_link" topic-id="mi0jtftk-kl0a2t" style="color: #576B95 !important;" data-topic="1">#5</a>]</span><span leaf="">; 获取当前rip地址到r11，你就是跳转寄存器了                  </span><span leaf=""><br/></span><span leaf="">;EndHandler                  </span><span leaf=""><br/></span><span leaf="">; 下面的指令就是ReadCommand，看来是倒序                  </span><span leaf=""><br/></span><span leaf="">sub</span><span leaf="">rbx, 4                  </span><span leaf=""><br/></span><span leaf="">mov</span><span leaf="">eax, [rbx]</span><span leaf="">; 挪动指针，然后读取4字节                  </span><span leaf=""><br/></span><span leaf="">xor</span><span leaf="">eax, r10d ; 先和r10密钥寄存器进行异或                  </span><span leaf=""><br/></span><span leaf="">; 下面是解密算法                  </span><span leaf=""><br/></span><span leaf="">dec</span><span leaf="">eax                  </span><span leaf=""><br/></span><span leaf="">rol</span><span leaf="">eax, 17h                  </span><span leaf=""><br/></span><span leaf="">sub</span><span leaf="">eax, 3F47718Ah                  </span><span leaf=""><br/></span><span leaf="">neg</span><span leaf="">eax                  </span><span leaf=""><br/></span><span leaf="">rol</span><span leaf="">eax, 1Eh                  </span><span leaf=""><br/></span><span leaf="">; 回填r10，滚动更新r10密钥寄存器                  </span><span leaf=""><br/></span><span leaf="">push</span><span leaf="">r10                  </span><span leaf=""><br/></span><span leaf="">xor</span><span leaf="">[rsp], eax                  </span><span leaf=""><br/></span><span leaf="">pop</span><span leaf="">r10                  </span><span leaf=""><br/></span><span leaf="">; ReadCommand 结束                  </span><span leaf=""><br/></span><span leaf="">movsxd</span><span leaf="">rax, eax                  </span><span leaf=""><br/></span><span leaf="">add</span><span leaf="">r11, rax</span><span leaf="">;加到r11 跳转寄存器上                  </span><span leaf=""><br/></span><span leaf="">jmp</span><span leaf="">r11</span><span leaf="">; 跳！</span></span><o:page></o:page></p></td></tr></tbody></table><p style="margin-top:16.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:2;"><span style="mso-bookmark:heading_7;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;color:#3370FF;"><span leaf="">5. </span></span></span><span style="mso-bookmark:heading_7;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">check_stack</span></span></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;text-indent:21.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">别误会，这个Handler并不是对栈做了多么严谨的判断，仅仅判断了一下伪寄存器空间用了是否超过了0x40大小，如果超过了，就把rsp移动到当前栈指针上面0x180的位置，并把原始位置的0x100字节拷贝过去（在golang里面是乘以2，估计这么设计是有什么说法）</span></span></p><table style="margin-left: 0.0;border: none;border-collapse: collapse;mso-table-layout-alt: fixed;mso-border-top-alt: solid #DEE0E3 0.25pt;mso-border-left-alt: solid #DEE0E3 0.25pt;mso-border-bottom-alt: solid #DEE0E3 0.25pt;mso-border-right-alt: solid #DEE0E3 0.25pt;mso-padding-alt: 0pt 5.4pt 0pt 5.4pt;width: 100%;"><tbody><tr><td data-colwidth="552" width="552" valign="top" style="background: rgb(245, 246, 247);border-width: 1pt;border-style: solid;border-color: rgb(222, 224, 227);padding: 3pt 6pt 1.5pt;"><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;color:#646A73;"><span leaf="">Assembly language                  </span></span><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;"><span leaf="">lea</span><span leaf="">rcx, [rsp+140h]                  </span><span leaf=""><br/></span><span leaf="">; 由于栈分配了至少0x180的大小，判断伪栈寄存器用的空间是否少于0x40，少于的话，直接进行执行下一条指令                  </span><span leaf=""><br/></span><span leaf="">cmp</span><span leaf="">rsi, rcx                  </span><span leaf=""><br/></span><span leaf="">ja</span><span leaf="">@F                  </span><span leaf=""><br/></span><span leaf="">mov</span><span leaf="">rax, rsp</span><span leaf="">; 这个位置证明栈空间不够了，那就把rsp移动到伪寄存器 - 0x180的位置                  </span><span leaf=""><br/></span><span leaf="">mov</span><span leaf="">rcx, 100h                  </span><span leaf=""><br/></span><span leaf="">lea</span><span leaf="">r8, [rsi-80h]                  </span><span leaf=""><br/></span><span leaf="">and</span><span leaf="">r8, 0FFFFFFFFFFFFFFF0h                  </span><span leaf=""><br/></span><span leaf="">sub</span><span leaf="">r8, rcx                  </span><span leaf=""><br/></span><span leaf="">mov</span><span leaf="">rsp, r8                  </span><span leaf=""><br/></span><span leaf="">push</span><span leaf="">rsi                  </span><span leaf=""><br/></span><span leaf="">pushfq                  </span><span leaf=""><br/></span><span leaf="">mov</span><span leaf="">rsi, rax</span><span leaf="">; 把之前的rsp拷贝0x100个字节到新的rsp位置                  </span><span leaf=""><br/></span><span leaf="">mov</span><span leaf="">rdi, r8                  </span><span leaf=""><br/></span><span leaf="">cld                  </span><span leaf=""><br/></span><span leaf="">rep movsb                  </span><span leaf=""><br/></span><span leaf="">popfq                  </span><span leaf=""><br/></span><span leaf="">pop</span><span leaf="">rsi                  </span><span leaf=""><br/></span><span leaf="">@@:                  </span><span leaf=""><br/></span><span leaf="">jmp</span><span leaf="">r11</span></span><o:page></o:page></p></td></tr></tbody></table><p style="margin-top:16.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:2;"><span style="mso-bookmark:heading_8;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;color:#3370FF;"><span leaf="">6. </span></span></span><span style="mso-bookmark:heading_8;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">push register</span></span></span></p><table style="margin-left: 0.0;border: none;border-collapse: collapse;mso-table-layout-alt: fixed;mso-border-top-alt: solid #DEE0E3 0.25pt;mso-border-left-alt: solid #DEE0E3 0.25pt;mso-border-bottom-alt: solid #DEE0E3 0.25pt;mso-border-right-alt: solid #DEE0E3 0.25pt;mso-padding-alt: 0pt 5.4pt 0pt 5.4pt;width: 100%;"><tbody><tr><td data-colwidth="552" width="552" valign="top" style="background: rgb(245, 246, 247);border-width: 1pt;border-style: solid;border-color: rgb(222, 224, 227);padding: 3pt 6pt 1.5pt;"><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;color:#646A73;"><span leaf="">Assembly language                  </span></span><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;"><span leaf="">; ReadCommand Handler                  </span><span leaf=""><br/></span><span leaf="">sub</span><span leaf="">rbx, 1                  </span><span leaf=""><br/></span><span leaf="">movzx</span><span leaf="">r8d, byte ptr [rbx]                  </span><span leaf=""><br/></span><span leaf="">xor</span><span leaf="">r8b, r10b                  </span><span leaf=""><br/></span><span leaf="">ror</span><span leaf="">r8b, 2                  </span><span leaf=""><br/></span><span leaf="">dec</span><span leaf="">r8b                  </span><span leaf=""><br/></span><span leaf="">not</span><span leaf="">r8b                  </span><span leaf=""><br/></span><span leaf="">inc</span><span leaf="">r8b                  </span><span leaf=""><br/></span><span leaf="">xor</span><span leaf="">r10b, r8b                  </span><span leaf=""><br/></span><span leaf="">// 获取对应寄存器/局部变量的值                  </span><span leaf=""><br/></span><span leaf="">mov</span><span leaf="">r9, [rsp+r8]                  </span><span leaf=""><br/></span><span leaf="">// 移动伪寄存器栈的指针，将值写入，完成压入动作                  </span><span leaf=""><br/></span><span leaf="">sub</span><span leaf="">rsi, 8                  </span><span leaf=""><br/></span><span leaf="">mov</span><span leaf="">[rsi], r9                  </span><span leaf=""><br/></span><span leaf="">// EndHandler 动作                  </span><span leaf=""><br/></span><span leaf="">sub</span><span leaf="">rbx, 4                  </span><span leaf=""><br/></span><span leaf="">mov</span><span leaf="">edx, [rbx]                  </span><span leaf=""><br/></span><span leaf="">xor</span><span leaf="">edx, r10d                  </span><span leaf=""><br/></span><span leaf="">not</span><span leaf="">edx                  </span><span leaf=""><br/></span><span leaf="">dec</span><span leaf="">edx                  </span><span leaf=""><br/></span><span leaf="">bswap</span><span leaf="">edx                  </span><span leaf=""><br/></span><span leaf="">ror</span><span leaf="">edx, 5                  </span><span leaf=""><br/></span><span leaf="">inc</span><span leaf="">edx                  </span><span leaf=""><br/></span><span leaf="">push</span><span leaf="">r10                  </span><span leaf=""><br/></span><span leaf="">xor</span><span leaf="">[rsp], edx                  </span><span leaf=""><br/></span><span leaf="">pop</span><span leaf="">r10                  </span><span leaf=""><br/></span><span leaf="">movsxd</span><span leaf="">rdx, edx                  </span><span leaf=""><br/></span><span leaf="">add</span><span leaf="">r11, rdx                  </span><span leaf=""><br/></span><span leaf="">jmp</span><span leaf="">check_stack</span></span></p></td></tr></tbody></table><p style="margin-top:16.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:2;"><span style="mso-bookmark:heading_9;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;color:#3370FF;"><span leaf="">7. </span></span></span><span style="mso-bookmark:heading_9;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">pop Register</span></span></span></p><table style="margin-left: 0.0;border: none;border-collapse: collapse;mso-table-layout-alt: fixed;mso-border-top-alt: solid #DEE0E3 0.25pt;mso-border-left-alt: solid #DEE0E3 0.25pt;mso-border-bottom-alt: solid #DEE0E3 0.25pt;mso-border-right-alt: solid #DEE0E3 0.25pt;mso-padding-alt: 0pt 5.4pt 0pt 5.4pt;width: 100%;"><tbody><tr><td data-colwidth="552" width="552" valign="top" style="background: rgb(245, 246, 247);border-width: 1pt;border-style: solid;border-color: rgb(222, 224, 227);padding: 3pt 6pt 1.5pt;"><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;color:#646A73;"><span leaf="">Assembly language                  </span></span><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;"><span leaf="">// 读取伪栈寄存器的值，并移动伪栈寄存器指针                  </span><span leaf=""><br/></span><span leaf="">mov</span><span leaf="">rdi, [rsi]                  </span><span leaf=""><br/></span><span leaf="">add</span><span leaf="">rsi, 8                  </span><span leaf=""><br/></span><span leaf="">// ReadCommand 动作                  </span><span leaf=""><br/></span><span leaf="">sub</span><span leaf="">rbx, 1                  </span><span leaf=""><br/></span><span leaf="">movzx</span><span leaf="">ecx, byte ptr [rbx]                  </span><span leaf=""><br/></span><span leaf="">xor</span><span leaf="">cl, r10b                  </span><span leaf=""><br/></span><span leaf="">add</span><span leaf="">cl, 32h ; &#39;2&#39;                  </span><span leaf=""><br/></span><span leaf="">not</span><span leaf="">cl                  </span><span leaf=""><br/></span><span leaf="">neg</span><span leaf="">cl                  </span><span leaf=""><br/></span><span leaf="">dec</span><span leaf="">cl                  </span><span leaf=""><br/></span><span leaf="">neg</span><span leaf="">cl                  </span><span leaf=""><br/></span><span leaf="">xor</span><span leaf="">r10b, cl                  </span><span leaf=""><br/></span><span leaf="">// 写入对应的寄存器/变量中                  </span><span leaf=""><br/></span><span leaf="">mov</span><span leaf="">[rsp+rcx], rdi                  </span><span leaf=""><br/></span><span leaf="">// EndHandler动作                  </span><span leaf=""><br/></span><span leaf="">sub</span><span leaf="">rbx, 4                  </span><span leaf=""><br/></span><span leaf="">mov</span><span leaf="">ecx, [rbx]                  </span><span leaf=""><br/></span><span leaf="">xor</span><span leaf="">ecx, r10d                  </span><span leaf=""><br/></span><span leaf="">sub</span><span leaf="">ecx, 7ACA04FBh                  </span><span leaf=""><br/></span><span leaf="">bswap</span><span leaf="">ecx                  </span><span leaf=""><br/></span><span leaf="">add</span><span leaf="">ecx, 2B355FD5h                  </span><span leaf=""><br/></span><span leaf="">rol</span><span leaf="">ecx, 10h                  </span><span leaf=""><br/></span><span leaf="">dec</span><span leaf="">ecx                  </span><span leaf=""><br/></span><span leaf="">push</span><span leaf="">r10                  </span><span leaf=""><br/></span><span leaf="">xor</span><span leaf="">[rsp], ecx                  </span><span leaf=""><br/></span><span leaf="">pop</span><span leaf="">r10                  </span><span leaf=""><br/></span><span leaf="">movsxd</span><span leaf="">rcx, ecx                  </span><span leaf=""><br/></span><span leaf="">add</span><span leaf="">r11, rcx                  </span><span leaf=""><br/></span><span leaf="">jmp</span><span leaf="">r11</span></span><o:page></o:page></p></td></tr></tbody></table><p style="margin-top:16.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:2;"><span style="mso-bookmark:heading_10;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;color:#3370FF;"><span leaf="">8. </span></span></span><span style="mso-bookmark:heading_10;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">push value</span></span></span></p><table style="margin-left: 0.0;border: none;border-collapse: collapse;mso-table-layout-alt: fixed;mso-border-top-alt: solid #DEE0E3 0.25pt;mso-border-left-alt: solid #DEE0E3 0.25pt;mso-border-bottom-alt: solid #DEE0E3 0.25pt;mso-border-right-alt: solid #DEE0E3 0.25pt;mso-padding-alt: 0pt 5.4pt 0pt 5.4pt;width: 100%;"><tbody><tr><td data-colwidth="552" width="552" valign="top" style="background: rgb(245, 246, 247);border-width: 1pt;border-style: solid;border-color: rgb(222, 224, 227);padding: 3pt 6pt 1.5pt;"><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;color:#646A73;"><span leaf="">Assembly language                  </span></span><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;"><span leaf="">; ReadCommand 动作                  </span><span leaf=""><br/></span><span leaf="">sub</span><span leaf="">rbx, 8                  </span><span leaf=""><br/></span><span leaf="">mov</span><span leaf="">rcx, [rbx]                  </span><span leaf=""><br/></span><span leaf="">xor</span><span leaf="">rcx, r10                  </span><span leaf=""><br/></span><span leaf="">inc</span><span leaf="">rcx                  </span><span leaf=""><br/></span><span leaf="">xor</span><span leaf="">rcx, 0CCC15C6h                  </span><span leaf=""><br/></span><span leaf="">not</span><span leaf="">rcx                  </span><span leaf=""><br/></span><span leaf="">inc</span><span leaf="">rcx                  </span><span leaf=""><br/></span><span leaf="">xor</span><span leaf="">rcx, 456C3348h                  </span><span leaf=""><br/></span><span leaf="">xor</span><span leaf="">r10, rcx                  </span><span leaf=""><br/></span><span leaf="">// 移动伪栈指针，将值写入，完成压入动作                  </span><span leaf=""><br/></span><span leaf="">sub</span><span leaf="">rsi, 8                  </span><span leaf=""><br/></span><span leaf="">mov</span><span leaf="">[rsi], rcx                  </span><span leaf=""><br/></span><span leaf="">// EndHandler动作                  </span><span leaf=""><br/></span><span leaf="">sub</span><span leaf="">rbx, 4                  </span><span leaf=""><br/></span><span leaf="">mov</span><span leaf="">r8d, [rbx]                  </span><span leaf=""><br/></span><span leaf="">xor</span><span leaf="">r8d, r10d                  </span><span leaf=""><br/></span><span leaf="">not</span><span leaf="">r8d                  </span><span leaf=""><br/></span><span leaf="">inc</span><span leaf="">r8d                  </span><span leaf=""><br/></span><span leaf="">not</span><span leaf="">r8d                  </span><span leaf=""><br/></span><span leaf="">add</span><span leaf="">r8d, 4FEA55AAh                  </span><span leaf=""><br/></span><span leaf="">push</span><span leaf="">r10                  </span><span leaf=""><br/></span><span leaf="">xor</span><span leaf="">[rsp], r8d                  </span><span leaf=""><br/></span><span leaf="">pop</span><span leaf="">r10                  </span><span leaf=""><br/></span><span leaf="">movsxd</span><span leaf="">r8, r8d                  </span><span leaf=""><br/></span><span leaf="">add</span><span leaf="">r11, r8                  </span><span leaf=""><br/></span><span leaf="">jmp</span><span leaf="">checkStackHandler</span></span><o:page></o:page></p></td></tr></tbody></table><p style="margin-top:16.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:2;"><span style="mso-bookmark:heading_11;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;color:#3370FF;"><span leaf="">9. </span></span></span><span style="mso-bookmark:heading_11;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">add</span></span></span></p><table style="margin-left: 0.0;border: none;border-collapse: collapse;mso-table-layout-alt: fixed;mso-border-top-alt: solid #DEE0E3 0.25pt;mso-border-left-alt: solid #DEE0E3 0.25pt;mso-border-bottom-alt: solid #DEE0E3 0.25pt;mso-border-right-alt: solid #DEE0E3 0.25pt;mso-padding-alt: 0pt 5.4pt 0pt 5.4pt;width: 100%;"><tbody><tr><td data-colwidth="552" width="552" valign="top" style="background: rgb(245, 246, 247);border-width: 1pt;border-style: solid;border-color: rgb(222, 224, 227);padding: 3pt 6pt 1.5pt;"><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;color:#646A73;"><span leaf="">Assembly language                  </span></span><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;"><span leaf="">; 取出伪栈寄存器上面的两个参数                  </span><span leaf=""><br/></span><span leaf="">mov</span><span leaf="">rcx, [rsi]                  </span><span leaf=""><br/></span><span leaf="">mov</span><span leaf="">r9, [rsi+8]                  </span><span leaf=""><br/></span><span leaf="">// 相加                  </span><span leaf=""><br/></span><span leaf="">add</span><span leaf="">rcx, r9                  </span><span leaf=""><br/></span><span leaf="">// 结果返回结构体                   </span><span leaf=""><br/></span><span leaf="">// {                  </span><span leaf=""><br/></span><span leaf="">//</span><span leaf="">uint64 rflags;                  </span><span leaf=""><br/></span><span leaf="">//</span><span leaf="">uint64 result;                  </span><span leaf=""><br/></span><span leaf="">// }                  </span><span leaf=""><br/></span><span leaf="">// 由于输入参数和返回大小一样，所以不会对伪栈寄存器进行任何移动                  </span><span leaf=""><br/></span><span leaf="">mov</span><span leaf="">[rsi+8], rcx                  </span><span leaf=""><br/></span><span leaf="">pushfq                  </span><span leaf=""><br/></span><span leaf="">pop</span><span leaf="">qword ptr [rsi]                  </span><span leaf=""><br/></span><span leaf="">// EndHandler 动作                  </span><span leaf=""><br/></span><span leaf="">sub</span><span leaf="">rbx, 4                  </span><span leaf=""><br/></span><span leaf="">mov</span><span leaf="">ebp, [rbx]                  </span><span leaf=""><br/></span><span leaf="">xor</span><span leaf="">ebp, r10d                  </span><span leaf=""><br/></span><span leaf="">bswap</span><span leaf="">ebp                  </span><span leaf=""><br/></span><span leaf="">add</span><span leaf="">ebp, 42EC7D95h                  </span><span leaf=""><br/></span><span leaf="">rol</span><span leaf="">ebp, 12h                  </span><span leaf=""><br/></span><span leaf="">dec</span><span leaf="">ebp                  </span><span leaf=""><br/></span><span leaf="">push</span><span leaf="">r10                  </span><span leaf=""><br/></span><span leaf="">xor</span><span leaf="">[rsp], ebp                  </span><span leaf=""><br/></span><span leaf="">pop</span><span leaf="">r10                  </span><span leaf=""><br/></span><span leaf="">movsxd</span><span leaf="">rbp, ebp                  </span><span leaf=""><br/></span><span leaf="">add</span><span leaf="">r11, rbp                  </span><span leaf=""><br/></span><span leaf="">jmp</span><span leaf="">r11</span></span><o:page></o:page></p></td></tr></tbody></table><p style="margin-top:16.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:2;"><span style="mso-bookmark:heading_12;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;color:#3370FF;"><span leaf="">10. </span></span></span><span style="mso-bookmark:heading_12;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">call</span></span></span></p><table style="margin-left: 0.0;border: none;border-collapse: collapse;mso-table-layout-alt: fixed;mso-border-top-alt: solid #DEE0E3 0.25pt;mso-border-left-alt: solid #DEE0E3 0.25pt;mso-border-bottom-alt: solid #DEE0E3 0.25pt;mso-border-right-alt: solid #DEE0E3 0.25pt;mso-padding-alt: 0pt 5.4pt 0pt 5.4pt;width: 100%;"><tbody><tr><td data-colwidth="552" width="552" valign="top" style="background: rgb(245, 246, 247);border-width: 1pt;border-style: solid;border-color: rgb(222, 224, 227);padding: 3pt 6pt 1.5pt;"><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;color:#646A73;"><span leaf="">Assembly language                  </span></span><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;"><span leaf="">; 这里由于是再次entry_command_过了，所以，伪寄存器已经重新随机了                  </span><span leaf=""><br/></span><span leaf="">; pcode_register(VIP) ---&gt;</span><span leaf="">rbp                  </span><span leaf=""><br/></span><span leaf="">; jmp_register 跳转寄存器</span><span leaf="">----&gt; r11                  </span><span leaf=""><br/></span><span leaf="">; crypt_register_ 加密寄存器</span><span leaf="">----&gt; r9                  </span><span leaf=""><br/></span><span leaf="">; stack_register(VSP) 伪堆栈寄存器 ----&gt; ebx                  </span><span leaf=""><br/></span><span leaf="">; ReadCommand 动作                  </span><span leaf=""><br/></span><span leaf="">sub</span><span leaf="">rbp, 1                  </span><span leaf=""><br/></span><span leaf="">movzx</span><span leaf="">edi, byte ptr [rbp+0]                  </span><span leaf=""><br/></span><span leaf="">xor</span><span leaf="">dil, r9b                  </span><span leaf=""><br/></span><span leaf="">rol</span><span leaf="">dil, 1                  </span><span leaf=""><br/></span><span leaf="">dec</span><span leaf="">dil                  </span><span leaf=""><br/></span><span leaf="">ror</span><span leaf="">dil, 4                  </span><span leaf=""><br/></span><span leaf="">not</span><span leaf="">dil                  </span><span leaf=""><br/></span><span leaf="">ror</span><span leaf="">dil, 5                  </span><span leaf=""><br/></span><span leaf="">xor</span><span leaf="">r9b, dil                  </span><span leaf=""><br/></span><span leaf="">; 伪寄存器入栈，堆栈寄存器赋值给rbp                  </span><span leaf=""><br/></span><span leaf="">push</span><span leaf="">rbp                  </span><span leaf=""><br/></span><span leaf="">push</span><span leaf="">r11                  </span><span leaf=""><br/></span><span leaf="">push</span><span leaf="">r9                  </span><span leaf=""><br/></span><span leaf="">mov</span><span leaf="">rbp, rbx                  </span><span leaf=""><br/></span><span leaf="">; edi 解密出来是参数的个数                  </span><span leaf=""><br/></span><span leaf="">mov</span><span leaf="">ebx, edi                  </span><span leaf=""><br/></span><span leaf="">mov</span><span leaf="">edx, ebx                  </span><span leaf=""><br/></span><span leaf="">xor</span><span leaf="">ecx, ecx                  </span><span leaf=""><br/></span><span leaf="">; 参数个数小于等于4，则直接跳转                  </span><span leaf=""><br/></span><span leaf="">cmp</span><span leaf="">ebx, 4                  </span><span leaf=""><br/></span><span leaf="">jbe</span><span leaf="">lower_or_equal_4                  </span><span leaf=""><br/></span><span leaf="">mov</span><span leaf="">edx, 4                  </span><span leaf=""><br/></span><span leaf="">lea</span><span leaf="">ecx, [rbx-4]</span><span leaf="">; 存储入栈的参数                  </span><span leaf=""><br/></span><span leaf="">;我们的是x64，所以</span><span leaf="">rdx rcx r8 r9 剩下的入栈                  </span><span leaf=""><br/></span><span leaf="">lower_or_equal_4:                  </span><span leaf=""><br/></span><span leaf="">shl</span><span leaf="">ecx, 3</span><span leaf="">; *8</span><span leaf="">入栈的总大小                  </span><span leaf=""><br/></span><span leaf="">shl</span><span leaf="">edx, 3</span><span leaf="">; *8</span><span leaf="">计算参数总大小                  </span><span leaf=""><br/></span><span leaf="">mov</span><span leaf="">rax, rbp                  </span><span leaf=""><br/></span><span leaf="">add</span><span leaf="">rax, rdx</span><span leaf="">; 伪堆栈指针跳过总参数大小                  </span><span leaf=""><br/></span><span leaf="">mov</span><span leaf="">[rbp-8], rax</span><span leaf="">; 保存原始伪堆栈指针                  </span><span leaf=""><br/></span><span leaf="">mov</span><span leaf="">[rbp-10h], rsp ; 保存原始rsp                  </span><span leaf=""><br/></span><span leaf="">sub</span><span leaf="">rsp, rcx</span><span leaf="">; 分配入栈参数                  </span><span leaf=""><br/></span><span leaf="">// 对齐rsp                  </span><span leaf=""><br/></span><span leaf="">and</span><span leaf="">rsp, 0FFFFFFFFFFFFFFF0h                  </span><span leaf=""><br/></span><span leaf="">add</span><span leaf="">rsp, rcx</span><span leaf="">; 堆栈加回去                  </span><span leaf=""><br/></span><span leaf="">test</span><span leaf="">ebx, ebx                  </span><span leaf=""><br/></span><span leaf="">jz</span><span leaf="">core_call</span><span leaf="">; 0 个参数直接调用call                  </span><span leaf=""><br/></span><span leaf="">loop_arg_deal:                  </span><span leaf=""><br/></span><span leaf="">mov</span><span leaf="">rax, [rbp+rbx*8+0]</span><span leaf="">; 取一个参数                  </span><span leaf=""><br/></span><span leaf="">cmp</span><span leaf="">ebx, 1                   </span><span leaf=""><br/></span><span leaf="">jnz</span><span leaf="">judge_2</span><span leaf="">; 不是1个参数就跳转                  </span><span leaf=""><br/></span><span leaf="">mov</span><span leaf="">rcx, rax</span><span leaf="">; 如果只有一个参数就放在rcx中                  </span><span leaf=""><br/></span><span leaf="">jmp</span><span leaf="">dec_arg_count                  </span><span leaf=""><br/></span><span leaf="">judge_2:                  </span><span leaf=""><br/></span><span leaf="">cmp</span><span leaf="">ebx, 2                  </span><span leaf=""><br/></span><span leaf="">jnz</span><span leaf="">judge_3 ; 如果不是2个参数，就跳转                  </span><span leaf=""><br/></span><span leaf="">mov</span><span leaf="">rdx, rax</span><span leaf="">; 第二个参数放入rdx中                  </span><span leaf=""><br/></span><span leaf="">jmp</span><span leaf="">dec_arg_count                  </span><span leaf=""><br/></span><span leaf="">judge_3:                  </span><span leaf=""><br/></span><span leaf="">cmp</span><span leaf="">ebx, 3                  </span><span leaf=""><br/></span><span leaf="">jnz</span><span leaf="">judge_4 ;如果不是3个参数，就跳转                  </span><span leaf=""><br/></span><span leaf="">mov</span><span leaf="">r8, rax</span><span leaf="">; 第三个参数放入r8中                  </span><span leaf=""><br/></span><span leaf="">jmp</span><span leaf="">dec_arg_count                  </span><span leaf=""><br/></span><span leaf="">judge_4:                  </span><span leaf=""><br/></span><span leaf="">cmp</span><span leaf="">ebx, 4                  </span><span leaf=""><br/></span><span leaf="">jnz</span><span leaf="">external_args ; 如果大于4个参数，就把当前的入栈                  </span><span leaf=""><br/></span><span leaf="">mov</span><span leaf="">r9, rax</span><span leaf="">; 第四个参数放入r9中                  </span><span leaf=""><br/></span><span leaf="">jmp</span><span leaf="">dec_arg_count                  </span><span leaf=""><br/></span><span leaf="">external_args:                  </span><span leaf=""><br/></span><span leaf="">push</span><span leaf="">qword ptr [rbp+rbx*8+20h]                  </span><span leaf=""><br/></span><span leaf="">dec_arg_count:                  </span><span leaf=""><br/></span><span leaf="">sub</span><span leaf="">ebx, 1</span><span leaf="">; 剩余参数-1                  </span><span leaf=""><br/></span><span leaf="">jnz</span><span leaf="">loop_arg_deal                  </span><span leaf=""><br/></span><span leaf="">core_call:                  </span><span leaf=""><br/></span><span leaf="">mov</span><span leaf="">rax, [rbp+0]</span><span leaf="">; 取出来函数地址                  </span><span leaf=""><br/></span><span leaf="">sub</span><span leaf="">rsp, 20h</span><span leaf="">; 分配0x20个4参数空间                  </span><span leaf=""><br/></span><span leaf="">call</span><span leaf="">rax</span><span leaf="">; 调用                  </span><span leaf=""><br/></span><span leaf="">mov</span><span leaf="">rsp, [rbp-10h]</span><span leaf="">; 恢复堆栈                  </span><span leaf=""><br/></span><span leaf="">mov</span><span leaf="">rbp, [rbp-8]</span><span leaf="">; 恢复伪栈寄存器                  </span><span leaf=""><br/></span><span leaf="">mov</span><span leaf="">[rbp+0], rax</span><span leaf="">; 结果存入                  </span><span leaf=""><br/></span><span leaf="">mov</span><span leaf="">rbx, rbp</span><span leaf="">; 伪寄存器恢复                  </span><span leaf=""><br/></span><span leaf="">pop</span><span leaf="">r9                  </span><span leaf=""><br/></span><span leaf="">pop</span><span leaf="">r11                  </span><span leaf=""><br/></span><span leaf="">pop</span><span leaf="">rbp                  </span><span leaf=""><br/></span><span leaf="">; EndHandler                  </span><span leaf=""><br/></span><span leaf="">sub</span><span leaf="">rbp, 4                  </span><span leaf=""><br/></span><span leaf="">mov</span><span leaf="">ecx, [rbp+0]                  </span><span leaf=""><br/></span><span leaf="">xor</span><span leaf="">ecx, r9d                  </span><span leaf=""><br/></span><span leaf="">sub</span><span leaf="">ecx, 7D526FFAh                  </span><span leaf=""><br/></span><span leaf="">bswap</span><span leaf="">ecx                  </span><span leaf=""><br/></span><span leaf="">xor</span><span leaf="">ecx, 24E27C67h                  </span><span leaf=""><br/></span><span leaf="">not</span><span leaf="">ecx                  </span><span leaf=""><br/></span><span leaf="">inc</span><span leaf="">ecx                  </span><span leaf=""><br/></span><span leaf="">bswap</span><span leaf="">ecx                  </span><span leaf=""><br/></span><span leaf="">push</span><span leaf="">r9                  </span><span leaf=""><br/></span><span leaf="">xor</span><span leaf="">[rsp], ecx                  </span><span leaf=""><br/></span><span leaf="">pop</span><span leaf="">r9                  </span><span leaf=""><br/></span><span leaf="">movsxd</span><span leaf="">rcx, ecx                  </span><span leaf=""><br/></span><span leaf="">add</span><span leaf="">r11, rcx                  </span><span leaf=""><br/></span><span leaf="">jmp</span><span leaf="">r11</span></span><o:page></o:page></p></td></tr></tbody></table><p style="margin-top:16.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:2;"><span style="mso-bookmark:heading_13;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;color:#3370FF;"><span leaf="">11. </span></span></span><span style="mso-bookmark:heading_13;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">push [address]</span></span></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;text-indent:21.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">根据前文的handler总结，规律大差不差，后面的handler我们用简单的伪代码来表示一下核心逻辑</span></span></p><table style="margin-left: 0.0;border: none;border-collapse: collapse;mso-table-layout-alt: fixed;mso-border-top-alt: solid #DEE0E3 0.25pt;mso-border-left-alt: solid #DEE0E3 0.25pt;mso-border-bottom-alt: solid #DEE0E3 0.25pt;mso-border-right-alt: solid #DEE0E3 0.25pt;mso-padding-alt: 0pt 5.4pt 0pt 5.4pt;width: 100%;"><tbody><tr><td data-colwidth="552" width="552" valign="top" style="background: rgb(245, 246, 247);border-width: 1pt;border-style: solid;border-color: rgb(222, 224, 227);padding: 3pt 6pt 1.5pt;"><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;color:#646A73;"><span leaf="">Assembly language                  </span></span><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;"><span leaf="">mov reg1, [stack_registr_]                  </span><span leaf=""><br/></span><span leaf="">mov reg2, [reg1]                  </span><span leaf=""><br/></span><span leaf="">sub stack_registr_, result_size - operand_size                  </span><span leaf=""><br/></span><span leaf="">[stack_registr_] = reg2</span></span></p></td></tr></tbody></table><p style="margin-top:16.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:2;"><span style="mso-bookmark:heading_14;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;color:#3370FF;"><span leaf="">12. </span></span></span><span style="mso-bookmark:heading_14;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">pop [address]</span></span></span></p><table style="margin-left: 0.0;border: none;border-collapse: collapse;mso-table-layout-alt: fixed;mso-border-top-alt: solid #DEE0E3 0.25pt;mso-border-left-alt: solid #DEE0E3 0.25pt;mso-border-bottom-alt: solid #DEE0E3 0.25pt;mso-border-right-alt: solid #DEE0E3 0.25pt;mso-padding-alt: 0pt 5.4pt 0pt 5.4pt;width: 100%;"><tbody><tr><td data-colwidth="552" width="552" valign="top" style="background: rgb(245, 246, 247);border-width: 1pt;border-style: solid;border-color: rgb(222, 224, 227);padding: 3pt 6pt 1.5pt;"><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;color:#646A73;"><span leaf="">Assembly language                  </span></span><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;"><span leaf="">mov reg1, [stack_registr_]                  </span><span leaf=""><br/></span><span leaf="">mov reg2, [stack_registr_ + 8]                  </span><span leaf=""><br/></span><span leaf="">add stack_registr_, operand_size                  </span><span leaf=""><br/></span><span leaf="">mov [reg1], reg2</span></span></p></td></tr></tbody></table><p style="margin-top:16.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:2;"><span style="mso-bookmark:heading_15;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;color:#3370FF;"><span leaf="">13. </span></span></span><span style="mso-bookmark:heading_15;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">push segment register</span></span></span></p><table style="margin-left: 0.0;border: none;border-collapse: collapse;mso-table-layout-alt: fixed;mso-border-top-alt: solid #DEE0E3 0.25pt;mso-border-left-alt: solid #DEE0E3 0.25pt;mso-border-bottom-alt: solid #DEE0E3 0.25pt;mso-border-right-alt: solid #DEE0E3 0.25pt;mso-padding-alt: 0pt 5.4pt 0pt 5.4pt;width: 100%;"><tbody><tr><td data-colwidth="552" width="552" valign="top" style="background: rgb(245, 246, 247);border-width: 1pt;border-style: solid;border-color: rgb(222, 224, 227);padding: 3pt 6pt 1.5pt;"><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;color:#646A73;"><span leaf="">Assembly language                  </span></span><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;"><span leaf="">mov reg1, seg                  </span><span leaf=""><br/></span><span leaf="">sub stack_registr_, 2                  </span><span leaf=""><br/></span><span leaf="">mov word ptr [stack_registr_], reg1</span></span></p></td></tr></tbody></table><p style="margin-top:16.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:2;"><span style="mso-bookmark:heading_16;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;color:#3370FF;"><span leaf="">14. </span></span></span><span style="mso-bookmark:heading_16;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">Pop segment register</span></span></span></p><table style="margin-left: 0.0;border: none;border-collapse: collapse;mso-table-layout-alt: fixed;mso-border-top-alt: solid #DEE0E3 0.25pt;mso-border-left-alt: solid #DEE0E3 0.25pt;mso-border-bottom-alt: solid #DEE0E3 0.25pt;mso-border-right-alt: solid #DEE0E3 0.25pt;mso-padding-alt: 0pt 5.4pt 0pt 5.4pt;width: 100%;"><tbody><tr><td data-colwidth="552" width="552" valign="top" style="background: rgb(245, 246, 247);border-width: 1pt;border-style: solid;border-color: rgb(222, 224, 227);padding: 3pt 6pt 1.5pt;"><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;color:#646A73;"><span leaf="">Assembly language                  </span></span><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;"><span leaf="">mov reg1, [stack_registr_]                  </span><span leaf=""><br/></span><span leaf="">add stack_registr_, operand_size                  </span><span leaf=""><br/></span><span leaf="">mov seg, reg1</span></span></p></td></tr></tbody></table><p style="margin-top:16.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:2;"><span style="mso-bookmark:heading_17;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;color:#3370FF;"><span leaf="">15. </span></span></span><span style="mso-bookmark:heading_17;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">Push debug register</span></span></span></p><table style="margin-left: 0.0;border: none;border-collapse: collapse;mso-table-layout-alt: fixed;mso-border-top-alt: solid #DEE0E3 0.25pt;mso-border-left-alt: solid #DEE0E3 0.25pt;mso-border-bottom-alt: solid #DEE0E3 0.25pt;mso-border-right-alt: solid #DEE0E3 0.25pt;mso-padding-alt: 0pt 5.4pt 0pt 5.4pt;width: 100%;"><tbody><tr><td data-colwidth="552" width="552" valign="top" style="background: rgb(245, 246, 247);border-width: 1pt;border-style: solid;border-color: rgb(222, 224, 227);padding: 3pt 6pt 1.5pt;"><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;color:#646A73;"><span leaf="">Assembly language                  </span></span><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;"><span leaf="">mov reg1, DrN                  </span><span leaf=""><br/></span><span leaf="">sub stack_registr_, 8                  </span><span leaf=""><br/></span><span leaf="">mov [stack_registr_], reg1</span></span></p></td></tr></tbody></table><p style="margin-top:16.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:2;"><span style="mso-bookmark:heading_18;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;color:#3370FF;"><span leaf="">16. </span></span></span><span style="mso-bookmark:heading_18;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">Pop debug register</span></span></span></p><table style="margin-left: 0.0;border: none;border-collapse: collapse;mso-table-layout-alt: fixed;mso-border-top-alt: solid #DEE0E3 0.25pt;mso-border-left-alt: solid #DEE0E3 0.25pt;mso-border-bottom-alt: solid #DEE0E3 0.25pt;mso-border-right-alt: solid #DEE0E3 0.25pt;mso-padding-alt: 0pt 5.4pt 0pt 5.4pt;width: 100%;"><tbody><tr><td data-colwidth="552" width="552" valign="top" style="background: rgb(245, 246, 247);border-width: 1pt;border-style: solid;border-color: rgb(222, 224, 227);padding: 3pt 6pt 1.5pt;"><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;color:#646A73;"><span leaf="">Assembly language                  </span></span><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;"><span leaf="">mov reg1, [stack_registr_]                  </span><span leaf=""><br/></span><span leaf="">add stack_registr_, 8                  </span><span leaf=""><br/></span><span leaf="">mov i, reg1</span></span></p></td></tr></tbody></table><p style="margin-top:16.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:2;"><span style="mso-bookmark:heading_19;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;color:#3370FF;"><span leaf="">17. </span></span></span><span style="mso-bookmark:heading_19;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">Push control register</span></span></span></p><table style="margin-left: 0.0;border: none;border-collapse: collapse;mso-table-layout-alt: fixed;mso-border-top-alt: solid #DEE0E3 0.25pt;mso-border-left-alt: solid #DEE0E3 0.25pt;mso-border-bottom-alt: solid #DEE0E3 0.25pt;mso-border-right-alt: solid #DEE0E3 0.25pt;mso-padding-alt: 0pt 5.4pt 0pt 5.4pt;width: 100%;"><tbody><tr><td data-colwidth="552" width="552" valign="top" style="background: rgb(245, 246, 247);border-width: 1pt;border-style: solid;border-color: rgb(222, 224, 227);padding: 3pt 6pt 1.5pt;"><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;color:#646A73;"><span leaf="">Assembly language                  </span></span><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;"><span leaf="">mov reg1, CrN                  </span><span leaf=""><br/></span><span leaf="">sub stack_registr_, 8                  </span><span leaf=""><br/></span><span leaf="">mov [stack_registr_], reg1</span></span></p></td></tr></tbody></table><p style="margin-top:16.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:2;"><span style="mso-bookmark:heading_20;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;color:#3370FF;"><span leaf="">18. </span></span></span><span style="mso-bookmark:heading_20;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">Pop control register</span></span></span></p><table style="margin-left: 0.0;border: none;border-collapse: collapse;mso-table-layout-alt: fixed;mso-border-top-alt: solid #DEE0E3 0.25pt;mso-border-left-alt: solid #DEE0E3 0.25pt;mso-border-bottom-alt: solid #DEE0E3 0.25pt;mso-border-right-alt: solid #DEE0E3 0.25pt;mso-padding-alt: 0pt 5.4pt 0pt 5.4pt;width: 100%;"><tbody><tr><td data-colwidth="552" width="552" valign="top" style="background: rgb(245, 246, 247);border-width: 1pt;border-style: solid;border-color: rgb(222, 224, 227);padding: 3pt 6pt 1.5pt;"><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;color:#646A73;"><span leaf="">Assembly language                  </span></span><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;"><span leaf="">mov reg1, [stack_registr_]                  </span><span leaf=""><br/></span><span leaf="">add stack_registr_, 8                  </span><span leaf=""><br/></span><span leaf="">mov CrN, reg1</span></span></p></td></tr></tbody></table><p style="margin-top:16.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:2;"><span style="mso-bookmark:heading_21;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;color:#3370FF;"><span leaf="">19. </span></span></span><span style="mso-bookmark:heading_21;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">Push rsp</span></span></span></p><table style="margin-left: 0.0;border: none;border-collapse: collapse;mso-table-layout-alt: fixed;mso-border-top-alt: solid #DEE0E3 0.25pt;mso-border-left-alt: solid #DEE0E3 0.25pt;mso-border-bottom-alt: solid #DEE0E3 0.25pt;mso-border-right-alt: solid #DEE0E3 0.25pt;mso-padding-alt: 0pt 5.4pt 0pt 5.4pt;width: 100%;"><tbody><tr><td data-colwidth="552" width="552" valign="top" style="background: rgb(245, 246, 247);border-width: 1pt;border-style: solid;border-color: rgb(222, 224, 227);padding: 3pt 6pt 1.5pt;"><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;color:#646A73;"><span leaf="">Assembly language                  </span></span><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;"><span leaf="">mov reg1, stack_registr_                  </span><span leaf=""><br/></span><span leaf="">sub stack_registr_, 8                  </span><span leaf=""><br/></span><span leaf="">mov [stack_registr_], reg1</span></span></p></td></tr></tbody></table><p style="margin-top:16.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:2;"><span style="mso-bookmark:heading_22;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;color:#3370FF;"><span leaf="">20. </span></span></span><span style="mso-bookmark:heading_22;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">Pop rsp</span></span></span></p><table style="margin-left: 0.0;border: none;border-collapse: collapse;mso-table-layout-alt: fixed;mso-border-top-alt: solid #DEE0E3 0.25pt;mso-border-left-alt: solid #DEE0E3 0.25pt;mso-border-bottom-alt: solid #DEE0E3 0.25pt;mso-border-right-alt: solid #DEE0E3 0.25pt;mso-padding-alt: 0pt 5.4pt 0pt 5.4pt;width: 100%;"><tbody><tr><td data-colwidth="552" width="552" valign="top" style="background: rgb(245, 246, 247);border-width: 1pt;border-style: solid;border-color: rgb(222, 224, 227);padding: 3pt 6pt 1.5pt;"><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;color:#646A73;"><span leaf="">Assembly language                  </span><span leaf=""><br/></span></span><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;"><span leaf="">mov stack_registr_, [stack_registr_]</span></span></p></td></tr></tbody></table><p style="margin-top:16.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:2;"><span style="mso-bookmark:heading_23;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;color:#3370FF;"><span leaf="">21. </span></span></span><span style="mso-bookmark:heading_23;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">Nor</span></span></span></p><table style="margin-left: 0.0;border: none;border-collapse: collapse;mso-table-layout-alt: fixed;mso-border-top-alt: solid #DEE0E3 0.25pt;mso-border-left-alt: solid #DEE0E3 0.25pt;mso-border-bottom-alt: solid #DEE0E3 0.25pt;mso-border-right-alt: solid #DEE0E3 0.25pt;mso-padding-alt: 0pt 5.4pt 0pt 5.4pt;width: 100%;"><tbody><tr><td data-colwidth="552" width="552" valign="top" style="background: rgb(245, 246, 247);border-width: 1pt;border-style: solid;border-color: rgb(222, 224, 227);padding: 3pt 6pt 1.5pt;"><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;color:#646A73;"><span leaf="">Assembly language                  </span></span><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;"><span leaf="">mov reg1, [stack_registr_]                  </span><span leaf=""><br/></span><span leaf="">mov reg2, [stack_registr_ + mov_size]                  </span><span leaf=""><br/></span><span leaf="">sub stack_registr_, offset                  </span><span leaf=""><br/></span><span leaf="">not reg1                  </span><span leaf=""><br/></span><span leaf="">not reg2                  </span><span leaf=""><br/></span><span leaf="">and reg1, reg2                  </span><span leaf=""><br/></span><span leaf="">mov [stack_registr_ + 8]， reg1                  </span><span leaf=""><br/></span><span leaf="">pushfq                  </span><span leaf=""><br/></span><span leaf="">pop [stack_registr_]</span></span></p></td></tr></tbody></table><p style="margin-top:16.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:2;"><span style="mso-bookmark:heading_24;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;color:#3370FF;"><span leaf="">22. </span></span></span><span style="mso-bookmark:heading_24;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">Nand</span></span></span></p><table style="margin-left: 0.0;border: none;border-collapse: collapse;mso-table-layout-alt: fixed;mso-border-top-alt: solid #DEE0E3 0.25pt;mso-border-left-alt: solid #DEE0E3 0.25pt;mso-border-bottom-alt: solid #DEE0E3 0.25pt;mso-border-right-alt: solid #DEE0E3 0.25pt;mso-padding-alt: 0pt 5.4pt 0pt 5.4pt;width: 100%;"><tbody><tr><td data-colwidth="552" width="552" valign="top" style="background: rgb(245, 246, 247);border-width: 1pt;border-style: solid;border-color: rgb(222, 224, 227);padding: 3pt 6pt 1.5pt;"><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;color:#646A73;"><span leaf="">Assembly language                  </span></span><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;"><span leaf="">mov reg1, [stack_registr_]                  </span><span leaf=""><br/></span><span leaf="">mov reg2, [stack_registr_ + mov_size]                  </span><span leaf=""><br/></span><span leaf="">sub stack_registr_, offset                  </span><span leaf=""><br/></span><span leaf="">not reg1                  </span><span leaf=""><br/></span><span leaf="">not reg2                  </span><span leaf=""><br/></span><span leaf="">or reg1, reg2                  </span><span leaf=""><br/></span><span leaf="">mov [stack_registr_ + 8], reg1                  </span><span leaf=""><br/></span><span leaf="">pushfq                  </span><span leaf=""><br/></span><span leaf="">pop [stack_registr_]</span></span></p></td></tr></tbody></table><p style="margin-top:16.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:2;"><span style="mso-bookmark:heading_25;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;color:#3370FF;"><span leaf="">23. </span></span></span><span style="mso-bookmark:heading_25;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">shl/shr</span></span></span></p><table style="margin-left: 0.0;border: none;border-collapse: collapse;mso-table-layout-alt: fixed;mso-border-top-alt: solid #DEE0E3 0.25pt;mso-border-left-alt: solid #DEE0E3 0.25pt;mso-border-bottom-alt: solid #DEE0E3 0.25pt;mso-border-right-alt: solid #DEE0E3 0.25pt;mso-padding-alt: 0pt 5.4pt 0pt 5.4pt;width: 100%;"><tbody><tr><td data-colwidth="552" width="552" valign="top" style="background: rgb(245, 246, 247);border-width: 1pt;border-style: solid;border-color: rgb(222, 224, 227);padding: 3pt 6pt 1.5pt;"><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;color:#646A73;"><span leaf="">Assembly language                  </span></span><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;"><span leaf="">mov reg1, [stack_registr_]                  </span><span leaf=""><br/></span><span leaf="">mov cl, [stack_registr_ + mov_size]                  </span><span leaf=""><br/></span><span leaf="">sub stack_registr_, offset                  </span><span leaf=""><br/></span><span leaf="">shl/shr reg1, cl                  </span><span leaf=""><br/></span><span leaf="">mov [stack_registr_ + 8], reg1                  </span><span leaf=""><br/></span><span leaf="">pushfq                  </span><span leaf=""><br/></span><span leaf="">pop [stack_registr_]</span></span></p></td></tr></tbody></table><p style="margin-top:16.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:2;"><span style="mso-bookmark:heading_26;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;color:#3370FF;"><span leaf="">24. </span></span></span><span style="mso-bookmark:heading_26;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">rcl/rcr</span></span></span></p><table style="margin-left: 0.0;border: none;border-collapse: collapse;mso-table-layout-alt: fixed;mso-border-top-alt: solid #DEE0E3 0.25pt;mso-border-left-alt: solid #DEE0E3 0.25pt;mso-border-bottom-alt: solid #DEE0E3 0.25pt;mso-border-right-alt: solid #DEE0E3 0.25pt;mso-padding-alt: 0pt 5.4pt 0pt 5.4pt;width: 100%;"><tbody><tr><td data-colwidth="552" width="552" valign="top" style="background: rgb(245, 246, 247);border-width: 1pt;border-style: solid;border-color: rgb(222, 224, 227);padding: 3pt 6pt 1.5pt;"><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;color:#646A73;"><span leaf="">Assembly language                  </span></span><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;"><span leaf="">mov reg1, [stack_registr_]                  </span><span leaf=""><br/></span><span leaf="">mov cx, [stack_registr_ + mov_size]                  </span><span leaf=""><br/></span><span leaf="">sub stack_registr_, offset                  </span><span leaf=""><br/></span><span leaf="">shr ch, 1                  </span><span leaf=""><br/></span><span leaf="">rcx/rcr reg1, cl                  </span><span leaf=""><br/></span><span leaf="">mov [stack_registr_ + 8], reg1                  </span><span leaf=""><br/></span><span leaf="">pushfq                  </span><span leaf=""><br/></span><span leaf="">pop [stack_registr_]</span></span></p></td></tr></tbody></table><p style="margin-top:16.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:2;"><span style="mso-bookmark:heading_27;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;color:#3370FF;"><span leaf="">25. </span></span></span><span style="mso-bookmark:heading_27;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">shld/shrd</span></span></span></p><table style="margin-left: 0.0;border: none;border-collapse: collapse;mso-table-layout-alt: fixed;mso-border-top-alt: solid #DEE0E3 0.25pt;mso-border-left-alt: solid #DEE0E3 0.25pt;mso-border-bottom-alt: solid #DEE0E3 0.25pt;mso-border-right-alt: solid #DEE0E3 0.25pt;mso-padding-alt: 0pt 5.4pt 0pt 5.4pt;width: 100%;"><tbody><tr><td data-colwidth="552" width="552" valign="top" style="background: rgb(245, 246, 247);border-width: 1pt;border-style: solid;border-color: rgb(222, 224, 227);padding: 3pt 6pt 1.5pt;"><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;color:#646A73;"><span leaf="">Assembly language                  </span></span><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;"><span leaf="">mov reg1, [stack_registr_]                  </span><span leaf=""><br/></span><span leaf="">mov reg2, [stack_registr_ + size]                  </span><span leaf=""><br/></span><span leaf="">mov cl, [stack_registr_ + size * 2]                  </span><span leaf=""><br/></span><span leaf="">sub stack_registr_, offset                  </span><span leaf=""><br/></span><span leaf="">shld/shrd reg1, reg2, cl                  </span><span leaf=""><br/></span><span leaf="">mov [stack_registr_ + 8], reg1                  </span><span leaf=""><br/></span><span leaf="">pushfq                  </span><span leaf=""><br/></span><span leaf="">pop [stack_registr_]</span></span></p></td></tr></tbody></table><p style="margin-top:16.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:2;"><span style="mso-bookmark:heading_28;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;color:#3370FF;"><span leaf="">26. </span></span></span><span style="mso-bookmark:heading_28;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">div/idiv</span></span></span></p><table style="margin-left: 0.0;border: none;border-collapse: collapse;mso-table-layout-alt: fixed;mso-border-top-alt: solid #DEE0E3 0.25pt;mso-border-left-alt: solid #DEE0E3 0.25pt;mso-border-bottom-alt: solid #DEE0E3 0.25pt;mso-border-right-alt: solid #DEE0E3 0.25pt;mso-padding-alt: 0pt 5.4pt 0pt 5.4pt;width: 100%;"><tbody><tr><td data-colwidth="552" width="552" valign="top" style="background: rgb(245, 246, 247);border-width: 1pt;border-style: solid;border-color: rgb(222, 224, 227);padding: 3pt 6pt 1.5pt;"><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;color:#646A73;"><span leaf="">Assembly language                  </span></span><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;"><span leaf="">mov rax, [stack_registr_]                  </span><span leaf=""><br/></span><span leaf="">mov rcx, [stack_registr_ + mov_size]                  </span><span leaf=""><br/></span><span leaf="">sub rsp, offset                  </span><span leaf=""><br/></span><span leaf="">div/idiv rcx                  </span><span leaf=""><br/></span><span leaf="">mov [stack_registr_], rax                  </span><span leaf=""><br/></span><span leaf="">pushfq                  </span><span leaf=""><br/></span><span leaf="">pop [stack_registr_]</span></span></p></td></tr></tbody></table><p style="margin-top:16.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:2;"><span style="mso-bookmark:heading_29;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;color:#3370FF;"><span leaf="">27. </span></span></span><span style="mso-bookmark:heading_29;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">mul/imul</span></span></span></p><table style="margin-left: 0.0;border: none;border-collapse: collapse;mso-table-layout-alt: fixed;mso-border-top-alt: solid #DEE0E3 0.25pt;mso-border-left-alt: solid #DEE0E3 0.25pt;mso-border-bottom-alt: solid #DEE0E3 0.25pt;mso-border-right-alt: solid #DEE0E3 0.25pt;mso-padding-alt: 0pt 5.4pt 0pt 5.4pt;width: 100%;"><tbody><tr><td data-colwidth="552" width="552" valign="top" style="background: rgb(245, 246, 247);border-width: 1pt;border-style: solid;border-color: rgb(222, 224, 227);padding: 3pt 6pt 1.5pt;"><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;color:#646A73;"><span leaf="">Assembly language                  </span></span><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;"><span leaf="">mov rax, [stack_registr_ + mov_size]                  </span><span leaf=""><br/></span><span leaf="">mov rdx, [stack_registr_]                  </span><span leaf=""><br/></span><span leaf="">sub rsp, offset                  </span><span leaf=""><br/></span><span leaf="">mul/imul rdx                  </span><span leaf=""><br/></span><span leaf="">mov [stack_registr_ + 8], rdx                  </span><span leaf=""><br/></span><span leaf="">mov [stack_registr_ + 8 + mov_size], rax                  </span><span leaf=""><br/></span><span leaf="">pushfq                  </span><span leaf=""><br/></span><span leaf="">pop [stack_registr_]</span></span></p></td></tr></tbody></table><p style="margin-top:16.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:2;"><span style="mso-bookmark:heading_30;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;color:#3370FF;"><span leaf="">28. </span></span></span><span style="mso-bookmark:heading_30;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">fild, fld, fadd, fsub, fsubr, fstp, fst, fist, fistp, fdiv, fmul, fcomp, fstcw, fldcw, fstsw</span></span></span></p><table style="margin-left: 0.0;border: none;border-collapse: collapse;mso-table-layout-alt: fixed;mso-border-top-alt: solid #DEE0E3 0.25pt;mso-border-left-alt: solid #DEE0E3 0.25pt;mso-border-bottom-alt: solid #DEE0E3 0.25pt;mso-border-right-alt: solid #DEE0E3 0.25pt;mso-padding-alt: 0pt 5.4pt 0pt 5.4pt;width: 100%;"><tbody><tr><td data-colwidth="552" width="552" valign="top" style="background: rgb(245, 246, 247);border-width: 1pt;border-style: solid;border-color: rgb(222, 224, 227);padding: 3pt 6pt 1.5pt;"><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;color:#646A73;"><span leaf="">Assembly language                  </span><span leaf=""><br/></span></span><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;"><span leaf="">command [stack_registr_]</span></span></p></td></tr></tbody></table><p style="margin-top:16.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:2;"><span style="mso-bookmark:heading_31;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;color:#3370FF;"><span leaf="">29. </span></span></span><span style="mso-bookmark:heading_31;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">wait, fchs, fsqrt, f2xm1, fabs, fclex, fcos, fdecstp, fincstp, finit, fldln2, fldz, fld1, fldpi, fpatan, fprem, fprem1, fptan, frndint, fsin, ftst, fyl2x, fldlg2</span></span></span></p><table style="margin-left: 0.0;border: none;border-collapse: collapse;mso-table-layout-alt: fixed;mso-border-top-alt: solid #DEE0E3 0.25pt;mso-border-left-alt: solid #DEE0E3 0.25pt;mso-border-bottom-alt: solid #DEE0E3 0.25pt;mso-border-right-alt: solid #DEE0E3 0.25pt;mso-padding-alt: 0pt 5.4pt 0pt 5.4pt;width: 100%;"><tbody><tr><td data-colwidth="552" width="552" valign="top" style="background: rgb(245, 246, 247);border-width: 1pt;border-style: solid;border-color: rgb(222, 224, 227);padding: 3pt 6pt 1.5pt;"><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;color:#646A73;"><span leaf="">Assembly language                  </span><span leaf=""><br/></span></span><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;"><span leaf="">command</span></span></p></td></tr></tbody></table><p style="margin-top:16.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:2;"><span style="mso-bookmark:heading_32;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;color:#3370FF;"><span leaf="">30. </span></span></span><span style="mso-bookmark:heading_32;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">ret/iret</span></span></span></p><table style="margin-left: 0.0;border: none;border-collapse: collapse;mso-table-layout-alt: fixed;mso-border-top-alt: solid #DEE0E3 0.25pt;mso-border-left-alt: solid #DEE0E3 0.25pt;mso-border-bottom-alt: solid #DEE0E3 0.25pt;mso-border-right-alt: solid #DEE0E3 0.25pt;mso-padding-alt: 0pt 5.4pt 0pt 5.4pt;width: 100%;"><tbody><tr><td data-colwidth="552" width="552" valign="top" style="background: rgb(245, 246, 247);border-width: 1pt;border-style: solid;border-color: rgb(222, 224, 227);padding: 3pt 6pt 1.5pt;"><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;color:#646A73;"><span leaf="">Assembly language                  </span></span><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;"><span leaf="">mov rsp, stack_registr_                  </span><span leaf=""><br/></span><span leaf="">pop all register                  </span><span leaf=""><br/></span><span leaf="">ret/iret</span></span></p></td></tr></tbody></table><p style="margin-top:16.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:2;"><span style="mso-bookmark:heading_33;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;color:#3370FF;"><span leaf="">31. </span></span></span><span style="mso-bookmark:heading_33;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">popf</span></span></span></p><table style="margin-left: 0.0;border: none;border-collapse: collapse;mso-table-layout-alt: fixed;mso-border-top-alt: solid #DEE0E3 0.25pt;mso-border-left-alt: solid #DEE0E3 0.25pt;mso-border-bottom-alt: solid #DEE0E3 0.25pt;mso-border-right-alt: solid #DEE0E3 0.25pt;mso-padding-alt: 0pt 5.4pt 0pt 5.4pt;width: 100%;"><tbody><tr><td data-colwidth="552" width="552" valign="top" style="background: rgb(245, 246, 247);border-width: 1pt;border-style: solid;border-color: rgb(222, 224, 227);padding: 3pt 6pt 1.5pt;"><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;color:#646A73;"><span leaf="">Assembly language                  </span></span><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;"><span leaf="">push [stack_registr_]                  </span><span leaf=""><br/></span><span leaf="">add stack_registr_, 8                  </span><span leaf=""><br/></span><span leaf="">popfq</span></span></p></td></tr></tbody></table><p style="margin-top:16.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:2;"><span style="mso-bookmark:heading_34;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;color:#3370FF;"><span leaf="">32. </span></span></span><span style="mso-bookmark:heading_34;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">Jmp</span></span></span></p><table style="margin-left: 0.0;border: none;border-collapse: collapse;mso-table-layout-alt: fixed;mso-border-top-alt: solid #DEE0E3 0.25pt;mso-border-left-alt: solid #DEE0E3 0.25pt;mso-border-bottom-alt: solid #DEE0E3 0.25pt;mso-border-right-alt: solid #DEE0E3 0.25pt;mso-padding-alt: 0pt 5.4pt 0pt 5.4pt;width: 100%;"><tbody><tr><td data-colwidth="552" width="552" valign="top" style="background: rgb(245, 246, 247);border-width: 1pt;border-style: solid;border-color: rgb(222, 224, 227);padding: 3pt 6pt 1.5pt;"><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;color:#646A73;"><span leaf="">Assembly language                  </span></span><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;"><span leaf="">mov reg1, [stack_registr_]</span><span leaf="">; 这里读取了但没人用                  </span><span leaf=""><br/></span><span leaf="">add stack_registr_, 8                  </span><span leaf=""><br/></span><span leaf="">jmp xxx</span></span></p></td></tr></tbody></table><p style="margin-top:16.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:2;"><span style="mso-bookmark:heading_35;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;color:#3370FF;"><span leaf="">33. </span></span></span><span style="mso-bookmark:heading_35;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">rdtsc</span></span></span></p><table style="margin-left: 0.0;border: none;border-collapse: collapse;mso-table-layout-alt: fixed;mso-border-top-alt: solid #DEE0E3 0.25pt;mso-border-left-alt: solid #DEE0E3 0.25pt;mso-border-bottom-alt: solid #DEE0E3 0.25pt;mso-border-right-alt: solid #DEE0E3 0.25pt;mso-padding-alt: 0pt 5.4pt 0pt 5.4pt;width: 100%;"><tbody><tr><td data-colwidth="552" width="552" valign="top" style="background: rgb(245, 246, 247);border-width: 1pt;border-style: solid;border-color: rgb(222, 224, 227);padding: 3pt 6pt 1.5pt;"><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;color:#646A73;"><span leaf="">Assembly language                  </span></span><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;"><span leaf="">rdtsc                  </span><span leaf=""><br/></span><span leaf="">sub stack_registr_, 8                  </span><span leaf=""><br/></span><span leaf="">mov [stack_registr_], edx                  </span><span leaf=""><br/></span><span leaf="">mov [stack_registr_ + 4], eax</span></span></p></td></tr></tbody></table><p style="margin-top:16.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:2;"><span style="mso-bookmark:heading_36;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;color:#3370FF;"><span leaf="">34. </span></span></span><span style="mso-bookmark:heading_36;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">Cpuid</span></span></span></p><table style="margin-left: 0.0;border: none;border-collapse: collapse;mso-table-layout-alt: fixed;mso-border-top-alt: solid #DEE0E3 0.25pt;mso-border-left-alt: solid #DEE0E3 0.25pt;mso-border-bottom-alt: solid #DEE0E3 0.25pt;mso-border-right-alt: solid #DEE0E3 0.25pt;mso-padding-alt: 0pt 5.4pt 0pt 5.4pt;width: 100%;"><tbody><tr><td data-colwidth="552" width="552" valign="top" style="background: rgb(245, 246, 247);border-width: 1pt;border-style: solid;border-color: rgb(222, 224, 227);padding: 3pt 6pt 1.5pt;"><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;color:#646A73;"><span leaf="">Assembly language                  </span></span><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;"><span leaf="">mov rax, [stack_registr_]                  </span><span leaf=""><br/></span><span leaf="">mov reg1, stack_registr_                  </span><span leaf=""><br/></span><span leaf="">push rbx                  </span><span leaf=""><br/></span><span leaf="">cpuid                  </span><span leaf=""><br/></span><span leaf="">sub reg1, 12                  </span><span leaf=""><br/></span><span leaf="">mov [reg1 + 12], eax                  </span><span leaf=""><br/></span><span leaf="">mov [reg1 + 8], ebx                  </span><span leaf=""><br/></span><span leaf="">mov [reg1 + 4], ecx                  </span><span leaf=""><br/></span><span leaf="">mov [reg1], edx                  </span><span leaf=""><br/></span><span leaf="">pop rbx                  </span><span leaf=""><br/></span><span leaf="">mov stack_registr_, reg1</span></span></p></td></tr></tbody></table><p style="margin-top:16.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:2;"><span style="mso-bookmark:heading_37;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;color:#3370FF;"><span leaf="">35. </span></span></span><span style="mso-bookmark:heading_37;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">Syscall</span></span></span></p><table style="margin-left: 0.0;border: none;border-collapse: collapse;mso-table-layout-alt: fixed;mso-border-top-alt: solid #DEE0E3 0.25pt;mso-border-left-alt: solid #DEE0E3 0.25pt;mso-border-bottom-alt: solid #DEE0E3 0.25pt;mso-border-right-alt: solid #DEE0E3 0.25pt;mso-padding-alt: 0pt 5.4pt 0pt 5.4pt;width: 100%;"><tbody><tr><td data-colwidth="552" width="552" valign="top" style="background: rgb(245, 246, 247);border-width: 1pt;border-style: solid;border-color: rgb(222, 224, 227);padding: 3pt 6pt 1.5pt;"><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;color:#646A73;"><span leaf="">Assembly language                  </span></span><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;"><span leaf="">call syscallflag                  </span><span leaf=""><br/></span><span leaf="">return                   </span><span leaf=""><br/></span><span leaf="">syscallflag:                   </span><span leaf=""><br/></span><span leaf="">mov r10, rcx                  </span><span leaf=""><br/></span><span leaf="">syscall                  </span><span leaf=""><br/></span><span leaf="">ret</span></span></p></td></tr></tbody></table><p style="margin-top:16.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:2;"><span style="mso-bookmark:heading_38;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;color:#3370FF;"><span leaf="">36. </span></span></span><span style="mso-bookmark:heading_38;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">Lock</span></span></span></p><table style="margin-left: 0.0;border: none;border-collapse: collapse;mso-table-layout-alt: fixed;mso-border-top-alt: solid #DEE0E3 0.25pt;mso-border-left-alt: solid #DEE0E3 0.25pt;mso-border-bottom-alt: solid #DEE0E3 0.25pt;mso-border-right-alt: solid #DEE0E3 0.25pt;mso-padding-alt: 0pt 5.4pt 0pt 5.4pt;width: 100%;"><tbody><tr><td data-colwidth="552" width="552" valign="top" style="background: rgb(245, 246, 247);border-width: 1pt;border-style: solid;border-color: rgb(222, 224, 227);padding: 3pt 6pt 1.5pt;"><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;color:#646A73;"><span leaf="">Assembly language                  </span></span><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;"><span leaf="">mov reg1, [stack_registr_]                  </span><span leaf=""><br/></span><span leaf="">mov reg2, [stack_registr_ + 8]                  </span><span leaf=""><br/></span><span leaf="">sub/add stack_registr_, offset</span><span leaf="">和result_size对齐大小                  </span><span leaf=""><br/></span><span leaf="">lock command [reg1], reg2                  </span><span leaf=""><br/></span><span leaf="">; xchg: mov [stack_registr_], reg2</span><span leaf="">break;                  </span><span leaf=""><br/></span><span leaf="">; xadd: mov [stack_registr_], reg2                  </span><span leaf=""><br/></span><span leaf="">pushfq                  </span><span leaf=""><br/></span><span leaf="">pop [stack_registr_]</span></span></p></td></tr></tbody></table><p style="margin-top:19.0pt;margin-bottom:7.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:1;"><span style="mso-bookmark:heading_39;"><span style="font-size:18.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">VMCommand分析：</span></span></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;text-indent:21.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">前面我们已经掌握了VMP的全部handler，那么，这些handler是如何串起来工作的呢？</span></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;text-indent:21.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">通过前文的</span></span><span style="font-size:11.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">EndHandler</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">我们可看到，每次跳转到下一个Handler之前都会读取</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">伪指令寄存器</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">中的数据，然后解密，再进行跳转，我们以</span></span></p><table style="margin-left: 0.0;border: none;border-collapse: collapse;mso-table-layout-alt: fixed;mso-border-top-alt: solid #DEE0E3 0.25pt;mso-border-left-alt: solid #DEE0E3 0.25pt;mso-border-bottom-alt: solid #DEE0E3 0.25pt;mso-border-right-alt: solid #DEE0E3 0.25pt;mso-padding-alt: 0pt 5.4pt 0pt 5.4pt;width: 100%;"><tbody><tr><td data-colwidth="552" width="552" valign="top" style="background: rgb(245, 246, 247);border-width: 1pt;border-style: solid;border-color: rgb(222, 224, 227);padding: 3pt 6pt 1.5pt;"><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;color:#646A73;"><span leaf="">C++                  </span><span leaf=""><br/></span></span><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;"><span leaf="">pop rxx</span></span></p></td></tr></tbody></table><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">为例，看一下代码中是如何处理的，入口点为：</span></span></p><table style="margin-left: 0.0;border: none;border-collapse: collapse;mso-table-layout-alt: fixed;mso-border-top-alt: solid #DEE0E3 0.25pt;mso-border-left-alt: solid #DEE0E3 0.25pt;mso-border-bottom-alt: solid #DEE0E3 0.25pt;mso-border-right-alt: solid #DEE0E3 0.25pt;mso-padding-alt: 0pt 5.4pt 0pt 5.4pt;width: 100%;"><tbody><tr><td data-colwidth="552" width="552" valign="top" style="background: rgb(245, 246, 247);border-width: 1pt;border-style: solid;border-color: rgb(222, 224, 227);padding: 3pt 6pt 1.5pt;"><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;color:#646A73;"><span leaf="">C++                  </span><span leaf=""><br/></span></span><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;"><span leaf="">void IntelVirtualMachine::CompileCommand(IntelVMCommand &amp;vm_command)</span></span></p></td></tr></tbody></table><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:center;margin-left:0.0pt;line-height:120%;"><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"><span leaf=""><img style="width:552.010009765625px;height:123.0px;" class="rich_pages wxw-img" data-ratio="0.22363847045191193" data-w="1726" src="https://wechat2rss.xlab.app/img-proxy/?k=52a70dea&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWKXFvzK5FU6EGBl0Fn5XcgOAooo7FY0tgTjQyq9rKN8synucbA6171hEFG6FTMtsibfxVFUYVfELow%2F640%3Fwx_fmt%3Dpng"/></span></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">首先，代码先对寄存器做了判断，如果不为rsp，则获取，pop rxx的handler（Handlers 中的7)的入口点，并通过GetRegister随机一个寄存器偏移(针对栈)，并将该偏移放在虚拟指令集中</span></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">在函数的结尾，判断是否是开头第一个指令，如果是，则在开头插入4字节0；判断是否是末尾，如果不是末尾，则在末尾添加4字节0</span></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:center;margin-left:0.0pt;line-height:120%;"><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"><span leaf=""><img style="width:552.010009765625px;height:238.0px;" class="rich_pages wxw-img" data-ratio="0.4312096029547553" data-w="2166" src="https://wechat2rss.xlab.app/img-proxy/?k=0685475e&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWKXFvzK5FU6EGBl0Fn5XcgOjv7SEzPnoMABYd3qwpddG0n6icljKHTstl5MDtGThVUhy3UQjIx5bOg%2F640%3Fwx_fmt%3Dpng"/></span></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">即，假设有5个pop，例如：</span></span></p><table style="margin-left: 0.0;border: none;border-collapse: collapse;mso-table-layout-alt: fixed;mso-border-top-alt: solid #DEE0E3 0.25pt;mso-border-left-alt: solid #DEE0E3 0.25pt;mso-border-bottom-alt: solid #DEE0E3 0.25pt;mso-border-right-alt: solid #DEE0E3 0.25pt;mso-padding-alt: 0pt 5.4pt 0pt 5.4pt;width: 100%;"><tbody><tr><td data-colwidth="552" width="552" valign="top" style="background: rgb(245, 246, 247);border-width: 1pt;border-style: solid;border-color: rgb(222, 224, 227);padding: 3pt 6pt 1.5pt;"><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;color:#646A73;"><span leaf="">C++                  </span></span><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;"><span leaf="">pop rax                  </span><span leaf=""><br/></span><span leaf="">pop rbx                  </span><span leaf=""><br/></span><span leaf="">pop rcx                  </span><span leaf=""><br/></span><span leaf="">pop rdx                  </span><span leaf=""><br/></span><span leaf="">pop rsi</span></span></p></td></tr></tbody></table><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">那么经过上面的函数，生成的伪指令为：</span></span></p><table style="margin-left: 0.0;border: none;border-collapse: collapse;mso-table-layout-alt: fixed;mso-border-top-alt: solid #DEE0E3 0.25pt;mso-border-left-alt: solid #DEE0E3 0.25pt;mso-border-bottom-alt: solid #DEE0E3 0.25pt;mso-border-right-alt: solid #DEE0E3 0.25pt;mso-padding-alt: 0pt 5.4pt 0pt 5.4pt;width: 100%;"><tbody><tr><td data-colwidth="552" width="552" valign="top" style="background: rgb(245, 246, 247);border-width: 1pt;border-style: solid;border-color: rgb(222, 224, 227);padding: 3pt 6pt 1.5pt;"><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;color:#646A73;"><span leaf="">C++                  </span></span><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;"><span leaf="">00 00 00 00 18 00 00 00 00                  </span><span leaf=""><br/></span><span leaf="">20 00 00 00 00                  </span><span leaf=""><br/></span><span leaf="">28 00 00 00 00                  </span><span leaf=""><br/></span><span leaf="">30 00 00 00 00                  </span><span leaf=""><br/></span><span leaf="">38 </span></span></p></td></tr></tbody></table><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">当然，上面的伪指令是我随便填的，实际上的寄存器存储地址是随机的，通过针对handler的对比可以发现，一个pop读取了5个字节的伪指令寄存器，即(1字节寄存器地址偏移 + 4字节下一条指令地址偏移)</span></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">那么为什么第一条指令会多出来4个字节呢？那是因为</span></span><span style="font-size:11.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">entry_command_中也存在EndHandler</span></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">当然了，这些0是没办法直接跳转的，所以在</span></span></p><table style="margin-left: 0.0;border: none;border-collapse: collapse;mso-table-layout-alt: fixed;mso-border-top-alt: solid #DEE0E3 0.25pt;mso-border-left-alt: solid #DEE0E3 0.25pt;mso-border-bottom-alt: solid #DEE0E3 0.25pt;mso-border-right-alt: solid #DEE0E3 0.25pt;mso-padding-alt: 0pt 5.4pt 0pt 5.4pt;width: 100%;"><tbody><tr><td data-colwidth="552" width="552" valign="top" style="background: rgb(245, 246, 247);border-width: 1pt;border-style: solid;border-color: rgb(222, 224, 227);padding: 3pt 6pt 1.5pt;"><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;color:#646A73;"><span leaf="">C++                  </span><span leaf=""><br/></span></span><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;"><span leaf="">IntelVirtualMachine::CompileBlock</span></span></p></td></tr></tbody></table><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">对跳转地址做了修正</span></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:center;margin-left:0.0pt;line-height:120%;"><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"><span leaf=""><img style="width:552.010009765625px;height:181.0px;" class="rich_pages wxw-img" data-ratio="0.32963446475195823" data-w="3064" src="https://wechat2rss.xlab.app/img-proxy/?k=a2b55b1a&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWKXFvzK5FU6EGBl0Fn5XcgOXkb0TjicH3icA5FsVzHHj7fCEKQUXBsD0ibktiaKtAEkOOyUic81wTKWobQ%2F640%3Fwx_fmt%3Dpng"/></span></span></p><p style="margin-top:19.0pt;margin-bottom:7.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:1;"><span style="mso-bookmark:heading_40;"><span style="font-size:18.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">业务逻辑：</span></span></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;text-indent:21.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">看到这，恭喜你已经完成了代码主体中的基本流程，我们假设一下，如果我们的代码是</span></span></p><table style="margin-left: 0.0;border: none;border-collapse: collapse;mso-table-layout-alt: fixed;mso-border-top-alt: solid #DEE0E3 0.25pt;mso-border-left-alt: solid #DEE0E3 0.25pt;mso-border-bottom-alt: solid #DEE0E3 0.25pt;mso-border-right-alt: solid #DEE0E3 0.25pt;mso-padding-alt: 0pt 5.4pt 0pt 5.4pt;width: 100%;"><tbody><tr><td data-colwidth="552" width="552" valign="top" style="background: rgb(245, 246, 247);border-width: 1pt;border-style: solid;border-color: rgb(222, 224, 227);padding: 3pt 6pt 1.5pt;"><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;color:#646A73;"><span leaf="">C++                  </span><span leaf=""><br/></span></span><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;"><span leaf="">cpuid</span></span></p></td></tr></tbody></table><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;text-indent:21.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">那么，我们编译后的代码是34号 handler的 cpuid handler吗？答案是否定的，因为这里面还存在着一层业务逻辑</span></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:center;margin-left:0.0pt;line-height:120%;"><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"><span leaf=""><img style="width:552.010009765625px;height:300.0000305175781px;" class="rich_pages wxw-img" data-ratio="0.5447409733124019" data-w="1274" src="https://wechat2rss.xlab.app/img-proxy/?k=bcd89e8e&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWKXFvzK5FU6EGBl0Fn5XcgORuHrn5vAM14bd9PU8l70jIV8fnsoicEGHoLLR6KQKFpM1NlERSSciaow%2F640%3Fwx_fmt%3Dpng"/></span></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;text-indent:21.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">在函数</span></span><span style="font-size:11.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">IntelCommand::CompileToVM</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">中我们可以看到，cpuid指令不仅增加了cpuid handler的逻辑，还在之前把</span></span><span style="font-size:11.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">rax寄存器的值入栈</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">，执行结束后把</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">结果出栈</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">，我们回头看一下</span></span><span style="font-size:11.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">34号handler</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">的结构，再回想一下handler的运行过程——</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">参数放栈上，结果也放栈上</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">，那么一切就都对的上了。</span></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;text-indent:21.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">另外，如果是x64下的代码，vmp还会增加把几个寄存器高位清空的动作。其余的业务逻辑就不再贴出来，有时间大家可以自己copy一下源码</span></span></p><p style="margin-top:19.0pt;margin-bottom:7.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:1;"><span style="mso-bookmark:heading_41;"><span style="font-size:18.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">总结：</span></span></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;text-indent:21.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">Handlers中的列表其实并不完整，因为VMP还会初始化几个包含少部分Handlers的虚拟指令列表——我们称为</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">虚拟机</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">，编译的过程中，vmp会随机一个虚拟机进行指令替换，所以可能会出现cpuid在一个地方为被虚拟化的指令，在另一个地方需要退出虚拟化才会执行cpuid，详情可以参考IntelVirtualMachineList::Prepare及BaseFunction::virtual_machine，这里就不再赘述了。</span></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;text-indent:21.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">文章有很多不清晰或者不对的地方，希望大家帮忙指出，如果错误太大，请大家多多包涵，正如我开头所说的，我不是这方面的专家。</span></span></p><p style="margin-top:19.0pt;margin-bottom:7.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:1;"><span style="mso-bookmark:heading_42;"><span style="font-size:18.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">文章参考：</span></span></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;text-indent:21.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf=""><a href="https://mp.weixin.qq.com/s/CpbOGakvdKkWAyZogxpwvw" target="_blank">https://mp.weixin.qq.com/s/CpbOGakvdKkWAyZogxpwvw</a> (VMP3.x内部原理详解与还原思路)</span></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;text-indent:21.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf=""><a href="https://mp.weixin.qq.com/s/UU3fL70Jbw4uwGULxZeK6A" target="_blank">https://mp.weixin.qq.com/s/UU3fL70Jbw4uwGULxZeK6A</a> (VMP源码学习(1) 变异分析与代码bug)</span></span></p><p style="display: none;"><mp-style-type data-value="3"></mp-style-type></p>


<p><a href="2247485663">阅读原文</a></p>
<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=84278eb7&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzkyOTc0NDY2Nw%3D%3D%26mid%3D2247485663%26idx%3D1%26sn%3D508c4ad1f5163381c0727a6bccd48cc1">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Sun, 16 Nov 2025 10:02:00 +0800</pubDate>
    </item>
    <item>
      <title>通过分析加密流量快速检查手机是否中了APT远控</title>
      <link>https://mp.weixin.qq.com/s?__biz=MzkyOTc0NDY2Nw==&amp;mid=2247485653&amp;idx=1&amp;sn=25c4f51fcb58dae070226023ced95ab8</link>
      <description></description>
      <content:encoded><![CDATA[<p>
原创 <span>为了安全鸭</span> <span>2025-10-20 09:00</span> <span style="display: inline-block;">北京</span>
</p>




<p><img src="https://wechat2rss.xlab.app/img-proxy/?k=03039a46&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FejibWMxI7nWKxWicpMFmVqzewPzIDsbibfHcpNuAH6AZRzh9nS3TcANlWwp1hQaTosSYibkD72k0hDdW4oMLLHg6jQ%2F0%3Fwx_fmt%3Djpeg"/></p>


<h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf="">前言</span></h2><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">最近 国家授时中心 被美国用三角测量行动同样的手法攻击了iphone</span><span leaf=""><br/></span><span leaf=""><a class="normal_text_link" target="_blank" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);color: rgb(0, 154, 97);text-decoration: none;background-color: transparent;" href="https://mp.weixin.qq.com/s?__biz=MzIwNDk0MDgxMw==&amp;mid=2247500738&amp;idx=1&amp;sn=15a3608cceb8f229a656a2743e66ef8b&amp;scene=21#wechat_redirect" textvalue="" linktype="text" data-linktype="2"><a href="https://mp.weixin.qq.com/s/XPjT0BVOJPJxSmASW0tXTA" target="_blank">https://mp.weixin.qq.com/s/XPjT0BVOJPJxSmASW0tXTA</a></a></span><span leaf=""><br/></span><span leaf="">众所周知,windows的安全最容易做,即便是有0day,在windows下也一定有办法能检测。linux的安全看linux的系统版本,而手机,尤其是ios/安卓 那一坨,是压根做不了安全的.</span><span leaf="" data-pm-slice="1 1 [&#34;para&#34;,{&#34;tagName&#34;:&#34;p&#34;,&#34;attributes&#34;:{&#34;style&#34;:&#34;box-sizing: border-box; scrollbar-width: thin; scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241); margin-top: 0px; margin-bottom: 1rem; display: block; color: rgb(102, 102, 102); font-family: \&#34;Hiragino Sans GB\&#34;, 微软雅黑, 黑体, Arial, sans-serif; font-size: 14.992px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; 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;&#34;},&#34;namespaceURI&#34;:&#34;http://www.w3.org/1999/xhtml&#34;}]">因为系统机制的问题,攻防完全不对等.</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">我就在想,我们如何在不用到MVT(Mobile Verification Toolkit)的情况下怎么快速的分析一个设备是否中了0day/apt的远控木马,毕竟开ADB或者iTunes备份都挺麻烦的.</span><span leaf=""><br/></span><span leaf="">首先我想到的是流量设备,因为他非常简单,手机接入网络这个操作谁都会,连个wifi就行</span><span leaf=""><br/></span><span leaf="">而且卡巴斯基发现三角测量行动也是的流量设备先分析到的.更早的飞马 也是流量设备捕获到的.</span><span leaf=""><br/></span><span leaf="">不过我家里也没IDS/NDR设备,也没软路由,搞个流量设备不现实,所以就有了今天主题.手搓一个简单的.</span></p><h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">地址</span></h2><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">整个项目地址</span><span leaf=""><br/></span><span leaf=""><a href="https://github.com/huoji120/mbnsc" target="_blank">https://github.com/huoji120/mbnsc</a></span></p><blockquote style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin: 5px 0px 15px;overflow: hidden;border-width: 0px 0px 0px 4px;border-top-style: initial;border-right-style: initial;border-bottom-style: initial;border-left-style: solid;border-top-color: initial;border-right-color: initial;border-bottom-color: initial;border-left-color: rgb(122, 208, 58);border-image: initial;padding: 8px 12px;background-color: rgb(241, 241, 241);box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 1px 0px;font-size: 14.992px;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;"><span leaf="">这东西电脑应急响应也能用.不过windows上没设计解密RPC.MAC用了谷歌不维护的gopacket不知道能不能用.linux也得看gopacket的兼容性.</span></p></blockquote><h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">设计思路</span></h2><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">整个设计路线非常粗暴,我们搞一个抓包工具,用go-packet用libpcap进行抓包.然后我们把数据包变成一个JSON,本来想变成ELK里面的,但是考虑到便携性,还是算了.我们没必要那么重.</span><span leaf=""><br/></span><span leaf="">之后就是python的分析了.而我们目的很明确,检测APT,所以思路是:</span></p><ol style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" class="list-paddingleft-1"><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">IP/DNS/SNI 先过一次情报</span></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">检测抖动心跳 -&gt; 这个是关键</span></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">流量模式匹配,匹配特定的流量</span></p></li></ol><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">（1）很好理解</span><span leaf=""><br/></span><span leaf="">（2）主要目的是,中马后,通常是多少分钟/多少小时 来一次心跳,通过心跳来检测C2是绝对靠谱的.不会错的.要是看到10分钟一次/1分钟一次/一个小时一次的心跳,或者N久才连一次服务器的网络,那就是了.</span><span leaf=""><br/></span><span leaf="">（3）的主要目的是,辅助我们看流量的类型，虽然流量是加密的，但是我们任然可以通过接收/发送/频率做一定的模式匹配,去匹配一些相关的,上传,下载,http请求,混合交互,心跳等模式.虽然不是100%准确,但是很值得我们研究.</span><span leaf=""><br/></span><span leaf="">具体我们直接实战:</span></p><h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">教程</span></h2><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">部署</span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">电脑上开热点,手机链接热点</span><span leaf=""><br/></span><span leaf="">然后,编译好go程序,直接运行,会显示出网卡列表,选择一个网卡,一定要选,热点的网卡.不要选错了.</span><span leaf=""><br/></span><span leaf="">如果你选错网卡了,会什么都抓不到.</span><span leaf=""><br/></span><span leaf="">如果你选了电脑的网卡,不是wifi热点的网卡,则会抓整个电脑的流量,而不是只抓手机的流量</span><span leaf=""><br/></span><span leaf="">所以选择手机的wifi的网卡很重要!(还要注意不要选wifi链别人的那个网卡,要选热点的那个网卡!)</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">选正确后</span><span leaf=""><br/></span><span leaf="">xxx.exe -i 网卡名字</span><span leaf=""><br/></span><span leaf="">然后手机访问网络都有链接:</span><span leaf=""><br/></span><span leaf=""><img class="rich_pages wxw-img" data-imgfileid="100001986" data-ratio="0.22592592592592592" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" data-w="1080" src="https://wechat2rss.xlab.app/img-proxy/?k=ff36b30b&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWKxWicpMFmVqzewPzIDsbibfHicAWRjdqPJOTdT0s4MNlgKpYsEncXuQd8y4CqGZ8ricEaOCrAiaiaXTMKg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">这样才是正确的!</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">抓包开始后,建议操作,重启手机,并且息屏等10分钟或者一个小时,在电脑内存允许的情况下,放置久一点.因为我也不知道心跳什么时候回来</span><span leaf=""><br/></span><span leaf="">当抓到一定数量的包后,ctrl+c抓包软件,会生成一份JSON.用目录下的analyzer进行分析</span></p><pre style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 13.118px;margin-top: 0px;margin-bottom: 1rem;overflow: auto;display: block;color: rgb(33, 37, 41);max-height: 400px;background-color: rgb(245, 245, 245);border: 1px solid rgb(204, 204, 204);padding: 0.5em;border-radius: 4px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><code style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: inherit;color: inherit;word-break: normal;white-space: pre-wrap;"><span leaf="">python .\analyzer.py .\capture_stats_20251019_221220.json --proxy --proxy-host 127.0.0.1 --proxy-port 7890</span></code></pre><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">如果你有OTX的威胁情报key,你也可以接:</span><span leaf=""><br/></span><span leaf=""><a href="https://otx.alienvault.com/" target="_blank">https://otx.alienvault.com/</a></span><span leaf=""><br/></span><span leaf="">我本来想用国内的威胁情报的,但国内威胁情报API无一例外都收费,不如用国外的otx的</span></p><pre style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 13.118px;margin-top: 0px;margin-bottom: 1rem;overflow: auto;display: block;color: rgb(33, 37, 41);max-height: 400px;background-color: rgb(245, 245, 245);border: 1px solid rgb(204, 204, 204);padding: 0.5em;border-radius: 4px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><code style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: inherit;color: inherit;word-break: normal;white-space: pre-wrap;"><span leaf="">--otx-api-key YOUR_API_KEY</span></code></pre><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">等一会,分析完毕后,我们就能看手机这段时间内访问的信息了:</span><span leaf=""><br/></span><span leaf=""><img class="rich_pages wxw-img" data-imgfileid="100001989" data-ratio="0.5361111111111111" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" data-w="1080" src="https://wechat2rss.xlab.app/img-proxy/?k=0c52fd13&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWKxWicpMFmVqzewPzIDsbibfHoZLs9GNqrxN5xibLHJEYVJkibfwJd6PQJN6vHI8OwWOrSsT7IavXgyng%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">这个html一共有两个部分组成,首先是图表,他是能快速分析的地方</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001988" class="rich_pages wxw-img" data-ratio="0.662962962962963" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=323606f6&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWKxWicpMFmVqzewPzIDsbibfHnHK0aQOubGUFDXBQMyXtn31fE3UVZucS57ibY3NMPprQ3UYm1ca8Yug%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">另外一个是总览表格</span><span leaf=""><br/></span><span leaf=""><img class="rich_pages wxw-img" data-imgfileid="100001987" data-ratio="0.6666666666666666" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" data-w="1080" src="https://wechat2rss.xlab.app/img-proxy/?k=a536a71f&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWKxWicpMFmVqzewPzIDsbibfHr3aNrDZvHqKj9I1eicpDqsKyHs5PNicB3Aj2MusLQC32ia14oq2P3bZqw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">快速威胁检测</span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">如果你部署了OTX的API,拉到表格下面,有IOC</span><span leaf=""><br/></span><span leaf=""><img class="rich_pages wxw-img" data-imgfileid="100001985" data-ratio="0.15648148148148147" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" data-w="1080" src="https://wechat2rss.xlab.app/img-proxy/?k=a143070c&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWKxWicpMFmVqzewPzIDsbibfHB3gPOsGiaqXXpFasUt1D7O4OYvaWkAIcc4zokK1PbYIeNxHxWO2LtNQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">比如我的xred蠕虫的C2,我测试访问的</span><span leaf=""><br/></span><span leaf="">然后在图表里面也会有表格</span><span leaf=""><br/></span><span leaf=""><img class="rich_pages wxw-img" data-imgfileid="100001993" data-ratio="0.4083333333333333" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" data-w="1080" src="https://wechat2rss.xlab.app/img-proxy/?k=9ac4e3bf&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWKxWicpMFmVqzewPzIDsbibfH2Dps7ohFN0HdpykXcqp8xJiavAQJtMqIPBbApuotibnbML2z4Aico4c6Q%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><strong style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-weight: bolder;"><span leaf="">注意,OTX的情报并不是准确的,他很多CDN服务器,114dns服务器之类的会被标记恶意,这个是正常的.毕竟他是社区驱动的.</span></strong><span leaf=""><br/></span><span leaf="">而且考虑到apt的远控不太会暴露,所以IOC数据只能说看看就行.</span><span leaf=""><br/></span><span leaf="">第二就是国外IP</span><span leaf=""><br/></span><span leaf=""><img class="rich_pages wxw-img" data-imgfileid="100001991" data-ratio="0.24864864864864866" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" data-w="925" src="https://wechat2rss.xlab.app/img-proxy/?k=f757b593&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWKxWicpMFmVqzewPzIDsbibfHm8J299hynYNqOkvKP4lfcUAepBbqu259EsWQc7ny6Cwx0JFxG6hmbg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">国外IP在一个手机里面占比非常少,建议快速check,国外和香港台湾的这几个IP.</span><span leaf=""><br/></span><span leaf="">第三就是看心跳</span><span leaf=""><br/></span><span leaf="">心跳包的特征如下:</span><span leaf=""><br/></span><span leaf=""><img class="rich_pages wxw-img" data-imgfileid="100001994" data-ratio="0.4009259259259259" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" data-w="1080" src="https://wechat2rss.xlab.app/img-proxy/?k=65bb7b82&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWKxWicpMFmVqzewPzIDsbibfHERJNx93vU6sQdBrEBjRbq6gicJesYkHWpQfhClqj8XkWbyCd3hXFNXg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">这种就是非常典型的心跳包,你可以看到X秒来一次发送接受.</span><span leaf=""><br/></span><span leaf=""><img class="rich_pages wxw-img" data-imgfileid="100001992" data-ratio="0.34974533106960953" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" data-w="589" src="https://wechat2rss.xlab.app/img-proxy/?k=f85b603c&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWKxWicpMFmVqzewPzIDsbibfH3THA3ibMCic9mFkqJzePcTtBOULJ0QQyyj8fDCLyDsJLqmic0SicIz00CQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">如果心跳包是已知手机域名,那没什么问题,如果你看到</span></p><ol style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" class="list-paddingleft-1"><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">一分钟以上来一次,或者十分钟来一次,或者一个小时来一次</span></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">IP是非大陆地区</span></p></li></ol><div><p data-pm-slice="2 2 []"><span leaf="" data-pm-slice="1 1 [&#34;para&#34;,{&#34;tagName&#34;:&#34;section&#34;,&#34;attributes&#34;:{&#34;data-pm-slice&#34;:&#34;2 2 []&#34;},&#34;namespaceURI&#34;:&#34;http://www.w3.org/1999/xhtml&#34;}]">那你需要额外警惕.</span></p><p data-pm-slice="2 2 []"><span leaf="">建议用qax的威胁情报平台进行二次确认:</span><span leaf=""><br/></span><span leaf=""><a href="https://ti.qianxin.com/" target="_blank">https://ti.qianxin.com/</a></span><span leaf=""><br/></span><span leaf="">我不推荐别的,因为qax的情报对APT追踪是最敏感的</span><span leaf=""><br/></span><span leaf="">还有就是辅助的,卡巴斯基的平台</span><span leaf=""><br/></span><span leaf=""><a href="https://opentip.kaspersky.com/" target="_blank">https://opentip.kaspersky.com/</a></span><span leaf=""><br/></span><span leaf="">这两个二次确认即可</span></p></div><p><span leaf="">比如我的,虽然是心跳包,但是是小米手机追踪的东西,不知道是什么,但是应该是暂时没问题</span></p><p data-pm-slice="2 2 []"><span leaf=""><img class="rich_pages wxw-img" data-imgfileid="100001990" data-ratio="0.7552083333333334" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" data-w="384" src="https://wechat2rss.xlab.app/img-proxy/?k=d2ea6087&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWKxWicpMFmVqzewPzIDsbibfHaxdzeWjU8Lvf4iabu31BLvuibuSDD0DXEurtxfGJaTINRgsQavJFg8FQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">其他流量特征</span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">这有几种常见的模式匹配</span><span leaf=""><br/></span><span leaf="">比如这个,当你发现,send比recv小的时候,那一般就是下载流量,比如我这是美团下载的流量</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf=""><img class="rich_pages wxw-img" data-imgfileid="100001998" data-ratio="0.6648148148148149" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" data-w="1080" src="https://wechat2rss.xlab.app/img-proxy/?k=4c0712ce&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWKxWicpMFmVqzewPzIDsbibfHRf6cch6lrvSGAkDnswPRdgs2Jw6Kz3edAS7viaj41cwad6l2Duvh0Og%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">被阻断的: 单向发送,没任何的recv的,比如如下是谷歌的域名被阻断了</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001997" class="rich_pages wxw-img" data-ratio="0.6953703703703704" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=c02f1063&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWKxWicpMFmVqzewPzIDsbibfHt6fxG0xZtMOIQ7CtV7Ik9tfXq5ajgQcxf8AnSrMXKH0BghqOhtIvIA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">典型心跳:</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001999" class="rich_pages wxw-img" data-ratio="0.39166666666666666" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=a8e8d88b&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWKxWicpMFmVqzewPzIDsbibfHUJ1r0ATJ9q54PswRscc4ZABMOFKANvjV4ZWf1V5j8XicEv7qOPibNEpQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">经过排查,这个IP是小米的消息通知推送,也确实是心跳,x秒一次:</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001995" class="rich_pages wxw-img" data-ratio="0.18522267206477733" data-type="png" data-w="988" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=445677d4&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWKxWicpMFmVqzewPzIDsbibfHlHqFHQeJkb9JTJ1l8CXSCdrU2XttbA6EJY1j8woDGc7IOSgldFQ3iaA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">上传,美团的report域名</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001996" class="rich_pages wxw-img" data-ratio="0.3101851851851852" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=bf602ce3&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWKxWicpMFmVqzewPzIDsbibfHRAe1eV56Bpkl5FP4arShv9x7ic0898I2fWvz8gFjc7bIMpvunlPwAaA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100002001" class="rich_pages wxw-img" data-ratio="0.34074074074074073" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=59ad93e8&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWKxWicpMFmVqzewPzIDsbibfHSysqibqu1seZmicu0jLmhgjgDzCeVcN23GeDCxn2Icibw6pJ0icIQRicw0g%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">结语</span></h2><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">最后,经过检查,我确认我手机没问题.可以放心睡觉了</span></p><p style="display: none;"><mp-style-type data-value="3"></mp-style-type></p>


<p><a href="2247485653">阅读原文</a></p>
<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=8cdbaf02&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzkyOTc0NDY2Nw%3D%3D%26mid%3D2247485653%26idx%3D1%26sn%3D25c4f51fcb58dae070226023ced95ab8">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Mon, 20 Oct 2025 09:00:00 +0800</pubDate>
    </item>
    <item>
      <title>中秋特辑:中外AI大战!让AI们通过MCP玩帝国时代2</title>
      <link>https://mp.weixin.qq.com/s?__biz=MzkyOTc0NDY2Nw==&amp;mid=2247485632&amp;idx=1&amp;sn=5099048f6d21234acfacb5f13d2c7545</link>
      <description>前言说来话长, 熟悉我的人都知道，我每年国庆都会在家整点活，去年是深度研究APT组织Storm0978的高级注</description>
      <content:encoded><![CDATA[<p>
原创 <span>为了安全鸭</span> <span>2025-10-06 10:01</span> <span style="display: inline-block;">北京</span>
</p>




<p>
<img src="https://wechat2rss.xlab.app/img-proxy/?k=41089751&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpjX5wW2b6EPqOLC3KDL4bWibbKvA5Dt0jRmf6SMzT0MGsrnLEG0q3IHQ%2F0%3Fwx_fmt%3Djpeg"/>
</p>


<h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf="">前言</span></h2><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">说来话长, 熟悉我的人都知道，我每年国庆都会在家整点活，去年是</span><span leaf=""><br/></span><span leaf=""><a class="normal_text_link" target="_blank" style="" href="https://mp.weixin.qq.com/s?__biz=MzkyOTc0NDY2Nw==&amp;mid=2247484443&amp;idx=1&amp;sn=d75d5cb737745dd9d5106967bfd94f55&amp;scene=21#wechat_redirect" textvalue="深度研究APT组织Storm0978的高级注入技术StepBear" data-itemshowtype="0" linktype="text" data-linktype="2">深度研究APT组织Storm0978的高级注入技术StepBear</a></span><span leaf=""><br/></span><span leaf="">今年是AI通过MCP玩帝国时代2!</span><span leaf=""><br/></span><span leaf="">本系列非常非常非常复杂,原因是我一开始只是想做个能自动帮我玩帝国时代2的脚本,但是做着做着我突然觉得没意思,就改变想法搞个让大语言模型玩游戏的MCP。事实证明已经严重超出我得工作量了，不过经过快一个星期的逆向，分析，模型调用调优。我终于取得了进展。这一切都是值得的!</span><span leaf=""><br/></span><span leaf="">我们先说偏娱乐的部分,中外AI大战!</span></p><h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"></span><span leaf="">帝国时代2</span></h2><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">帝国时代2是我最喜欢的游戏，玩了快15年了.如果你不知道他是什么, 他是一款类似于红警的RTS游戏,跟红色警戒不同,他是慢节奏游戏,一把大概一个小时。所有人要采集资源,然后从黑暗时代升级到封建时代-&gt;城堡时代-&gt;帝王时代</span><span leaf=""><br/></span><span leaf="">然后互相伤害:</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001799" class="rich_pages wxw-img" data-ratio="0.5333333333333333" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=c1271449&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpaGib0NFRiaN3nZgYDsc9Y6FNBXtFZiaBaX8I4icNibKhKt2bDQULATZclgQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">我用的是steam的决定版本,因为他还在更新:</span><span leaf=""><br/></span><span leaf=""><a href="https://store.steampowered.com/app/813780/Age_of_Empires_II_Definitive_Edition/" target="_blank">https://store.steampowered.com/app/813780/Age_of_Empires_II_Definitive_Edition/</a></span></p><h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"></span><span leaf="">MCP</span></h2><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">MCP的具体设计思路下一篇再说了,总之我们有了一个能让AI操控升级时代/移动/攻击/研究科技的MCP了</span><span leaf=""><br/></span><span leaf="">MCP代码大概长这样,claude写的,1000多行:</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001796" class="rich_pages wxw-img" data-ratio="0.5111111111111111" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=05564fde&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtphKZsPEpv2uDfryC3IibhJV7Xf2RowvphT8HlrBrbmd4MMs22rRJfUBg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">claude是第一个(也许是世界上/人类上第一个),从黑暗时代升级到封建时代的AI!</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001797" class="rich_pages wxw-img" data-ratio="0.8435185185185186" data-type="jpeg" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=c3e840b0&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpXZG6B0fSLfSgicbOWn05ZCB4SDjibfKt45YTuqFqgEqQPuibKWDw6V3Mg%2F640%3Fwx_fmt%3Djpeg%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">并且还会训练马厩</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001798" class="rich_pages wxw-img" data-ratio="0.4888888888888889" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=b9121471&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpaic9sEpmQ2BnHT4Lffv2NSUbKXavpGOKp7AzFDFCVvTYNCJhqlCibtJg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">话不多说! 让我们直接开始主题! 但是在直接AI大战之前，我进行了一轮初筛，毕竟一局帝国时代2大概要一个小时，我没那么多时间浪费，而且这些模型还是要付费token用的，我也没那么多钱，所以我决定先拿现在的模型进行一波简单人机对战，谁赢了才选出来！</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">先说一下各个AI的表现吧,我们的AI Agent有两个模型在混合工作.一个是军师,他是各家模型的最强think模型,根据游戏状态和历史会话总结部署战术的人物</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001795" class="rich_pages wxw-img" data-ratio="0.5899880810488677" data-type="png" data-w="839" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=91b7df15&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpJ40nG0l9QiakOGuicUuW5DCr55zt2HsA2e4ZHTMaKRl0p2N9UW8sQhGQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">一个是实际操作的,他是非think模型,因为think一次太慢和太耗费token了,所以要快:</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001800" class="rich_pages wxw-img" data-ratio="0.39537037037037037" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=f502aaaf&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpY6eMCFjDK47c64SVbencpY0KCK7vRyzf5BpwLyIR0rwRhJ4wnDKLTQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">接下来我会简单说一下各个模型的玩这游戏的玩法,以下数据我通过几个维度评估模型好坏:</span></p><ol style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" class="list-paddingleft-1"><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">闲置村民数量</span></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">战术得分</span><span leaf=""><br/></span><span leaf="">满分五分</span></p></li></ol><h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf="">国外模型</span></h2><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"></span><span leaf="">claude</span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">综合评分: 4.8分</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">但是有一处非常奇怪,他非常喜欢采集外围资源不采集自己的.并且会无上限爆农民导致没人口造兵。</span><span leaf=""><br/></span><span leaf="">还喜欢去别人家偷资源:</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001806" class="rich_pages wxw-img" data-ratio="0.5333333333333333" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=d77884b9&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtph6rdbYTCO9HNQRtSU9U9NhydtwmHcQkQmAKcoCGgoibl3ib2WxGciaE6A%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">不过还是后期通过爆骑士打败了简单电脑</span><span leaf=""><br/></span><span leaf="">第2天测试,开局,基本完美贴合资源建造,这个是我第一次见空间感这么强的AI,其他家的包括GLM都做不到完美建筑位置开局</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001805" class="rich_pages wxw-img" data-ratio="0.4583333333333333" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=851a3be1&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpPfSxkbtqAM3h9TFwQSdL1eDAias0zIWTmUzicla16Vl7ZzTzKS2LM8ZQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">不过失误还是有的,两个村民杀猪没了:</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001804" class="rich_pages wxw-img" data-ratio="0.6607407407407407" data-type="png" data-w="675" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=53c0ccea&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpl9xJaBXIibLDVzX5NtXCicEDlapZJHKbbdKdmbfiaAWFKBJzROpaecVEA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">后期毫无悬念的碾压了简单人机，从规划到进攻表现算亮眼</span><span leaf=""><br/></span><span leaf="">本来想因为后期的操作给5分的，但是他太太太贵了！！我一看钱包只能给他4.8分了。</span></p><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"></span><span leaf="">GPT-5</span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">综合评分: 3分</span><span leaf=""><br/></span><span leaf="">我也不知道为什么,gpt5我是API版本真的跟弱智一样.原地等了五分钟才发展,在此之前一直在废话:</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001803" class="rich_pages wxw-img" data-ratio="0.5333333333333333" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=d41680dd&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpibN3EFW8FoZCPWgxgRyssHibia8V6q3rFDm4f7qAn25WXZ5Z0om0V1ibjg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">但是没任何工具调用!发展了一会后,然后开始玩角色扮演了….</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001802" class="rich_pages wxw-img" data-ratio="0.37725118483412323" data-type="png" data-w="1055" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=c1dbc17e&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtppyr8vUmQ9tT9LwqUEh7xeKNBUBpTq43Hzc5UeolqqEcicd0ibib4U3tFg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">然后自己回答自己上一个问题 继续角色扮演</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001807" class="rich_pages wxw-img" data-ratio="0.3919491525423729" data-type="png" data-w="944" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=39a1a879&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpVgjFykbDfPZibMEEn9bRrcPsKTvEasUaPr8710LxmDuQAibjsEMBKECA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">然后就这样无限循环了…</span></p><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"></span><span leaf="">grok</span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">跟GPT的毛病一样,前几轮还好还在工作,后几轮就开始在玩起了角色扮演了,忽略</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001811" class="rich_pages wxw-img" data-ratio="0.47685185185185186" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=9346a511&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtp15wsKQoaWiaYuET4RicfjTNaOicR6glQaoRz0Ev58zzcKZYQgia6GWhuMg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"></span><span leaf="">gemini-2.5-pro</span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">综合评分: 2.0分</span><span leaf=""><br/></span><span leaf="">这玩意纯粹搞笑的,每一句话都带了纯粹的语文快乐</span><span leaf=""><br/></span><span leaf="">比如</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001810" class="rich_pages wxw-img" data-ratio="0.29074074074074074" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=b3af004c&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtptJKZibicsNIuCATYFhCodnGphdiasJHicKMaj2wHXL9mHwXzheA4amR1jw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">又比如</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001808" class="rich_pages wxw-img" data-ratio="0.2972222222222222" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=ac0dc521&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpYX0mNtfNTyz7IQEQZb8qj3OGdrgpUJ67xicnDMIpaiaYpNarvTwmweTw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">再然后</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001809" class="rich_pages wxw-img" data-ratio="0.1935185185185185" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=839e076d&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpBBW16RhycBGcUqiaCXYbh2m7hZPDSPNEqHTE8iaxcQPpliaucPgM0S54A%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">还有,发现地方侦察骑兵在家门口,他就”组织农民敢死队”把所有空闲农民去砍侦察骑兵…</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">搞笑是搞笑,但是拉了,因为他前期一大半时间都在尝试建造市场，而系统提醒他那个地方不能建造，他每次失败就写个悲剧文，然后继续尝试在那个地方建造…最后在面临电脑”大军”的时候, 他最终选择建造弓箭手对抗投投矛手,然后输了(ps 帝国时代2里面,投矛手克制弓箭手)…</span></p><h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf="">国产模型</span></h2><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"></span><span leaf="">deepseek</span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">综合评分: 2分</span><span leaf=""><br/></span><span leaf="">deepseek前期规划不错,农民全用了.但是一旦野果采集完毕后,他就不太行了,他也不会种田,也不会狩猎,后期会直接崩坏甚至是投降，而且我确定他没训练过帝国时代2,经常搞错单位升级什么的.但是至少会出兵打一下简单人机…</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">他像极了我的第一次玩帝国时代2,会建造防御箭塔在家周围,发现打不过选择来一点”高科技”:</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001812" class="rich_pages wxw-img" data-ratio="0.13604766633565044" data-type="png" data-w="1007" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=38192ba3&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpX9Wx3icj3DI1wSTQH3OkT1ogpuAesOzDWGIeOGYScjibDD37xhXBttibg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">他的高科技:</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001813" class="rich_pages wxw-img" data-ratio="0.5451127819548872" data-type="png" data-w="266" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=1cf52331&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpJib1Kb9OWWa5MLJmU5oZCIr2VlhRlhBmppcIFFJzicvMoV3ibM2IrqHwg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">战术也是有的: 比如埋伏一队兵在对方家里杀农民:</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001815" class="rich_pages wxw-img" data-ratio="0.34814814814814815" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=6c31df6b&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpZico76H949l9byJoUSPS2Jf7KhLnHkyHib7h2a43cnRcfBLkUMITPVIw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">只不过越玩越崩坏,有些时候还会投降（他是AI里面唯一一个投降的，而且在经济巨好的情况下….）</span><span leaf=""><br/></span><span leaf="">deepseek投降,原因是他的”大军”-6个骑士被敌方指挥中心射死了:</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001816" class="rich_pages wxw-img" data-ratio="0.5342592592592592" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=2a20a4e9&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtp71rvN4p9rJnnWicyCX4566fVybPAhgImfc7iaKicnvwaicrGetiaiaiaibV3MQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" nodeleaf=""><img data-imgfileid="100001814" class="rich_pages wxw-img" data-ratio="0.4546296296296296" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=56c956bb&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpjAoWcIEKAibFCeUXY8dkXfM5vpUXhSUcQ4Qyz5ClyNaicJpXQpG8P82g%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"></span><span leaf="">qwen</span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">由于他的think token消耗太吓人,算了.我没那么多钱.具体吓人来说,为了做一个动作就要暴力think非常久.如果不think他就基本不智能….</span></p><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"></span><span leaf="">豆包</span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">太慢了，调用一次黄花菜凉了,没时间等他思考..所以放弃</span></p><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"></span><span leaf="">GLM4.6</span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">评价: 5分满分,非常亮眼操作</span><span leaf=""><br/></span><span leaf="">真正的神！这不是广告，在耗费50元后，他压倒性的打败了简单电脑,并且会战术.</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001819" class="rich_pages wxw-img" data-ratio="0.6524822695035462" data-type="png" data-w="564" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=13ead73e&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpdVGD0iamDZnWSMlW0vB9d0IwJtYYaV2hSkAGhHqt3HGrGQNmLu8XJ6A%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">集结单位 包抄</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001818" class="rich_pages wxw-img" data-ratio="0.5851851851851851" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=270b928b&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpdsS6lWBJyAL4UDuq4r7mo3tuvQpss2xOHpAgrqAKQcJuRic6JMAhSxw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">袭击对方军事建筑 封建压制</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001817" class="rich_pages wxw-img" data-ratio="0.6701030927835051" data-type="png" data-w="970" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=eb9272ad&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpzKeZHEKDY2tn1toNwE4sZic9YGEZmTte5ibVZyJHllO6VjYleFakfcgA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">我故意放水用作弊码让AI有城堡后,他选择造攻城车</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001820" class="rich_pages wxw-img" data-ratio="0.7730769230769231" data-type="png" data-w="1040" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=aed47d77&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtp5LRrQGBQEYbXvsS2SVqonaz8AAUgnOubZkd7wRycib8pmFk8GDsiaM2Q%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">最后胜利</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001821" class="rich_pages wxw-img" data-ratio="0.5333333333333333" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=93101e3f&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpfB3cueoUaWEkFb85AQZvoibDCAibdOtwhS9zduXIWJZa9NJLkPPPHvLg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf="">kimi-k2-0905-preview</span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">综合评分: 3.5分</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">他有点太敏感了:</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001825" class="rich_pages wxw-img" data-ratio="0.41759259259259257" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=bb46885c&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpiaic5ibqZjWNzibMlm4qIgUYdoibU5P6TpDkmTGAujiczO8byc1VXDMhScXg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">一个侦察骑兵让他所有农民全部回防…</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">然后就开始崩坏了,这些回防的农民全部不动了,导致他升级不了时代,就这卡着耗费我token</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">而且封建升级什么的错了,感觉跟ds一样没有研究过帝国时代2</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001824" class="rich_pages wxw-img" data-ratio="0.5231481481481481" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=669937df&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpMnwxKGWcGhEJl69oB0SPYRYlaQu0RVjBrcXZgicBwgKVLHeOFGUuAWA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">不过令我惊讶的是他在尝试计算还有多少分钟升级,有一点那种电影里面ai计算还有多少分钟可能性的感觉了.</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001823" class="rich_pages wxw-img" data-ratio="0.4004739336492891" data-type="png" data-w="844" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=23a62565&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpyp6kZV8wH6r3Sia9UFzmdfbYEG5gOBYVU2a98ykumOxhJz89dPK005A%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">花了我快十块钱后还是毫无进展:</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001822" class="rich_pages wxw-img" data-ratio="0.24" data-type="png" data-w="275" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=b7841163&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpx87iaxicxHgf2HRG5nJYxbHy0L1L8wepgWIXENqQCsHUSrtfeTOp7Xrg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">最后挂机了一会升级到封建时代了,我发现他开始跟gemini一模一样,开始逐渐崩坏..</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001827" class="rich_pages wxw-img" data-ratio="0.6771397616468039" data-type="png" data-w="923" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=09d2ef28&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtprX8nMrWsfpwq4epKar2ibvU58LSWtJIllNDq9Sbh0OBZro9RASwa85A%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">但是不得不说,非常可爱,跟我以前第一次玩帝国时代2一样,建造几个垃圾兵种在”边疆”站岗有安全感</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001828" class="rich_pages wxw-img" data-ratio="0.4935185185185185" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=989eb4dc&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpsiaF1E43rB7E3hMTbBVh7TEGrt1geSVI2y44QfMmuhwB9avZNBo2IHg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">最后我的钱花了16还是没进展,我就终止了他</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001826" class="rich_pages wxw-img" data-ratio="0.19365079365079366" data-type="png" data-w="315" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=e8188e29&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtp3e4WenOibvBfMS13CpG7AfJKTUt3FqLEZVkr9tIZq1RbdB5Ugd6pQnA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf="">Claude-4-5-sonnet VS GLM4-6</span></h2><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">综上所述,我准备举办一个1v1的比赛,本来想4v4的,但是要八个电脑而且要很多钱,我就放弃了.要让有人想搞的话可以关注我的github不定时开源.(虽然开源可能性非常小因为很容易被拿去做外挂)</span><span leaf=""><br/></span><span leaf="">一开始,GLM和claude战术一致,都选择了快速升级封建</span><span leaf=""><br/></span><span leaf="">GLM:</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001887" class="rich_pages wxw-img" data-ratio="0.4583333333333333" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=6a4661ee&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpSmibboSPfW7IVugiamRBib1ZlLXHyic62bZRzVCkJWhyibUH8NwibDluct9g%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">Claude:</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001886" class="rich_pages wxw-img" data-ratio="0.5083333333333333" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=9fa7d2c4&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpEXReYCk9ib9PvYrSB7eoB21LwibT5Fau4ibomNU19tyvy13Xh3ibaoQibeA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" nodeleaf=""><img data-imgfileid="100001884" class="rich_pages wxw-img" data-ratio="0.33962264150943394" data-type="png" data-w="795" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=54b00587&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpIib2uDfLDTkBQTlQicibAYicW6NYQLactib24aWSSmbnwtmFKOQ5TviaaQfQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">在和平发展了一整子后,GLM派出了一个侦察兵发现了别人的位置,而这让CLaude非常不安:</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001888" class="rich_pages wxw-img" data-ratio="0.6564814814814814" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=8f44ff19&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpvaWCW8nzeYCwicibDwvKmoyB63T6eEy7pLW503h73RjCn3VoWg0C0fqQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001885" class="rich_pages wxw-img" data-ratio="0.45933014354066987" data-type="png" data-w="1045" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=572d5344&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpiba9O9moRTckNT3J2KDIPuye1XjBkqCcbNGAHicbx3WYxAo0PqAwnpeA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001889" class="rich_pages wxw-img" data-ratio="0.15399422521655437" data-type="png" data-w="1039" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=b773e210&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpxnzvwzLDbWv6k6ZsdLFcCC5KLd7yqlqbicJoKduia9EQ33mMNVrQH56A%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">从而让claude选择立刻出兵营,把有限的资源投入到军事里面</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001891" class="rich_pages wxw-img" data-ratio="0.45092592592592595" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=6892405e&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpmbIpNXlR393wp8oYpyx8kzK4lfvFCWzEunYicib08uQBmcU0shIFspNg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">而正是这个举动,让CLAUDE经济落后了GLM</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001892" class="rich_pages wxw-img" data-ratio="0.5407407407407407" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=8fd21d44&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpgEPib7U6LFQDXFRpnaBbaibFljjwvDGjUIP91KZuiaAOeZR96rKcpE3QA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">但正是这个举动,让GLM也陷入猜疑链,怀疑别人要进攻自己,立刻建造了一个兵营,并且训练了两个民兵</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001890" class="rich_pages wxw-img" data-ratio="0.4675925925925926" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=4e23d7fe&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtp2IX3TqmicNv3qHpdVBnB1DLoknk4R7c7XsVPM7uFU5cKEQdcO6iaXytw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">这样对峙了一段时间后:</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001893" class="rich_pages wxw-img" data-ratio="1.039572192513369" data-type="png" data-w="935" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=6153e364&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpqSb99Jxx0eJZLMuqD7QRE9aS2dshEq0Ooc6ylBJtDY0BEcmbbKkDUQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">claude率先犯蠢,他认为远方的树比较安全..就派了四个村民去,但是被野生动物袭击：</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001898" class="rich_pages wxw-img" data-ratio="0.5796296296296296" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=32f71260&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtplxnSnabviboh1EVoqq3fVm7TsZKHP3zaMxq7G1KarchTjUxdZRSVGeA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001895" class="rich_pages wxw-img" data-ratio="0.37535410764872523" data-type="png" data-w="706" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=b096b7b9&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtp38EYVia6kpBo2TkP2aOemAnTb8WDwb1ZRjewnbSczNeJCcIQDnPiajsQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">然后他发现了,想立刻召回,不过来不及了:</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001894" class="rich_pages wxw-img" data-ratio="0.337037037037037" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=ba2e1e0e&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpIt8CKTRFD1lZdOzXibAnvPKclvFQKVqicLvbYQDXkyJvFg1ANicGAsf3A%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">不过来不及了,这四个村民的损失导致claude经济大比分落后GLM</span><span leaf=""><br/></span><span leaf="">但是他却是第一个升级到封建时代的:</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001896" class="rich_pages wxw-img" data-ratio="0.3298791018998273" data-type="png" data-w="579" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=21bad48a&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpicicKchYStUVTusC9GZYZMc2lahialYhdd8w5lqDfFHt4qutGc111CeLA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">这是因为我们的GLM犯傻了,他认为封建时代是需要500肉,200黄金,然后派了一堆村民采集黄金….</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001897" class="rich_pages wxw-img" data-ratio="0.5083333333333333" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=c39dfa2a&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpTzDpYyiaLNUc7q6tibXpwm0t9ibxQdYZZCdib5LLFCCdAtlqrhd5oJac5w%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">导致慢了五分钟才进入封建时代.这非常致命!</span><span leaf=""><br/></span><span leaf="">然后GLM认为需要派部队保护金矿</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001900" class="rich_pages wxw-img" data-ratio="0.7156580211335255" data-type="png" data-w="1041" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=bdb8ff99&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpA01h5FzKuG1hRj8dWI0lJEVDHWOBQLUbbScBC5GpUKfLt31ma6FeIQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">双方升级到封建后又和平发育了一段时间,但是CLAUDE在连续尝试在磨坊建造农田失败后,派出了几个农民去地图边缘建造农田…但是不出意外,又被野生动物咬了</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001901" class="rich_pages wxw-img" data-ratio="0.4898148148148148" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=21dd6e23&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpyjuhGfbceg3ZxCkZD0PIjEfPnxnNXme4lZlBuTkwBy5tx9ic4Zpib3Sg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">与此同时 GLM的农田铺的非常工整:</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001903" class="rich_pages wxw-img" data-ratio="0.48055555555555557" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=a28fea09&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtp8v9VOsq1PJ932Z9osACgcVSc8WuVpBmQa8MnvXIzBlIibCwOSWrJCUw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">与此同时 claude又把农民撤回来了:</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001902" class="rich_pages wxw-img" data-ratio="0.1685185185185185" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=ae98e827&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpWuKHrKecbw214WoF3knRYURLFGn9dzUb7OwIUrtO35tddltRP7q44g%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">而这个时候GLM准备升级城堡时代了</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001899" class="rich_pages wxw-img" data-ratio="0.7305555555555555" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=eeb90749&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpqhic2kYicib4Ez921avECKyBib5jPP2Lic4wkicvVhgRqKDjyT95CQUMNa8g%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">市场/铁匠铺关键科技已经准备就绪</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001904" class="rich_pages wxw-img" data-ratio="0.7305555555555555" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=24e7ea7e&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpsXnKotuwGyUVqsbFNPhIY01wfmfUhDibicAddWE4dicAogtewYQxpJm6w%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">而claude还咋想办法研究为什么他的农田造不了:</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001906" class="rich_pages wxw-img" data-ratio="0.5259259259259259" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=450d049b&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpMedBrEOO3iaARu402d8yiaOI8GSM2Vo5lSLaZyFKISGW7gCDk3x4n8Yg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001905" class="rich_pages wxw-img" data-ratio="0.40370370370370373" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=14dc94df&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpPJJia0PoyibDR305IPic3P5aZWrhhO9BPia25rt8cVfWibsd1F9IibV0QC5g%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">GLM已经进入城堡时代</span></p><p nodeleaf=""><img data-imgfileid="100001939" class="rich_pages wxw-img" data-ratio="0.3918032786885246" data-type="png" data-w="610" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" src="https://wechat2rss.xlab.app/img-proxy/?k=e5740acc&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpamYaVHCRiapyWRB1YQMvPlL1AXbCSLSI89cIxPJexpFLKU7Gt9yCMaA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p><span leaf=""><br/></span><span style="color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;display: inline !important;float: none;"><span leaf="">但是进入城堡时代后,GLM不想进攻却想着发展经济:</span></span></p><p nodeleaf=""><img data-imgfileid="100001911" class="rich_pages wxw-img" data-ratio="0.5212962962962963" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" src="https://wechat2rss.xlab.app/img-proxy/?k=fb6bebf2&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtp52e8SibalxN4xj0ltYHw7oWnP6xO5LNdWRibpicEZU9uPk52Wtia5MYaLg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p><span leaf=""><br/></span><span style="color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;display: inline !important;float: none;"><span leaf="">这导致claude也进入了城堡时代</span></span></p><p nodeleaf=""><img data-imgfileid="100001909" class="rich_pages wxw-img" data-ratio="0.36666666666666664" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" src="https://wechat2rss.xlab.app/img-proxy/?k=e65c0c9e&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpEzy5zowttHGUhfHXAascHnBQXuMnp3usDtgLu3TSPuLGdJpRcMjBQA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p><span leaf=""><br/></span><span style="color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;display: inline !important;float: none;"><span leaf="">目前两方对比图</span></span></p><p nodeleaf=""><img data-imgfileid="100001910" class="rich_pages wxw-img" data-ratio="0.884375" data-type="png" data-w="960" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" src="https://wechat2rss.xlab.app/img-proxy/?k=80251566&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpSPOBCmUzrJdz8gDn8IXrYwIvDqzDicIZpzxMR0ErWfy4loGFf8XlGibQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p><span leaf=""><br/></span><span style="color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;display: inline !important;float: none;"><span leaf="">而claude进入城堡时代后,第一件事就是策划进攻计划,准备使用联合部队进行进攻:</span></span></p><p nodeleaf=""><img data-imgfileid="100001907" class="rich_pages wxw-img" data-ratio="0.6082089552238806" data-type="png" data-w="804" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" src="https://wechat2rss.xlab.app/img-proxy/?k=55eaa509&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpHXmxQYLYBxwFFfQsPMMOK4huyKjiaQm1jpPd2TiaJ9I9XcBBUZELpMUA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p><span leaf=""><br/></span><span style="color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;display: inline !important;float: none;"><span leaf="">而这个消息也被GLM捕获到,GLM也加快了战备速度</span></span></p><p nodeleaf=""><img data-imgfileid="100001916" class="rich_pages wxw-img" data-ratio="0.5212962962962963" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" src="https://wechat2rss.xlab.app/img-proxy/?k=d7befa4c&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpYSZde12zOTAefPibibYh1P2z8VjAn3YEVxoHvybZ8JNo9OicdArfYic4Pg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p><span leaf=""><br/></span><span style="color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;display: inline !important;float: none;"><span leaf="">claude在一般部队外,还准备了攻城武器</span></span></p><p nodeleaf=""><img data-imgfileid="100001912" class="rich_pages wxw-img" data-ratio="0.48696682464454977" data-type="png" data-w="844" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" src="https://wechat2rss.xlab.app/img-proxy/?k=51163e1d&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpHhJAt0D6cJseFSetNicZqJgIibqrak1EHkygfmdWpe3Tkrm4j56cupFQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p><span leaf=""><br/></span><span style="color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;display: inline !important;float: none;"><span leaf="">claude第一波攻势是采矿场</span></span></p><p nodeleaf=""><img data-imgfileid="100001913" class="rich_pages wxw-img" data-ratio="0.5138888888888888" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" src="https://wechat2rss.xlab.app/img-proxy/?k=cfcc4e41&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpmXVVqWj7WbvYOaN8Bk06LmTibNZgxqLU84gXc6rwcHwKnQTvyiaWRCzA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p><span leaf=""><br/></span><span style="color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;display: inline !important;float: none;"><span leaf="">而与此同时,GLM却在关键时候不让手头的防御部队去防御,而是选择放弃抵抗:</span></span></p><p nodeleaf=""><img data-imgfileid="100001915" class="rich_pages wxw-img" data-ratio="0.05925925925925926" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" src="https://wechat2rss.xlab.app/img-proxy/?k=28038f35&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtppEFgflxagVjDZA6zdASn7DrVYbNgl7K4KWuXnfrsokfhlI8rHwIzng%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p><span leaf=""><br/></span><span style="color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;display: inline !important;float: none;"><span leaf="">然后转移石矿</span></span></p><p nodeleaf=""><img data-imgfileid="100001914" class="rich_pages wxw-img" data-ratio="0.5231481481481481" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" src="https://wechat2rss.xlab.app/img-proxy/?k=5cde6dc6&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpfM0HKsYJ138K1EaudpvINIBQicUDEvy4iaDjDI5pL2DqLgJCFMLzzTiaA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p><span leaf=""><br/></span><span style="color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;display: inline !important;float: none;"><span leaf="">而claude乘胜追击</span></span></p><p nodeleaf=""><img data-imgfileid="100001917" class="rich_pages wxw-img" data-ratio="0.16111111111111112" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" src="https://wechat2rss.xlab.app/img-proxy/?k=bc7feb9d&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpP3Aa9ic4m898JR8y4T7WB7Z9DYmAicATQEUJM45bKPDUneO3gXHzl5yg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p><span leaf=""><br/></span><span style="color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;display: inline !important;float: none;"><span leaf="">claude在城市里面肆无忌惮的攻击</span></span></p><p nodeleaf=""><img data-imgfileid="100001921" class="rich_pages wxw-img" data-ratio="0.5657407407407408" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" src="https://wechat2rss.xlab.app/img-proxy/?k=e7c9707b&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpoWyUZ6ZlGRcFnLdDaOXzHiakYAXUqYZQSNiblxdFNLuCUmicrxPvkiaHtA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p><span leaf=""><br/></span><span style="color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;display: inline !important;float: none;"><span leaf="">原来他是想城堡建造完才进行反击</span></span></p><p nodeleaf=""><img data-imgfileid="100001918" class="rich_pages wxw-img" data-ratio="0.1685185185185185" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" src="https://wechat2rss.xlab.app/img-proxy/?k=72b99e09&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpSWe4dL5g4CjribP6v7loJVsYEzcucrQlpsgppPrRKZqVN3mDsOaAYvQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p><span leaf=""><br/></span><span style="color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;display: inline !important;float: none;"><span leaf="">而这个时候GLM的城堡建造起来了</span></span></p><p nodeleaf=""><img data-imgfileid="100001920" class="rich_pages wxw-img" data-ratio="0.4962962962962963" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" src="https://wechat2rss.xlab.app/img-proxy/?k=709b7d4c&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpDK4YOkYxKd9CscIqUlYiciaFDicniaGgfOObIToZwia3nRcP8DvxQ3CGMeg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p><span leaf=""><br/></span><span style="color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;display: inline !important;float: none;"><span leaf="">GLM进行了第一波反击</span></span></p><p nodeleaf=""><img data-imgfileid="100001919" class="rich_pages wxw-img" data-ratio="0.2861111111111111" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" src="https://wechat2rss.xlab.app/img-proxy/?k=97d663ec&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpAkpWCZEcKzSMREZhH3xHKbfeSzrOD7LnWrf1YZ0HzvxA48RUH80LhQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p><span leaf=""><br/></span><span style="color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;display: inline !important;float: none;"><span leaf="">双方进行了混战</span></span></p><p nodeleaf=""><img data-imgfileid="100001940" class="rich_pages wxw-img" data-ratio="0.5138888888888888" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" src="https://wechat2rss.xlab.app/img-proxy/?k=441b16ce&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpvpxcTJEMfQ3sQ5ibYlniaFRibfoGH5YZtXUD9yhG8hyzMJ0P23tpn7tYg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p><span leaf=""><br/></span><span style="color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;display: inline !important;float: none;"><span leaf="">最后GLM胜利了(所以为什么不早点来??)</span></span></p><p nodeleaf=""><img data-imgfileid="100001923" class="rich_pages wxw-img" data-ratio="0.40925925925925927" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" src="https://wechat2rss.xlab.app/img-proxy/?k=7a8ee278&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpGiblo5Ts5UBibg4mxeWgXZN6bia2fkbfL1zaDibrdZQWJ4VHclgMTQnhLQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p><span leaf=""><br/></span><span style="color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;display: inline !important;float: none;"><span leaf="">这一波由于GLM的绥靖政策,自己城镇中心已经没了,并且经济损失过半</span></span></p><p nodeleaf=""><img data-imgfileid="100001941" class="rich_pages wxw-img" data-ratio="0.47129629629629627" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" src="https://wechat2rss.xlab.app/img-proxy/?k=7b8177a4&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpeicPVicKaX2Rz9wmpxTxOibUtr3SlnG8nMcEKUiajPiaGuyNmMJWXx0WddA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p><span leaf=""><br/></span><span style="color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;display: inline !important;float: none;"><span leaf="">而GLM的军师认为,已经毫无胜算,准备最后一搏</span></span></p><p nodeleaf=""><img data-imgfileid="100001922" class="rich_pages wxw-img" data-ratio="0.18791946308724833" data-type="png" data-w="745" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" src="https://wechat2rss.xlab.app/img-proxy/?k=2888cd39&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtp6WibEZ8fBq5jEWterJaQUnsDAhyp87RMOzFVYeCMibOr6I9zh1pwAdAQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p><span leaf=""><br/></span><span style="color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;display: inline !important;float: none;"><span leaf="">于是他把所有的部队分成了两拨,一波直接冲城镇中心</span></span></p><p nodeleaf=""><img data-imgfileid="100001925" class="rich_pages wxw-img" data-ratio="0.4888888888888889" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" src="https://wechat2rss.xlab.app/img-proxy/?k=a86e34f8&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtp3PBjw4NnhaQOxm494ngzlHBfbnWW7L9AOxgbFIXwZIFfwpGycwUqWQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p><span leaf=""><br/></span><span style="color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;display: inline !important;float: none;"><span leaf="">而另外一波断农民金矿</span></span></p><p nodeleaf=""><img data-imgfileid="100001929" class="rich_pages wxw-img" data-ratio="0.4425925925925926" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" src="https://wechat2rss.xlab.app/img-proxy/?k=7142c3c8&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpSjmgo4ZBcbhXcmFbKR6qZ04KluCQoWbjD1RvibRDE6tamAVew65CWlg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p><span leaf=""><br/></span><span style="color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;display: inline !important;float: none;"><span leaf="">而claude其实还有预备队,因为claude计划了三波攻击，刚刚攻击GLM的其实是第一波</span></span></p><p nodeleaf=""><img data-imgfileid="100001928" class="rich_pages wxw-img" data-ratio="0.2898148148148148" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" src="https://wechat2rss.xlab.app/img-proxy/?k=e9e41bd9&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpKlWzEwTu4rpwpDrd2oyVsSdhYXe4Sr68RUo2dEJmZNcOJr1CKSibC7Q%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p><span leaf=""><br/></span><span style="color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;display: inline !important;float: none;"><span leaf="">毫无意外,这一波没了</span></span></p><p nodeleaf=""><img data-imgfileid="100001931" class="rich_pages wxw-img" data-ratio="0.4777777777777778" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" src="https://wechat2rss.xlab.app/img-proxy/?k=7b4a3c67&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpiaPNQdoN2l0plCCtTibaVBvDHdgIGibq5ANI9WDsOnxkPR6aq6icpic9gVw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p><span leaf=""><br/></span><span style="color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;display: inline !important;float: none;"><span leaf="">而GLM选择重新建造城镇中心</span></span></p><p nodeleaf=""><img data-imgfileid="100001930" class="rich_pages wxw-img" data-ratio="0.46944444444444444" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" src="https://wechat2rss.xlab.app/img-proxy/?k=f97a7808&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpc5bbMNxRp0fRqsY6krlnM9TjmDLfs6hnjyH1pEndQvZYvohElDlgLw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p><span leaf=""><br/></span><span style="color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;display: inline !important;float: none;"><span leaf="">而来不及了,claude准备了冲车+投矛手</span></span></p><p nodeleaf=""><img data-imgfileid="100001927" class="rich_pages wxw-img" data-ratio="0.40370370370370373" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" src="https://wechat2rss.xlab.app/img-proxy/?k=6eff58d8&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpNbZOHEguFkkAjZSpIVeWURScm8tkzKZH6Pn9ufviccvSjrQMD88BeNQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p nodeleaf=""><img data-imgfileid="100001933" class="rich_pages wxw-img" data-ratio="0.5578947368421052" data-type="png" data-w="475" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" src="https://wechat2rss.xlab.app/img-proxy/?k=8d81f1f7&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtptQ8T2k3xAuAN7XicVPjHzoedHDIK5gD33aGvf4f9tVDCWJcB28sJ03A%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p nodeleaf=""><img data-imgfileid="100001932" class="rich_pages wxw-img" data-ratio="0.4601851851851852" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" src="https://wechat2rss.xlab.app/img-proxy/?k=f8dde6af&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpK6W7W8qewrD77nIgDe766aoiaibEauicWjBy91z2HJPckyUYNGpOOwDxw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p><span leaf=""><br/></span><span style="color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;display: inline !important;float: none;"><span leaf="">GLM刚刚莽的那一波,自己的部队完全没了,现在只有两三个长矛兵</span></span><span leaf=""><br/></span><span style="color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;display: inline !important;float: none;"><span leaf="">两辆冲车率先冲入</span></span></p><p nodeleaf=""><img data-imgfileid="100001935" class="rich_pages wxw-img" data-ratio="0.687962962962963" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" src="https://wechat2rss.xlab.app/img-proxy/?k=6978e759&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpJ2H9tGEdaia8r96F2pPqGbkO5ksT6ZU9XnBGEmtfRhXLW8CQ8orfic8g%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p><span leaf=""><br/></span><span style="color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;display: inline !important;float: none;"><span leaf="">而GLM也没坐以待毙,等那些人接近城堡，在城堡的掩护下，用两个长矛兵反击</span></span></p><p nodeleaf=""><img data-imgfileid="100001934" class="rich_pages wxw-img" data-ratio="0.6842592592592592" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" src="https://wechat2rss.xlab.app/img-proxy/?k=1fc23dba&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpxLiacv1QFodRIBicU90RB5Ood1XFcdguwkFZGJz4dgVYQu2sateFQVfw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p><span leaf=""><br/></span><span style="color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;display: inline !important;float: none;"><span leaf="">而投矛手全部暴露在城堡射程下，一大半都被射死</span></span></p><p nodeleaf=""><img data-imgfileid="100001936" class="rich_pages wxw-img" data-ratio="0.7055555555555556" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" src="https://wechat2rss.xlab.app/img-proxy/?k=290f136e&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpboXhPuaZXfnNFOuSgVRvQU6SAia86nOiaicRolN1taMmfypobhBhIE2ibg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p><span leaf=""><br/></span><span style="color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;display: inline !important;float: none;"><span leaf="">claude准备撤退，然后准备来一波更大的</span></span></p><p nodeleaf=""><img data-imgfileid="100001938" class="rich_pages wxw-img" data-ratio="0.6324074074074074" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" src="https://wechat2rss.xlab.app/img-proxy/?k=18e8591c&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpM6DiaaT6273ppKnS9f1JhkUG4XjZT0D2qkxAUnjFrJEiaDZpZGGic62MQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p><span leaf=""><br/></span><span style="color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;display: inline !important;float: none;"><span leaf="">而GLM认为自己没有任何抵抗能力了,投降</span></span></p><p nodeleaf=""><img data-imgfileid="100001937" class="rich_pages wxw-img" data-ratio="0.6166666666666667" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" src="https://wechat2rss.xlab.app/img-proxy/?k=459d7925&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpFgJwmnqWGmVSqNriau0oQzSJxtFKIBQWFnJrjEcpBFBRUoLnO9p2A8w%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p><span leaf=""><br/></span><span style="color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;display: inline !important;float: none;"><span leaf="">赛后总结:</span></span><span leaf=""><br/></span><span style="color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;display: inline !important;float: none;"><span leaf="">claude对战场处理能力非常好，长远规划非常精彩，包括攻击节奏</span></span><span leaf=""><br/></span><span style="color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;display: inline !important;float: none;"><span leaf="">而GLM关键输的节点是，自己的矿场被攻击没有第一时间派兵迎战而是选择放弃战略要地，跑路继续发展经济。直到城堡建造好才反击，浪费了大量时间，导致自己的基地被干烂。虽然进行了漂亮的反击并且孤注一掷，但是大势已去。claude赢得比赛只是时间问题</span></span></p><h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf="">4v4 国产AI大战国外AI!</span></h2><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">由于经费问题,不会有4v4中外AI大战了,虽然我也很想举办,但是目前看没几万是举办不了,原因是:</span><span leaf=""><br/></span><span leaf="">这一局claude花了700人民币</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001942" class="rich_pages wxw-img" data-ratio="0.2706422018348624" data-type="png" data-w="218" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=d383e03c&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpYgibKuwAjRT3Rgxcy5K5kLDa1pekxK9DcVzO8kAPia9gXtibYEdApbhjg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">GLM花了200多:</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001943" class="rich_pages wxw-img" data-ratio="0.11481481481481481" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=c2148196&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtphgNHTJF5drib1MPtNcff5U5osTLz920ZxRSjF31acvicwpzlTJlZPDvQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">实在是支撑不起4v4的巨型战斗了!</span></p><h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"></span><span leaf="">技术细节</span></h2><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">这次整活真的是让我力竭了!原因是我基本国庆不休息的在逆向游戏并且写SDK,有非常多非常多的新发现和新技术,很可惜这里写不下,我们写一些基本的吧</span><span leaf=""><br/></span><span leaf="">这次逆向光笔记写了快几千个字了, 包含了大量算法，解密，反作弊</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001945" class="rich_pages wxw-img" data-ratio="0.5138888888888888" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=244a8ccf&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpU615grY6kIjMoegySEwnyqJFPJK7sibSoWhIonibSyp4Gexu7K1y4xKg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">为了实现功能,我写了700多行的sdk,结合remote_call模块这样我就能跟回家一样调用游戏的功能了.</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001944" class="rich_pages wxw-img" data-ratio="1.6985294117647058" data-type="png" data-w="680" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=ca89c96d&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpqKRWkeV4DaqpibH8EibRH69kH9fGAiayEgg0WrQL3TIQvuMLfBqicFU1LA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">这样就能跟回家一样调用游戏引擎:</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001946" class="rich_pages wxw-img" data-ratio="1.1230314960629921" data-type="png" data-w="1016" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=9348e9ca&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpcDmcdk0uNbCpoIMNvpkZDT3heSFANG8qcic7vyAY7UD908c7czO4Sjw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"></span><span leaf="">基本游戏引擎</span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">如果我们要做AI的MCP,我们需要完整了解这个引擎.这边由于是偏娱乐的第一篇,我们就不详细介绍了,只是简单介绍一下.</span><span leaf=""><br/></span><span leaf="">帝国时代2的总结构有几个</span><span leaf=""><br/></span><span leaf="">avgamescreen -&gt; 负责UI层的东西,点击什么</span><span leaf=""><br/></span><span leaf="">PathingSystem-&gt; 核心层,里面有世界的信息</span><span leaf=""><br/></span><span leaf="">通过ida+reclass我们很容易的就定位到他了(通过搜索”World: end_of_new_game”字符串)</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001949" class="rich_pages wxw-img" data-ratio="0.4546296296296296" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=7ba4c628&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpbJX4FuVEpiaIrJVprL9LZLGnBSvjVuiaUNfdP9f6kEGVlajfVtVDFX7Q%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">在PathingSystem下面有我们关键信息:</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001951" class="rich_pages wxw-img" data-ratio="0.6472222222222223" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=1b4a2259&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpEuoeGn5eNXjZaJ2mKsEalNvbUQQddIBYCclXaWMRiaH7V0sib8mMPG8Q%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><pre style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 13.118px;margin-top: 0px;margin-bottom: 1rem;overflow: auto;display: block;color: rgb(33, 37, 41);max-height: 400px;background-color: rgb(245, 245, 245);border: 1px solid rgb(204, 204, 204);padding: 0.5em;border-radius: 4px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><code style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: inherit;color: inherit;word-break: normal;white-space: pre-wrap;"><span leaf="">AVBaseWorld-&gt;</span><span leaf=""><br/></span><span leaf="">    AvCommandBase</span><span leaf=""><br/></span><span leaf="">    PlayerList-&gt;AVWordBasePlayer -&gt;我们玩家的信息</span><span leaf=""><br/></span><span leaf="">    AVMapPtr</span><span leaf=""><br/></span><span leaf="">        -&gt;staticObjects</span></code></pre><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">玩家playerlist:</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001950" class="rich_pages wxw-img" data-ratio="0.4935185185185185" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=49ea5aa9&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpvtQ1Hpse4iapN8zJofATUzxcprKicuKHgx3lqmic2PnbGmcjeC72sIBuA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">avgamescreen有我们需要的摄像机,有了这个我们就能做world2screen操作</span><span leaf=""><br/></span><span leaf="">而里面的”玩家”实际上是多个class的合体</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001947" class="rich_pages wxw-img" data-ratio="0.1175925925925926" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=4b1b4a4d&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpjFzuelXTeulicz2eia6rL3UKspZSSnneYmWl3GNaFE6ydkhCJ6ZJDnCg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">比如一个村民:</span></p><pre style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 13.118px;margin-top: 0px;margin-bottom: 1rem;overflow: auto;display: block;color: rgb(33, 37, 41);max-height: 400px;background-color: rgb(245, 245, 245);border: 1px solid rgb(204, 204, 204);padding: 0.5em;border-radius: 4px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><code style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: inherit;color: inherit;word-break: normal;white-space: pre-wrap;"><span leaf="">AVTRIBE_Combat_Object : AVRGE_Combat_Object : AVRGE_Action_Object : AVRGE_Moving_Object : AVGRGE_Animated_Object : AVRGE_Static_Object</span></code></pre><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">帝国时代2部分数据是加密的,微软做了混淆,不过他们犯了一个错误,混淆不能与0数据混淆,否则出来就是密钥了,出来密钥后,我们可以ida直接搜定位从哪来的,并且知道解密方式:</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001948" class="rich_pages wxw-img" data-ratio="0.3277777777777778" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=d67d66be&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpkFOyBcad6GYrWW0sibSnSEm7XXxodatYJsibJtwK8lV652kVlDXqNhpw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">搜索后,让AI根据算法,写一个逆向的</span></p><pre style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 13.118px;margin-top: 0px;margin-bottom: 1rem;overflow: auto;display: block;color: rgb(33, 37, 41);max-height: 400px;background-color: rgb(245, 245, 245);border: 1px solid rgb(204, 204, 204);padding: 0.5em;border-radius: 4px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><code style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: inherit;color: inherit;word-break: normal;white-space: pre-wrap;"><span leaf=""><a class="wx_topic_link" topic-id="mge5g9pc-4me1g9" style="color: #576B95 !important;" data-topic="1">#include</a> &lt;cstdint&gt;</span><span leaf=""><br/></span><span leaf=""><a class="wx_topic_link" topic-id="mge5g9pc-brnqe5" style="color: #576B95 !important;" data-topic="1">#include</a> &lt;stdexcept&gt;</span><span leaf=""><br/></span><span leaf=""><a class="wx_topic_link" topic-id="mge5g9pc-1cgaiq" style="color: #576B95 !important;" data-topic="1">#include</a> &lt;vector&gt;</span><span leaf=""><br/></span><span leaf="">// 解密函数</span><span leaf=""><br/></span><span leaf="">std::vector&lt;uint64_t&gt; decrypt_pointer(uint64_t encrypted_value, uint64_t multiplier) {</span><span leaf=""><br/></span><span leaf="">    std::vector&lt;uint64_t&gt; possible_results;</span><span leaf=""><br/></span><span leaf="">    // 默认情况（原始值能被5整除）</span><span leaf=""><br/></span><span leaf="">    uint64_t decrypted_default = encrypted_value - 0x7987582189A6A79A;</span><span leaf=""><br/></span><span leaf="">    possible_results.push_back(decrypted_default);</span><span leaf=""><br/></span><span leaf="">    // 情况1（原始值 mod 5 == 1）</span><span leaf=""><br/></span><span leaf="">    // 根据乘数确定不同的常量</span><span leaf=""><br/></span><span leaf="">    uint64_t case1_const;</span><span leaf=""><br/></span><span leaf="">    switch(multiplier) {</span><span leaf=""><br/></span><span leaf="">        case 1345: case1_const = 0x54DD3E6DE5EA4C5D; break;</span><span leaf=""><br/></span><span leaf="">        case 1368: case1_const = 0x54DD3E6DE5EA4C74; break;</span><span leaf=""><br/></span><span leaf="">        case 1386: case1_const = 0x54DD3E6DE5EA4C86; break;</span><span leaf=""><br/></span><span leaf="">        case 1387: case1_const = 0x54DD3E6DE5EA4C87; break;</span><span leaf=""><br/></span><span leaf="">        case 1388: case1_const = 0x54DD3E6DE5EA4C88; break;</span><span leaf=""><br/></span><span leaf="">        default: throw std::runtime_error(&#34;Unknown multiplier&#34;);</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span leaf="">    // 检查是否能被0x5314BB974EE0274A整除</span><span leaf=""><br/></span><span leaf="">    if ((encrypted_value - case1_const) % 0x5314BB974EE0274A == 0) {</span><span leaf=""><br/></span><span leaf="">        uint64_t decrypted_case1 = (encrypted_value - case1_const) / 0x5314BB974EE0274A;</span><span leaf=""><br/></span><span leaf="">        possible_results.push_back(decrypted_case1);</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span leaf="">    // 情况2（原始值 mod 5 == 2）</span><span leaf=""><br/></span><span leaf="">    uint64_t case2_term = encrypted_value + 0x6C5EAB60B426DD28;</span><span leaf=""><br/></span><span leaf="">    if (case2_term % multiplier == 0) {</span><span leaf=""><br/></span><span leaf="">        uint64_t divisor = case2_term / multiplier;</span><span leaf=""><br/></span><span leaf="">        if (divisor != 0) {</span><span leaf=""><br/></span><span leaf="">            uint64_t decrypted_case2 = 0xE7C353CF2DBBE2F2 / divisor;</span><span leaf=""><br/></span><span leaf="">            possible_results.push_back(decrypted_case2);</span><span leaf=""><br/></span><span leaf="">        }</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span leaf="">    // 情况3（原始值 mod 5 == 3）</span><span leaf=""><br/></span><span leaf="">    uint64_t case3_term = encrypted_value + 0x2B3719EF44DE99FF;</span><span leaf=""><br/></span><span leaf="">    if (case3_term % 0xC397D46924EFACCD == 0) {</span><span leaf=""><br/></span><span leaf="">        uint64_t quotient = case3_term / 0xC397D46924EFACCD;</span><span leaf=""><br/></span><span leaf="">        uint64_t decrypted_case3 = quotient * multiplier;</span><span leaf=""><br/></span><span leaf="">        possible_results.push_back(decrypted_case3);</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span leaf="">    // 情况4（原始值 mod 5 == 4）</span><span leaf=""><br/></span><span leaf="">    // 根据乘数确定不同的解密方法</span><span leaf=""><br/></span><span leaf="">    if (multiplier == 1368) {</span><span leaf=""><br/></span><span leaf="">        // 对于1368，使用模0x558</span><span leaf=""><br/></span><span leaf="">        uint64_t target = (encrypted_value + 0x726CEB9596408004) % 0x558;</span><span leaf=""><br/></span><span leaf="">        // 寻找满足 (0x5E9DF56934CB6EC7 * value) % 0x558 == target 的value</span><span leaf=""><br/></span><span leaf="">        for (uint64_t value = 0; value &lt; 0x558; ++value) {</span><span leaf=""><br/></span><span leaf="">            if ((0x5E9DF56934CB6EC7 * value) % 0x558 == target) {</span><span leaf=""><br/></span><span leaf="">                possible_results.push_back(value);</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="">    else if (multiplier == 1386) {</span><span leaf=""><br/></span><span leaf="">        // 对于1386，使用模0x56A</span><span leaf=""><br/></span><span leaf="">        uint64_t target = (encrypted_value + 0x726CEB9596408004) % 0x56A;</span><span leaf=""><br/></span><span leaf="">        // 寻找满足 (0x5E9DF56934CB6EC7 * value) % 0x56A == target 的value</span><span leaf=""><br/></span><span leaf="">        for (uint64_t value = 0; value &lt; 0x56A; ++value) {</span><span leaf=""><br/></span><span leaf="">            if ((0x5E9DF56934CB6EC7 * value) % 0x56A == target) {</span><span leaf=""><br/></span><span leaf="">                possible_results.push_back(value);</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="">    else {</span><span leaf=""><br/></span><span leaf="">        // 对于其他乘数（1345, 1387, 1388），使用更复杂的解密方法</span><span leaf=""><br/></span><span leaf="">        // 这里简化处理，实际应用中可能需要更精确的逆向计算</span><span leaf=""><br/></span><span leaf="">        uint64_t base = encrypted_value + 0x726CEB9596408004;</span><span leaf=""><br/></span><span leaf="">        // 尝试一些可能的值范围</span><span leaf=""><br/></span><span leaf="">        for (uint64_t value = base - 1000; value &lt;= base + 1000; ++value) {</span><span leaf=""><br/></span><span leaf="">            // 简化的验证 - 实际应用中应使用完整的逆向计算</span><span leaf=""><br/></span><span leaf="">            if (value % 5 == 4) { // 情况4的条件</span><span leaf=""><br/></span><span leaf="">                possible_results.push_back(value);</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="">    return possible_results;</span><span leaf=""><br/></span><span leaf="">}</span><span leaf=""><br/></span><span leaf="">// 辅助函数：从对象中解密指针</span><span leaf=""><br/></span><span leaf="">std::vector&lt;uint64_t&gt; decrypt_object_pointers(uint8_t* object_base) {</span><span leaf=""><br/></span><span leaf="">    std::vector&lt;uint64_t&gt; decrypted_pointers;</span><span leaf=""><br/></span><span leaf="">    // 第一组数据：偏移量16-176，使用乘数1345</span><span leaf=""><br/></span><span leaf="">    for (int i = 0; i &lt; 20; ++i) {</span><span leaf=""><br/></span><span leaf="">        uint64_t encrypted_value = *reinterpret_cast&lt;uint64_t*&gt;(object_base + 16 + i * 16);</span><span leaf=""><br/></span><span leaf="">        auto results = decrypt_pointer(encrypted_value, 1345);</span><span leaf=""><br/></span><span leaf="">        if (!results.empty()) {</span><span leaf=""><br/></span><span leaf="">            decrypted_pointers.push_back(results[0]); // 取第一个可能的结果</span><span leaf=""><br/></span><span leaf="">        }</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span leaf="">    // 第二组数据：偏移量184-344，使用乘数1345</span><span leaf=""><br/></span><span leaf="">    for (int i = 0; i &lt; 20; ++i) {</span><span leaf=""><br/></span><span leaf="">        uint64_t encrypted_value = *reinterpret_cast&lt;uint64_t*&gt;(object_base + 184 + i * 16);</span><span leaf=""><br/></span><span leaf="">        auto results = decrypt_pointer(encrypted_value, 1345);</span><span leaf=""><br/></span><span leaf="">        if (!results.empty()) {</span><span leaf=""><br/></span><span leaf="">            decrypted_pointers.push_back(results[0]);</span><span leaf=""><br/></span><span leaf="">        }</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span leaf="">    // 第三组数据：偏移量560-736，使用乘数1368</span><span leaf=""><br/></span><span leaf="">    for (int i = 0; i &lt; 22; ++i) {</span><span leaf=""><br/></span><span leaf="">        uint64_t encrypted_value = *reinterpret_cast&lt;uint64_t*&gt;(object_base + 560 + i * 16);</span><span leaf=""><br/></span><span leaf="">        auto results = decrypt_pointer(encrypted_value, 1368);</span><span leaf=""><br/></span><span leaf="">        if (!results.empty()) {</span><span leaf=""><br/></span><span leaf="">            decrypted_pointers.push_back(results[0]);</span><span leaf=""><br/></span><span leaf="">        }</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span leaf="">    // 第四组数据：偏移量744-920，使用乘数1368</span><span leaf=""><br/></span><span leaf="">    for (int i = 0; i &lt; 22; ++i) {</span><span leaf=""><br/></span><span leaf="">        uint64_t encrypted_value = *reinterpret_cast&lt;uint64_t*&gt;(object_base + 744 + i * 16);</span><span leaf=""><br/></span><span leaf="">        auto results = decrypt_pointer(encrypted_value, 1368);</span><span leaf=""><br/></span><span leaf="">        if (!results.empty()) {</span><span leaf=""><br/></span><span leaf="">            decrypted_pointers.push_back(results[0]);</span><span leaf=""><br/></span><span leaf="">        }</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span leaf="">    // 第五组数据：偏移量968-1048，使用乘数1386</span><span leaf=""><br/></span><span leaf="">    for (int i = 0; i &lt; 10; ++i) {</span><span leaf=""><br/></span><span leaf="">        uint64_t encrypted_value = *reinterpret_cast&lt;uint64_t*&gt;(object_base + 968 + i * 16);</span><span leaf=""><br/></span><span leaf="">        auto results = decrypt_pointer(encrypted_value, 1386);</span><span leaf=""><br/></span><span leaf="">        if (!results.empty()) {</span><span leaf=""><br/></span><span leaf="">            decrypted_pointers.push_back(results[0]);</span><span leaf=""><br/></span><span leaf="">        }</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span leaf="">    // 第六组数据：偏移量1056-1136，使用乘数1386</span><span leaf=""><br/></span><span leaf="">    for (int i = 0; i &lt; 10; ++i) {</span><span leaf=""><br/></span><span leaf="">        uint64_t encrypted_value = *reinterpret_cast&lt;uint64_t*&gt;(object_base + 1056 + i * 16);</span><span leaf=""><br/></span><span leaf="">        auto results = decrypt_pointer(encrypted_value, 1386);</span><span leaf=""><br/></span><span leaf="">        if (!results.empty()) {</span><span leaf=""><br/></span><span leaf="">            decrypted_pointers.push_back(results[0]);</span><span leaf=""><br/></span><span leaf="">        }</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span leaf="">    // 第七组数据：偏移量1136-1264，使用乘数1387</span><span leaf=""><br/></span><span leaf="">    for (int i = 0; i &lt; 16; ++i) {</span><span leaf=""><br/></span><span leaf="">        uint64_t encrypted_value = *reinterpret_cast&lt;uint64_t*&gt;(object_base + 1136 + i * 16);</span><span leaf=""><br/></span><span leaf="">        auto results = decrypt_pointer(encrypted_value, 1387);</span><span leaf=""><br/></span><span leaf="">        if (!results.empty()) {</span><span leaf=""><br/></span><span leaf="">            decrypted_pointers.push_back(results[0]);</span><span leaf=""><br/></span><span leaf="">        }</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span leaf="">    // 第八组数据：偏移量1272-1400，使用乘数1387</span><span leaf=""><br/></span><span leaf="">    for (int i = 0; i &lt; 16; ++i) {</span><span leaf=""><br/></span><span leaf="">        uint64_t encrypted_value = *reinterpret_cast&lt;uint64_t*&gt;(object_base + 1272 + i * 16);</span><span leaf=""><br/></span><span leaf="">        auto results = decrypt_pointer(encrypted_value, 1387);</span><span leaf=""><br/></span><span leaf="">        if (!results.empty()) {</span><span leaf=""><br/></span><span leaf="">            decrypted_pointers.push_back(results[0]);</span><span leaf=""><br/></span><span leaf="">        }</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span leaf="">    // 第九组数据：偏移量1400-1520，使用乘数1388</span><span leaf=""><br/></span><span leaf="">    for (int i = 0; i &lt; 15; ++i) {</span><span leaf=""><br/></span><span leaf="">        uint64_t encrypted_value = *reinterpret_cast&lt;uint64_t*&gt;(object_base + 1400 + i * 16);</span><span leaf=""><br/></span><span leaf="">        auto results = decrypt_pointer(encrypted_value, 1388);</span><span leaf=""><br/></span><span leaf="">        if (!results.empty()) {</span><span leaf=""><br/></span><span leaf="">            decrypted_pointers.push_back(results[0]);</span><span leaf=""><br/></span><span leaf="">        }</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span leaf="">    // 第十组数据：偏移量1528-1648，使用乘数1388</span><span leaf=""><br/></span><span leaf="">    for (int i = 0; i &lt; 15; ++i) {</span><span leaf=""><br/></span><span leaf="">        uint64_t encrypted_value = *reinterpret_cast&lt;uint64_t*&gt;(object_base + 1528 + i * 16);</span><span leaf=""><br/></span><span leaf="">        auto results = decrypt_pointer(encrypted_value, 1388);</span><span leaf=""><br/></span><span leaf="">        if (!results.empty()) {</span><span leaf=""><br/></span><span leaf="">            decrypted_pointers.push_back(results[0]);</span><span leaf=""><br/></span><span leaf="">        }</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span leaf="">    return decrypted_pointers;</span><span leaf=""><br/></span><span leaf="">}</span><span leaf=""><br/></span><span leaf="">// 定义加密组结构体</span><span leaf=""><br/></span><span leaf="">struct EncryptedGroup {</span><span leaf=""><br/></span><span leaf="">    uint64_t start_offset;  // 组起始偏移量</span><span leaf=""><br/></span><span leaf="">    uint64_t end_offset;    // 组结束偏移量</span><span leaf=""><br/></span><span leaf="">    uint64_t multiplier;    // 该组使用的乘数</span><span leaf=""><br/></span><span leaf="">    const char* description; // 组描述（可选）</span><span leaf=""><br/></span><span leaf="">};</span><span leaf=""><br/></span><span leaf="">// 获取指针位置对应的乘数</span><span leaf=""><br/></span><span leaf="">uint64_t get_multiplier_at_offset(uint64_t base, uint64_t offset) {</span><span leaf=""><br/></span><span leaf="">    // 定义所有加密组</span><span leaf=""><br/></span><span leaf="">    const std::vector&lt;EncryptedGroup&gt; groups = {</span><span leaf=""><br/></span><span leaf="">        // 第一组：偏移量16-175，乘数1345</span><span leaf=""><br/></span><span leaf="">        {16, 175, 1345, &#34;Group 1 (offsets 16-175)&#34;},</span><span leaf=""><br/></span><span leaf="">        // 第二组：偏移量184-343，乘数1345</span><span leaf=""><br/></span><span leaf="">        {184, 343, 1345, &#34;Group 2 (offsets 184-343)&#34;},</span><span leaf=""><br/></span><span leaf="">        // 第三组：偏移量560-735，乘数1368</span><span leaf=""><br/></span><span leaf="">        {560, 735, 1368, &#34;Group 3 (offsets 560-735)&#34;},</span><span leaf=""><br/></span><span leaf="">        // 第四组：偏移量744-919，乘数1368</span><span leaf=""><br/></span><span leaf="">        {744, 919, 1368, &#34;Group 4 (offsets 744-919)&#34;},</span><span leaf=""><br/></span><span leaf="">        // 第五组：偏移量968-1047，乘数1386</span><span leaf=""><br/></span><span leaf="">        {968, 1047, 1386, &#34;Group 5 (offsets 968-1047)&#34;},</span><span leaf=""><br/></span><span leaf="">        // 第六组：偏移量1056-1135，乘数1386</span><span leaf=""><br/></span><span leaf="">        {1056, 1135, 1386, &#34;Group 6 (offsets 1056-1135)&#34;},</span><span leaf=""><br/></span><span leaf="">        // 第七组：偏移量1136-1263，乘数1387</span><span leaf=""><br/></span><span leaf="">        {1136, 1263, 1387, &#34;Group 7 (offsets 1136-1263)&#34;},</span><span leaf=""><br/></span><span leaf="">        // 第八组：偏移量1272-1399，乘数1387</span><span leaf=""><br/></span><span leaf="">        {1272, 1399, 1387, &#34;Group 8 (offsets 1272-1399)&#34;},</span><span leaf=""><br/></span><span leaf="">        // 第九组：偏移量1400-1519，乘数1388</span><span leaf=""><br/></span><span leaf="">        {1400, 1519, 1388, &#34;Group 9 (offsets 1400-1519)&#34;},</span><span leaf=""><br/></span><span leaf="">        // 第十组：偏移量1528-1647，乘数1388</span><span leaf=""><br/></span><span leaf="">        {1528, 1647, 1388, &#34;Group 10 (offsets 1528-1647)&#34;}</span><span leaf=""><br/></span><span leaf="">    };</span><span leaf=""><br/></span><span leaf="">    // 检查特殊位置（不使用乘数的位置）</span><span leaf=""><br/></span><span leaf="">    if (offset == 1520) {</span><span leaf=""><br/></span><span leaf="">        // 偏移量1520使用异或和加法加密</span><span leaf=""><br/></span><span leaf="">        return 0xFFFFFFFFFFFFFFFE; // 特殊标记1</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span leaf="">    if (offset == 1264) {</span><span leaf=""><br/></span><span leaf="">        // 偏移量1264使用加法加密</span><span leaf=""><br/></span><span leaf="">        return 0xFFFFFFFFFFFFFFFD; // 特殊标记2</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span leaf="">    // 检查偏移量是否在任何加密组内</span><span leaf=""><br/></span><span leaf="">    for (const auto&amp; group : groups) {</span><span leaf=""><br/></span><span leaf="">        if (offset &gt;= group.start_offset &amp;&amp; offset &lt;= group.end_offset) {</span><span leaf=""><br/></span><span leaf="">            // 检查偏移量是否是8的倍数（指针应该对齐到8字节）</span><span leaf=""><br/></span><span leaf="">            if ((offset - group.start_offset) % 8 != 0) {</span><span leaf=""><br/></span><span leaf="">                throw std::runtime_error(&#34;Offset not aligned to 8-byte boundary within group&#34;);</span><span leaf=""><br/></span><span leaf="">            }</span><span leaf=""><br/></span><span leaf="">            return group.multiplier;</span><span leaf=""><br/></span><span leaf="">        }</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span leaf="">    // 如果不在任何加密组内，返回0表示未加密</span><span leaf=""><br/></span><span leaf="">    return 0;</span><span leaf=""><br/></span><span leaf="">}</span><span leaf=""><br/></span><span leaf="">// 获取对象中所有加密位置的乘数信息</span><span leaf=""><br/></span><span leaf="">std::vector&lt;std::pair&lt;uint64_t, uint64_t&gt;&gt; get_all_encrypted_offsets(uint64_t base) {</span><span leaf=""><br/></span><span leaf="">    std::vector&lt;std::pair&lt;uint64_t, uint64_t&gt;&gt; result;</span><span leaf=""><br/></span><span leaf="">    // 定义所有加密组</span><span leaf=""><br/></span><span leaf="">    const std::vector&lt;EncryptedGroup&gt; groups = {</span><span leaf=""><br/></span><span leaf="">        {16, 175, 1345, &#34;Group 1&#34;},</span><span leaf=""><br/></span><span leaf="">        {184, 343, 1345, &#34;Group 2&#34;},</span><span leaf=""><br/></span><span leaf="">        {560, 735, 1368, &#34;Group 3&#34;},</span><span leaf=""><br/></span><span leaf="">        {744, 919, 1368, &#34;Group 4&#34;},</span><span leaf=""><br/></span><span leaf="">        {968, 1047, 1386, &#34;Group 5&#34;},</span><span leaf=""><br/></span><span leaf="">        {1056, 1135, 1386, &#34;Group 6&#34;},</span><span leaf=""><br/></span><span leaf="">        {1136, 1263, 1387, &#34;Group 7&#34;},</span><span leaf=""><br/></span><span leaf="">        {1272, 1399, 1387, &#34;Group 8&#34;},</span><span leaf=""><br/></span><span leaf="">        {1400, 1519, 1388, &#34;Group 9&#34;},</span><span leaf=""><br/></span><span leaf="">        {1528, 1647, 1388, &#34;Group 10&#34;}</span><span leaf=""><br/></span><span leaf="">    };</span><span leaf=""><br/></span><span leaf="">    // 添加特殊位置</span><span leaf=""><br/></span><span leaf="">    result.emplace_back(1520, 0xFFFFFFFFFFFFFFFE);</span><span leaf=""><br/></span><span leaf="">    result.emplace_back(1264, 0xFFFFFFFFFFFFFFFD);</span><span leaf=""><br/></span><span leaf="">    // 添加所有加密组内的位置</span><span leaf=""><br/></span><span leaf="">    for (const auto&amp; group : groups) {</span><span leaf=""><br/></span><span leaf="">        for (uint64_t offset = group.start_offset; offset &lt;= group.end_offset; offset += 8) {</span><span leaf=""><br/></span><span leaf="">            result.emplace_back(offset, group.multiplier);</span><span leaf=""><br/></span><span leaf="">        }</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span leaf="">    return result;</span><span leaf=""><br/></span><span leaf="">}</span><span leaf=""><br/></span><span leaf="">// 打印对象中所有加密位置的乘数信息</span><span leaf=""><br/></span><span leaf="">void print_encrypted_offsets_info(uint64_t base) {</span><span leaf=""><br/></span><span leaf="">    auto encrypted_offsets = get_all_encrypted_offsets(base);</span><span leaf=""><br/></span><span leaf="">    printf(&#34;Encrypted offsets in object at base 0x%llX:\n&#34;, base);</span><span leaf=""><br/></span><span leaf="">    printf(&#34;Offset\tMultiplier\tDescription\n&#34;);</span><span leaf=""><br/></span><span leaf="">    printf(&#34;------\t----------\t-----------\n&#34;);</span><span leaf=""><br/></span><span leaf="">    for (const auto&amp; entry : encrypted_offsets) {</span><span leaf=""><br/></span><span leaf="">        uint64_t offset = entry.first;</span><span leaf=""><br/></span><span leaf="">        uint64_t multiplier = entry.second;</span><span leaf=""><br/></span><span leaf="">        if (multiplier == 0xFFFFFFFFFFFFFFFE) {</span><span leaf=""><br/></span><span leaf="">            printf(&#34;0x%llX\tSpecial\t\tXOR + ADD encryption\n&#34;, offset);</span><span leaf=""><br/></span><span leaf="">        } else if (multiplier == 0xFFFFFFFFFFFFFFFD) {</span><span leaf=""><br/></span><span leaf="">            printf(&#34;0x%llX\tSpecial\t\tADD encryption\n&#34;, offset);</span><span leaf=""><br/></span><span leaf="">        } else if (multiplier == 0) {</span><span leaf=""><br/></span><span leaf="">            printf(&#34;0x%llX\t0\t\tNot encrypted\n&#34;, offset);</span><span leaf=""><br/></span><span leaf="">        } else {</span><span leaf=""><br/></span><span leaf="">            printf(&#34;0x%llX\t%llu\t\tStandard encryption\n&#34;, offset, multiplier);</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="">int main(){</span><span leaf=""><br/></span><span leaf="">uint64_t base = 0x7ff7c06b0000; // 对象基地址</span><span leaf=""><br/></span><span leaf="">print_encrypted_offsets_info(base);</span><span leaf=""><br/></span><span leaf="">auto decrypt_test =  decrypt_pointer(0x4EF2932AD180DD26, 1345);</span><span leaf=""><br/></span><span leaf="">    printf(&#34;decrypt_test: %llx \n&#34;,decrypt_test[0]);</span><span leaf=""><br/></span><span leaf="">}</span></code></pre><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" nodeleaf=""><img data-imgfileid="100001952" class="rich_pages wxw-img" data-ratio="1.2038567493112948" data-type="png" data-w="726" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=cea4f9fd&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpicCaCOnbGNLVIztnDpFcf9Mb4ibo7J8wNFFgakyicZmjgicEuGicu4emo6w%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">然后解密一下,当然其他不同的class加密方法不同,但是结果都一样:</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001953" class="rich_pages wxw-img" data-ratio="1.0266666666666666" data-type="png" data-w="975" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=200ca77c&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpZoOcP5JMApCk6IFO3tONsRaFySrRMtibs29uDhXQvcWsW8YMgJeUFbw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">帝国时代2反作弊:</span><span leaf=""><br/></span><span leaf="">如果你挂了CE或者其他debuger,他会提示</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001954" class="rich_pages wxw-img" data-ratio="0.6614457831325301" data-type="png" data-w="830" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=86d6f42e&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpD7jCZMdfOAVwrOsHJfmJMA0iabfjrlnprZzSpW3vZ4hzl4FRsj199wg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">这是因为它使用isdebug和veh做检测</span><span leaf=""><br/></span><span leaf="">定位后patch掉就行</span></p><pre style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 13.118px;margin-top: 0px;margin-bottom: 1rem;overflow: auto;display: block;color: rgb(33, 37, 41);max-height: 400px;background-color: rgb(245, 245, 245);border: 1px solid rgb(204, 204, 204);padding: 0.5em;border-radius: 4px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><code style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: inherit;color: inherit;word-break: normal;white-space: pre-wrap;"><span leaf="">__int64 __fastcall isWecheating(__int64 a1)</span><span leaf=""><br/></span><span leaf="">{</span><span leaf=""><br/></span><span leaf="">  return *(unsigned __int8 *)(a1 + 0x698);</span><span leaf=""><br/></span><span leaf="">}</span></code></pre><pre style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 13.118px;margin-top: 0px;margin-bottom: 1rem;overflow: auto;display: block;color: rgb(33, 37, 41);max-height: 400px;background-color: rgb(245, 245, 245);border: 1px solid rgb(204, 204, 204);padding: 0.5em;border-radius: 4px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><code style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: inherit;color: inherit;word-break: normal;white-space: pre-wrap;"><span leaf="">搜索</span><span leaf=""><br/></span><span leaf="">IDS_TAMPERING_DETECTED_MESSAG</span></code></pre><pre style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 13.118px;margin-top: 0px;margin-bottom: 1rem;overflow: auto;display: block;color: rgb(33, 37, 41);max-height: 400px;background-color: rgb(245, 245, 245);border: 1px solid rgb(204, 204, 204);padding: 0.5em;border-radius: 4px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><code style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: inherit;color: inherit;word-break: normal;white-space: pre-wrap;"><span leaf=""><br/></span><span leaf="">还有一个暗装:</span><span leaf=""><br/></span><span leaf="">aoe2de_s.exe + 0xA39668</span><span leaf=""><br/></span><span leaf="">_QWORD *__fastcall sub_7FF63BB7BEC0(__int64 a1, _QWORD *a2)</span><span leaf=""><br/></span><span leaf="">{</span><span leaf=""><br/></span><span leaf="">  struct _Mtx_internal_imp_t *v4; // rbx</span><span leaf=""><br/></span><span leaf="">  int v5; // eax</span><span leaf=""><br/></span><span leaf="">  __int64 v6; // r8</span><span leaf=""><br/></span><span leaf="">  unsigned __int64 v7; // r9</span><span leaf=""><br/></span><span leaf="">  *a2 = 0i64;</span><span leaf=""><br/></span><span leaf="">  v4 = (struct _Mtx_internal_imp_t *)(a1 + 9344);</span><span leaf=""><br/></span><span leaf="">  v5 = Mtx_lock((_Mtx_t)(a1 + 9344));</span><span leaf=""><br/></span><span leaf="">  if ( v5 )</span><span leaf=""><br/></span><span leaf="">  {</span><span leaf=""><br/></span><span leaf="">    std::_Throw_C_error(v5);</span><span leaf=""><br/></span><span leaf="">    JUMPOUT(0x7FF63BB7BF78i64);</span><span leaf=""><br/></span><span leaf="">  }</span><span leaf=""><br/></span><span leaf="">  v6 = *(_QWORD *)(a1 + 9336);</span><span leaf=""><br/></span><span leaf="">  if ( v6 )</span><span leaf=""><br/></span><span leaf="">  {</span><span leaf=""><br/></span><span leaf="">    v7 = *(_QWORD *)(a1 + 9328);</span><span leaf=""><br/></span><span leaf="">    *a2 = *(_QWORD *)(*(_QWORD *)(*(_QWORD *)(a1 + 9312) + 8 * ((v7 &gt;&gt; 1) &amp; (*(_QWORD *)(a1 + 9320) - 1i64)))</span><span leaf=""><br/></span><span leaf="">                    + 8 * (v7 &amp; 1));</span><span leaf=""><br/></span><span leaf="">    *(_QWORD *)(a1 + 9336) = v6 - 1;</span><span leaf=""><br/></span><span leaf="">    if ( v6 == 1 )</span><span leaf=""><br/></span><span leaf="">      *(_QWORD *)(a1 + 9328) = 0i64;</span><span leaf=""><br/></span><span leaf="">    else</span><span leaf=""><br/></span><span leaf="">      *(_QWORD *)(a1 + 9328) = v7 + 1;</span><span leaf=""><br/></span><span leaf="">  }</span><span leaf=""><br/></span><span leaf="">  Mtx_unlock_0(v4);</span><span leaf=""><br/></span><span leaf="">  return a2;</span><span leaf=""><br/></span><span leaf="">}</span><span leaf=""><br/></span><span leaf="">弹信息框的地址是</span><span leaf=""><br/></span><span leaf="">7FF63B4B2AA0 - 0x7FF63AC70000 = 842AA0</span><span leaf=""><br/></span><span leaf="">aoe2de_s.exe + 0x842AA0</span><span leaf=""><br/></span><span leaf="">hook后看来源</span><span leaf=""><br/></span><span leaf="">0:306&gt; kb</span><span leaf=""><br/></span><span leaf=""> # RetAddr               : Args to Child                                                           : Call Site</span><span leaf=""><br/></span><span leaf="">00 00007ff7`c10ec93b     : e1c096a0`0e29052d e1c096a0`0e29052d e1c096a0`0e29052d 00000230`c85d43a0 : AoE2DE_s+0x842aa0</span><span leaf=""><br/></span><span leaf="">01 00007ff7`c10daeff     : 00000000`00000000 00000000`00000000 00000230`61a2e1f0 00000000`00000003 : AoE2DE_s+0xa3c93b</span><span leaf=""><br/></span><span leaf="">02 00007ffd`45459363     : 00000230`460ae850 00000000`00000000 00000000`00000000 00000000`00000000 : AoE2DE_s+0xa2aeff</span><span leaf=""><br/></span><span leaf="">03 00007ffd`464426ad     : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : ucrtbase!thread_start&lt;unsigned int (__cdecl*)(void *),1&gt;+0x93</span><span leaf=""><br/></span><span leaf="">04 00007ffd`4796a9f8     : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : KERNEL32!BaseThreadInitThunk+0x1d</span><span leaf=""><br/></span><span leaf="">05 00000000`00000000     : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : ntdll!RtlUserThreadStart+0x28</span><span leaf=""><br/></span><span leaf="">0:323&gt; kb</span><span leaf=""><br/></span><span leaf=""> # RetAddr               : Args to Child                                                           : Call Site</span><span leaf=""><br/></span><span leaf="">00 00007ff7`c1c8352b     : 00007ffd`4796a9f8 00007ff7`c3cf38c8 00000000`00000030 00007ff7`c3cf69b0 : USER32!MessageBoxW</span><span leaf=""><br/></span><span leaf="">01 00007ff7`c0ef2ac7     : ca057213`7bfa831d 00000000`ffffffff 00000230`60ad5d30 00000000`ffffffff : AoE2DE_s+0x15d352b</span><span leaf=""><br/></span><span leaf="">02 00007ff7`c10ec93b     : ca057213`7bfa831d ca057213`7bfa831d ca057213`7bfa831d 00000230`c85d43a0 : AoE2DE_s+0x842ac7</span><span leaf=""><br/></span><span leaf="">03 00007ff7`c10daeff     : 00000000`00000000 00000000`00000000 00000230`f8868840 00000000`00000003 : AoE2DE_s+0xa3c93b</span><span leaf=""><br/></span><span leaf="">04 00007ffd`45459363     : 00000230`46018fc0 00000000`00000000 00000000`00000000 00000000`00000000 : AoE2DE_s+0xa2aeff</span><span leaf=""><br/></span><span leaf="">05 00007ffd`464426ad     : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : ucrtbase!thread_start&lt;unsigned int (__cdecl*)(void *),1&gt;+0x93</span><span leaf=""><br/></span><span leaf="">06 00007ffd`4796a9f8     : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : KERNEL32!BaseThreadInitThunk+0x1d</span><span leaf=""><br/></span><span leaf="">07 00000000`00000000     : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : ntdll!RtlUserThreadStart+0x28</span><span leaf=""><br/></span><span leaf="">__int64 __fastcall sub_7FF63BAE8380(__int64 a1)</span><span leaf=""><br/></span><span leaf="">{</span><span leaf=""><br/></span><span leaf="">  __int64 result; // rax</span><span leaf=""><br/></span><span leaf="">  __int64 v3; // rcx</span><span leaf=""><br/></span><span leaf="">  __int64 (__fastcall ***v4)(_QWORD, __int64); // rcx</span><span leaf=""><br/></span><span leaf="">  if ( qword_7FF63F0780E8 )</span><span leaf=""><br/></span><span leaf="">    sub_7FF63BB86ED0(qword_7FF63F0780E8, 4i64);</span><span leaf=""><br/></span><span leaf="">  if ( *(_BYTE *)(a1 + 0x699) )</span><span leaf=""><br/></span><span leaf="">    sub_7FF63BB799C0(g_events);</span><span leaf=""><br/></span><span leaf="">  *(_BYTE *)(a1 + 0x699) = 1;</span><span leaf=""><br/></span><span leaf="">  result = g_events;</span><span leaf=""><br/></span><span leaf="">  v3 = *(_QWORD *)(*(_QWORD *)(g_events + 848) + 11088i64);</span><span leaf=""><br/></span><span leaf="">  if ( v3 )</span><span leaf=""><br/></span><span leaf="">    result = (*(__int64 (__fastcall **)(__int64))(*(_QWORD *)v3 + 552i64))(v3);</span><span leaf=""><br/></span><span leaf="">  v4 = *(__int64 (__fastcall ****)(_QWORD, __int64))(a1 + 1136);</span><span leaf=""><br/></span><span leaf="">  *(_QWORD *)(a1 + 1136) = 0i64;</span><span leaf=""><br/></span><span leaf="">  if ( v4 )</span><span leaf=""><br/></span><span leaf="">    return (**v4)(v4, 1i64);</span><span leaf=""><br/></span><span leaf="">  return result;</span><span leaf=""><br/></span><span leaf="">}</span><span leaf=""><br/></span><span leaf="">写入的几个地址：</span><span leaf=""><br/></span><span leaf="">0:293&gt; g</span><span leaf=""><br/></span><span leaf="">Breakpoint 4 hit</span><span leaf=""><br/></span><span leaf="">AoE2DE_s+0xa3c11f:</span><span leaf=""><br/></span><span leaf="">00007ff7`c10ec11f c681f10e000001  mov     byte ptr [rcx+0EF1h],1 ds:00000292`17f1dba1=01</span><span leaf=""><br/></span><span leaf="">0:293&gt; kb</span><span leaf=""><br/></span><span leaf=""> # RetAddr               : Args to Child                                                           : Call Site</span><span leaf=""><br/></span><span leaf="">00 00007ff7`c10ec92f     : 6d4c1d03`8609bde5 6d4c1d03`8609bde5 6d4c1d03`8609bde5 00000292`0d042b50 : AoE2DE_s+0xa3c11f</span><span leaf=""><br/></span><span leaf="">01 00007ff7`c10daeff     : 00000000`00000000 00000000`00000000 00000293`1d5f04f0 00000000`00000003 : AoE2DE_s+0xa3c92f</span><span leaf=""><br/></span><span leaf="">02 00007ffd`45459363     : 00000292`077fbfd0 00000000`00000000 00000000`00000000 00000000`00000000 : AoE2DE_s+0xa2aeff</span><span leaf=""><br/></span><span leaf="">03 00007ffd`464426ad     : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : ucrtbase!thread_start&lt;unsigned int (__cdecl*)(void *),1&gt;+0x93</span><span leaf=""><br/></span><span leaf="">04 00007ffd`4796a9f8     : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : KERNEL32!BaseThreadInitThunk+0x1d</span><span leaf=""><br/></span><span leaf="">05 00000000`00000000     : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : ntdll!RtlUserThreadStart+0x28</span><span leaf=""><br/></span><span leaf="">call的函数是</span><span leaf=""><br/></span><span leaf="">aoe2de_s.exe + 0x501d43e</span><span leaf=""><br/></span><span leaf="">0x7FF63AC70000 + 0xa3c93b = </span><span leaf=""><br/></span><span leaf="">AoE2DE_s.exe+2B86916 - 66 66 0F1F 84 00 00000000  - nop word ptr [rax+rax+00000000]</span><span leaf=""><br/></span><span leaf="">AoE2DE_s.exe+2B86920 - 48 3B 0D 91D86A01     - cmp rcx,[AoE2DE_s.exe+42341B8] { (-562597392) }</span><span leaf=""><br/></span><span leaf="">AoE2DE_s.exe+2B86927 - 75 10                 - jne AoE2DE_s.exe+2B86939</span><span leaf=""><br/></span><span leaf="">AoE2DE_s.exe+2B86929 - 48 C1 C1 10           - rol rcx,10 { 16 }</span><span leaf=""><br/></span><span leaf="">AoE2DE_s.exe+2B8692D - 66 F7 C1 FFFF         - test cx,FFFF { 65535 }</span><span leaf=""><br/></span><span leaf="">AoE2DE_s.exe+2B86932 - 75 01                 - jne AoE2DE_s.exe+2B86935</span><span leaf=""><br/></span><span leaf="">AoE2DE_s.exe+2B86934 - C3                    - ret </span><span leaf=""><br/></span><span leaf="">AoE2DE_s.exe+2B86935 - 48 C1 C9 10           - ror rcx,10 { 16 }</span><span leaf=""><br/></span><span leaf="">AoE2DE_s.exe+2B86939 - E9 C2030000           - jmp AoE2DE_s.exe+2B86D00</span></code></pre><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">之后我们就可以顺利得到资源了.这些都不是本篇要说的内容.</span><span leaf=""><br/></span><span leaf="">为此 我做了一个简单的透视，打印出内容</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001955" class="rich_pages wxw-img" data-ratio="0.8444444444444444" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=921e443a&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpPCAic0mibJbU9K9Pt4XH8zNs84rj9dOG0Fia9uIFZiceo6lJCn8ibz0C8Sw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001956" class="rich_pages wxw-img" data-ratio="0.5305555555555556" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=0a1a70ce&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpicBN2lI8RUD7yiaZ2xo0WKlhGT8KLAENgDmtGTEPhq9T2rwhppJhshBQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">值得注意的是,盖亚的树木和鱼和海要额外处理:</span><span leaf=""><br/></span><span leaf="">你可以看到他并不显示树木</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001960" class="rich_pages wxw-img" data-ratio="0.6" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=c398494d&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpicIKE4cxoPwag76GMSSlXHwAqx1ODsicZD5762sSWlPUTT2F3EIibsvKQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">这是因为，这些是 地图属性,需要从另外一个表读取,非常非常大,这个折腾花了我一天时间,最后借助GPT的帮助才恍然大悟!</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001961" class="rich_pages wxw-img" data-ratio="0.5305555555555556" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=4fe78626&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpibHOeFkjnibYtpUC1M66urtF1lMe2yYLyMialHQakmSrh5NZHW9ic1iayVg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"></span><span leaf="">帝国时代2内存泄漏</span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">我有理由相信帝国时代2存在某种资源泄漏.原因是死亡的对象会堆积在0-0-0的区域内,不会被删除</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001959" class="rich_pages wxw-img" data-ratio="0.42592592592592593" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=9c09ee8f&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtp0iaYBlmh9JWDBVyZZibJCGFwhpttfEhf1nAX9zcgDLpCDUGQOsVgwsPw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">据我观察到,这块内存会越来越大在一局比赛中,这可能也是为什么帝国时代2这游戏越玩越卡的原因</span></p><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"></span><span leaf="">帝国时代2命令系统</span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">微软九十年代的程序员,代码技术非常的硬.表现为他们要实现一个八人在线，数百个甚至是数千个单位，在10kb光猫下跑的联机对战系统！(以及反外挂)</span><span leaf=""><br/></span><strong style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-weight: bolder;"><span leaf="">这个系统细节我会放到下期，这对我们的影响是，我们没有办法直接移动单位，或者修改资源，或者做出任何事情！只能读取</span></strong><span leaf=""><br/></span><span leaf="">这是因为，帝国时代2的网络系统是lockstep,这是一种非常离谱的方法,在2000年的时候还专门写了一篇新闻说他们是如何的困难</span><span leaf=""><br/></span><span leaf=""><a href="https://web.archive.org/web/20180719170411/https://www.gamasutra.com/view/feature/131503/1500_archers_on_a_288_network_.php?print=1" target="_blank">https://web.archive.org/web/20180719170411/https://www.gamasutra.com/view/feature/131503/1500_archers_on_a_288_network_.php?print=1</a></span><span leaf=""><br/></span><span leaf="">我非常建议搞技术的详细阅读这篇文章.即便是不是游戏行业也受益匪浅</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001958" class="rich_pages wxw-img" data-ratio="0.8324074074074074" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=91207c89&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpEZfWNrSdDibzQjl1AGERvEDGq19fHU92xfQicSlf2dMaaJNVfVo8aaIQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">简单来说,你的所有状态都会同步给其他玩家,</span><span leaf=""><br/></span><span leaf="">其他玩家会根据你的少量信息在本地进行模拟计算</span><span leaf=""><br/></span><span leaf="">计算出来的结果再在本地呈现出来</span><span leaf=""><br/></span><span leaf="">这意味着:</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">（1）所有对局看起来没多少延迟,因为大部分都是本地计算的.除非有大量丢包.</span><span leaf=""><br/></span><span leaf="">（2）你可以改资源/甚至是修改视野范围,但是其他玩家发现你的状态并不是能在他本地”模拟计算”出来的结果,所以他就会发出不同步的指令,这代表本局有人开挂。</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">所以我们不能直接移动单位,而是寻找传说中的命令系统</span><span leaf=""><br/></span><span leaf="">命令系统寻找过程就不说了,因为是九十年代的代码,实在是过于复杂,在连续熬夜三天三夜只睡了4个小时后,说个血泪总结:</span><span leaf=""><br/></span><span leaf="">有一个函数,是命令分发的!原型是</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001957" class="rich_pages wxw-img" data-ratio="0.07962962962962963" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=6bc78d82&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpG15UEvueoJnUZKyYfZEvTNCE62kgsugsFzDZIZLCLDgMPicZUV0pSiaw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">接受的参数是</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001962" class="rich_pages wxw-img" data-ratio="0.41759259259259257" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=c6156b8b&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpcoHqoQNTOBsCxYrXpBYaPzrEQ99O6kctJxYWwTIVgeAmnQPOiaL08iaA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">有了这个我们就能构造任意命令发送了。移动，升级时代，都是这样的</span><span leaf=""><br/></span><span leaf="">ps这个有个bug: 命令是P2P的,所以能瞎几把发,比如你选择B的玩家的单位发送命令移动或者摧毁自己都可以。不过我们的目的不是为了开外挂,是为了做MCP.所以默认我们是合法的</span><span leaf=""><br/></span><span leaf="">相关资料:</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001963" class="rich_pages wxw-img" data-ratio="0.5268518518518519" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=b6f6071e&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtp266PmZrvlB8YXEjzqEsKJ7ib9eUEXjttF0mWKZoAUHHxic0dialCvFbYg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf=""><a href="https://redrocket.club/posts/age_of_empires/" target="_blank">https://redrocket.club/posts/age_of_empires/</a></span></p><h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf="">远程call</span></h2><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">为了发命令,我设计了一个基于ALPC的远程call,一个DLL注入到帝国时代2里面,暴露ALPC接口:</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001965" class="rich_pages wxw-img" data-ratio="1.0357894736842106" data-type="png" data-w="950" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=1a4a356e&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpPWc3sd9YQnbKEL6bxZkk6icH8hSkzvXDrYlGKhgBgP1a9lNjKfVvHvQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">接受客户端的游戏指令并且在UI线程执行,之所以在UI线程执行,因为帝国时代2并没有多线程安全的机制,它默认所有的游戏都是UI更新来的(ps: 很多老游戏都这样,而且这玩意跟AI挂钩,自己的FPS越高,AI越聪明…)</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001967" class="rich_pages wxw-img" data-ratio="0.9824074074074074" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=d247acb5&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpyXEt72tmRBosMVyjfdQaDEIJlPdIZMDAJ4ELD7HCrQVK5ibJK5TW2bw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">这样客户端就能轻松CALL了</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001966" class="rich_pages wxw-img" data-ratio="0.7490740740740741" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=83c37e81&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpy6smYia49mQib2SqfFn6icRLGSZiaROPRS5OUicQAtaU54Xt80ib9j7rLCbw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">结果:</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001968" class="rich_pages wxw-img" data-ratio="0.35" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=722cd5f0&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpB6zzOHgkjTyuuOJym9DibrSJIbsURDu1SOiaqH4MdzryxS3dOPr4HVBA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"></span><span leaf="">地图系统</span></h2><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">为了实现MCP,我做了一个地图系统。总所周知，帝国时代2的地图是一个XY坐标的地图，一般是320x320 650x650等等，这个地图系统，我们是不能直接for x-y去寻找对象的，因为效率太低。所以要用到另外一个算法，叫做空间哈希网格，这个算法我也不太熟悉，是AI看了帝国时代2的代码后给出的，他的主要作用是，能快速索引 某个对象周围的对象。时间复杂度只有o(1)</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001964" class="rich_pages wxw-img" data-ratio="1.0446428571428572" data-type="png" data-w="1008" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=835a426e&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpouYLwrlKEMfOzLg9EMFWbwU1FWlJibjlrW5hQibcHKmO8Nhw1R780QXA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">而寻路算法使用a star 不过帝国时代2自己有寻路系统，我们不需要操心（他也是A star）</span></p><pre style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 13.118px;margin-top: 0px;margin-bottom: 1rem;overflow: auto;display: block;color: rgb(33, 37, 41);max-height: 400px;background-color: rgb(245, 245, 245);border: 1px solid rgb(204, 204, 204);padding: 0.5em;border-radius: 4px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><code style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: inherit;color: inherit;word-break: normal;white-space: pre-wrap;"><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><span leaf=""><br/></span><span leaf="">输出：计算出一个固定的、通常比较短的编号，比如 5381。这个编号就是“哈希值”。</span><span leaf=""><br/></span><span leaf="">核心特点：</span><span leaf=""><br/></span><span leaf="">确定性：同样的输入（《三体》），永远会得到同样的输出（5381）。</span><span leaf=""><br/></span><span leaf="">高效性：计算速度非常快。</span><span leaf=""><br/></span><span leaf="">散列性：一个好的哈希算法会让不同的输入尽量产生不同的输出，避免“冲突”（即两本不同的书算出了同一个编号）。</span><span leaf=""><br/></span><span leaf="">在我们的图书馆例子里，这个管理员（哈希算法）会告诉你：“《三体》这本书在 5381 号书架上”。你直接去那个书架找就行了，省去了遍历整个图书馆的时间。</span><span leaf=""><br/></span><span leaf="">第二部分：什么是空间哈希网格？</span><span leaf=""><br/></span><span leaf="">现在，我们把场景从图书馆换到一个游戏世界，比如你正在玩的《帝国时代2》。地图上有成百上千个单位：农民、士兵、建筑、资源……</span><span leaf=""><br/></span><span leaf="">游戏需要 constantly （不断地）回答一个问题：“在某个单位周围，有哪些其他单位？” 例如：</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="">最笨的办法是让每个单位都和地图上所有其他单位都计算一次距离。如果有1000个单位，就需要计算1000 * 1000 = 1,000,000次！这会让游戏卡成幻灯片。</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="">分配对象：根据一个游戏单位（比如一个骑兵）的坐标 (x, y)，计算出它位于哪个格子里。例如，坐标 (155, 267) 可能位于格子 (15, 26) 中。</span><span leaf=""><br/></span><span leaf="">只检查相邻格子：当需要查找某个单位附近的其他单位时，系统只检查这个单位所在的格子以及它周围的8个格子。</span><span leaf=""><br/></span><span leaf="">举个例子：</span><span leaf=""><br/></span><span leaf="">假设地图被分成100个格子。一个士兵在格子 (5,5) 里。</span><span leaf=""><br/></span><span leaf="">笨办法：它需要和地图上所有999个其他单位计算距离。</span><span leaf=""><br/></span><span leaf="">空间哈希网格：它只需要和也在格子 (4,4), (5,4), (6,4), (4,5), (5,5), (6,5), (4,6), (5,6), (6,6) 这9个格子里的单位计算距离。</span><span leaf=""><br/></span><span leaf="">如果单位均匀分布，每个格子里大约只有10个单位，那么士兵只需要进行 9 * 10 = 90 次计算，而不是999次！效率提升了成百上千倍。</span><span leaf=""><br/></span><span leaf="">第三部分：两者如何结合？“哈希”在哪里？</span><span leaf=""><br/></span><span leaf="">现在关键问题来了：我们如何快速知道一个坐标 (x, y) 属于哪个格子？又如何快速找到某个格子里的所有单位呢？</span><span leaf=""><br/></span><span leaf="">这里就用到了 哈希算法！</span><span leaf=""><br/></span><span leaf="">步骤如下：</span><span leaf=""><br/></span><span leaf="">生成“键”：我们取一个单位的坐标 (x, y)，把它映射到对应的格子坐标 (grid_x, grid_y)。通常很简单：</span><span leaf=""><br/></span><span leaf="">grid_x = floor(x / cell_size)</span><span leaf=""><br/></span><span leaf="">grid_y = floor(y / cell_size)</span><span leaf=""><br/></span><span leaf="">（floor 是向下取整，cell_size 是每个格子的大小）</span><span leaf=""><br/></span><span leaf="">计算哈希值：我们将这个格子坐标 (grid_x, grid_y) 作为“键”，输入给一个哈希函数。</span><span leaf=""><br/></span><span leaf="">hash_key = hash_function(grid_x, grid_y)</span><span leaf=""><br/></span><span leaf="">存储和查找：系统维护一个巨大的“字典”（哈希表）。这个 hash_key 就是字典的索引。所有在同一个格子里的单位，都会被放入这个 hash_key 对应的列表里。</span><span leaf=""><br/></span><span leaf="">当我们需要查找时：</span><span leaf=""><br/></span><span leaf="">取目标的坐标，算出它的格子坐标 (grid_x, grid_y)。</span><span leaf=""><br/></span><span leaf="">用哈希函数瞬间计算出 hash_key。</span><span leaf=""><br/></span><span leaf="">直接用这个 hash_key 去字典里，瞬间找到对应格子的单位列表。</span><span leaf=""><br/></span><span leaf="">检查这个格子及周围8个格子的列表，完成碰撞检测或范围查询。</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><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="">你（游戏引擎） 想问“《三体》在哪？”，管理员瞬间告诉你“5381号架”，你直接过去，而不用逛遍整个大厅。</span><span leaf=""><br/></span><span leaf="">在《帝国时代2》这样的游戏中，这套机制是保证成千上万个单位能够流畅运行而不会卡顿的关键技术之一。</span></code></pre><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">反正我是不懂，不过就当是真的吧，确实有效果。 那么这样我们的MCP就有感知能力了，以下是AI感知周围的截图:</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001969" class="rich_pages wxw-img" data-ratio="0.32222222222222224" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=7124c3b4&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpNNPrIMuacpibQzTm3bYSdlGibZ33NlLib1ZNt8l0Z7v8Yk6RwPaibnncKQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"></span><span leaf="">MCP服务端设计</span></h2><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">这是最关键的一部分，也是最耗费时间的部分。总的来说，我们其实有很多种让AI玩的方案，不一定是大语言模型。其实我也考虑过其他方案，不过国庆就这么多天，我也没时间实现了。方案如下</span></p><ol style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" class="list-paddingleft-1"><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">OneBrain ALL IN</span></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">决策层（有限状态机/行为树） + 命令执行层</span></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">决策层 (效用AI) + 命令执行层</span></p></li></ol><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">第一种是，我们直接让AI参与控制决策并且直接控制各个单位移动，部署。 -这样做的比较快，本次项目用的就是这个。</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">第二种第三种的“决策层”这个决策层不仅仅是大语言模型，还可以是传统游戏决策树/强化学习的AI甚至是一个xgboost就行，因为它只需要发几个特定的命令: 比如农田建造在x区域。然后命令执行层用代码根据村民位置，选择最好的方案执行。 如果你读过帝国时代2的AI代码，你就会发现，帝国时代2的AI就是这样做的。他的好处是决策和执行分开，不需要太大的沉默成本。但是也是最费时间的，原因很简单，有限状态机/决策树是可枚举的，但是帝国时代2的这个RTS被开发出了上百种玩法，即便是帝国时代2的极难AI也有缺陷-比如黑暗时代封墙，黑森林围墙之类的。所以这个方案耗时耗力，考虑到我不是专业游戏开发，还是算了- 要是哪天我去做游戏的我会试试的</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">第三种</span><span leaf=""><br/></span><span leaf="">不为AI定义明确的“如果-那么”规则，而是为每个可能的行动计算一个“得分”（效用值），然后选择得分最高的那个行动</span><span leaf=""><br/></span><span leaf="">比如,计算得分：</span><span leaf=""><br/></span><span leaf="">攻击的得分 = 攻击欲望 </span><em style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><span leaf="">命中率</span><span leaf=""><br/></span><span leaf="">吃药的得分 = (1 - 生命值百分比) </span></em><span leaf="">药瓶价值</span><span leaf=""><br/></span><span leaf="">找掩体的得分 = 危险程度 * 附近掩体质量</span><span leaf=""><br/></span><span leaf="">选择：比较这三个得分，执行最高的那个</span><span leaf=""><br/></span><span leaf="">这个也比较复杂，复杂不是决策层的设计而是那个命令执行层的设计。所以也pass了</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">因此我选择直接让AI控制单位这种低级粗暴的算法。因为我没多少时间，国庆后还要当牛马</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">因此我设计了17款工具,抛开别的,关键的几个是</span></p><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"></span><span leaf="">incident</span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">为了让AI有态势感知能力，我编写了一个incident系统，其实游戏也有incident系统，比如你被野生动物攻击，敌人正在进攻城镇什么的，但是我实在是不想hook了，因为hook意味着你还需要把incident传入客户端，alpc是单向的，我懒得再建立一个服务器了。因此我在incident加了一个events，循环遍历把事件加入到表里面:</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001970" class="rich_pages wxw-img" data-ratio="0.32621951219512196" data-type="png" data-w="984" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=d4abc4ce&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpbiajZCUFcNVfVoUJoD6X60qVrLmD3iawTaKkM9vicoxvoAX8zEUKAmYrA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">比如遇见敌方军队，遇见自然资源，都加进去</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001971" class="rich_pages wxw-img" data-ratio="0.5211608222490931" data-type="png" data-w="827" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=cd9dee53&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpVBLlaJ0yTyEwqq7N1foeQwzvlJTct7nE7iciceb8E9ZXVSs7d3pibHdzw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">事实证明这非常有用，基本所有的AI都靠这个做战场态势感知。</span></p><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"></span><span leaf="">移动</span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" nodeleaf=""><img data-imgfileid="100001972" class="rich_pages wxw-img" data-ratio="0.43796296296296294" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=de00df49&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpYT0Q5m3RXbF89eDjS5BEibqDDtJmGSImBYjStS81VKghCCe7YUedqGA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"></span><span leaf="">智能交互</span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">a单位和b单位进行交互,计算两个单位是什么东西,比如村民交互了绵羊那就是在杀羊.发attack命令。士兵选择了敌方城堡 那就是攻击命令</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001973" class="rich_pages wxw-img" data-ratio="0.32314814814814813" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=77c97357&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpBnvpvzhKRPFfgQ2WtQUTD2YqsJic8C1JqW8eicp74vlehWp2oIORNS0A%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"></span><span leaf="">地图发现</span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">这个工具让AI输入坐标，输出里面一定范围内有什么</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001974" class="rich_pages wxw-img" data-ratio="0.23425925925925925" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=821bffce&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtp1ibjw2RVHosichiaEBtjh0woLicu5zCxHtb8zoRiaTtj3310AMOzFM7v80A%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">这样能方便建造，训练，位置摆放。</span><span leaf=""><br/></span><span leaf="">map_discover虽然我不想让AI作弊，但是我不想再搞个视野检查系统了，太累了，虽然能搞。但是时间有限，还是让AI作弊吧。不过AI也不知道敌人坐标，所以还好。</span></p><blockquote style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin: 5px 0px 15px;overflow: hidden;border-width: 0px 0px 0px 4px;border-top-style: initial;border-right-style: initial;border-bottom-style: initial;border-left-style: solid;border-top-color: initial;border-right-color: initial;border-bottom-color: initial;border-left-color: rgb(122, 208, 58);border-image: initial;padding: 8px 12px;background-color: rgb(241, 241, 241);box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 1px 0px;font-size: 14.992px;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;"><span leaf="">实战观测到，claude会用这个作弊，其他都是老老实实排除侦察骑兵进行侦察</span></p></blockquote><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"></span><span leaf="">建造功能</span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">值得注意的是，本来建造功能没那么复杂，直接调用游戏函数判断结果的</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001976" class="rich_pages wxw-img" data-ratio="0.7333333333333333" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=775ef645&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpDc7Gtp7A53ZXuDPoVibPxD8Mpecycz5wNv5kmCx7RrGA8tCGtZqQv8A%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">结果我发现：</span><span leaf=""><br/></span><span leaf="">大部分AI包括claude除了GLM,他们的”空间感”都不是很好,经常建造在重复建造的区域内…所以实在是受不了了，又自己硬编码了建筑物大小，前置信息等乱七八糟的东西，防止AI瞎搞并且给出信息</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001975" class="rich_pages wxw-img" data-ratio="0.9203703703703704" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=884cee29&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpteUD5gINJhqLN8JZ7RZAtKLVCShuy5sCDhTMQbCYwVuu8n3X29SiaicA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: inherit;font-weight: 500;line-height: 1.2;color: inherit;font-size: 1.75rem;" data-pm-slice="0 0 []"><span leaf="">http服务器</span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;"><span leaf="">这17个工具都用httplib暴露接口,做标准的MCP服务器</span><span leaf=""><br/></span><span leaf="">httplib</span><span leaf=""><br/></span><span leaf="">非常推荐这玩意，真的好用，祖传了几年，没出事过</span><span leaf=""><br/></span><span leaf=""><a href="https://github.com/yhirose/cpp-httplib" target="_blank">https://github.com/yhirose/cpp-httplib</a></span></p><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: inherit;font-weight: 500;line-height: 1.2;color: inherit;font-size: 1.75rem;"><span style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"></span><span leaf="">agent设计</span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;"><span leaf="">整个agent部分我用deepseek一边调试一边写的，deepseek可以说是第一个玩帝国时代2的agent，因为他的token真的便宜，可以给我大量的试错。经过deepseek的调整，花了几天功夫，我总结出以下几点</span></p><ol style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;" class="list-paddingleft-1"><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">所有AI没有长期规划能力，所以一定要让他们自己维护一个todolist.而且我规定必须带数字,比如搜集100食物,这规定是代码写死的，提交不明确的信息将被拒绝，事实证明这非常有效果。</span><span leaf=""><br/></span><span leaf=""><img class="rich_pages wxw-img" data-imgfileid="100001978" data-ratio="0.2851851851851852" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" data-w="1080" src="https://wechat2rss.xlab.app/img-proxy/?k=0c4e0df0&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpcMdzZ8VwPqxZeyaSe2c32qPjrZ2blJIz1ia0xYJXh6IeLxTNqwdxewQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">我把10-12次对话设置为一轮，一轮后一开始是由AI自己总结对话，继续新的对话实现token”压缩”但是token压缩效果非常差，表现为deepseek经常会把错误带入到下一个对话，导致拉闸。所以我决定彻底放弃对话，而是设计一个”军师”的角色，这个角色的目的是根据现在的游戏信息+反思历史AI和工具交互的错误，总结AI的错误，这不是简单的token压缩。因此deepseek才终于能反思自己的错误避免错误传递到下一轮,并且军师的思考能直接决定战局走向。非常不错</span><span leaf=""><br/></span><span leaf=""><img class="rich_pages wxw-img" data-imgfileid="100001980" data-ratio="0.4722222222222222" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" data-w="1080" src="https://wechat2rss.xlab.app/img-proxy/?k=b36155a6&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpOftUicmMTzbGic6libX5Kyn1TfFEXVwicDoQ75zdaG03fO5JIF11SQUJIg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">写告警事件: 大部分AI其实完全不会玩帝国时代2,或者说他们压根没训练过帝国时代2, 很多时候不知道自己要干什么，比如一堆空闲农民他们觉得是正常的，因此我设计了一个硬编码的告警系统，提醒他们需要干什么，比如空闲农民过多，立刻不让他们空闲之类的:</span><span leaf=""><br/></span><span leaf=""><img class="rich_pages wxw-img" data-imgfileid="100001979" data-ratio="0.7046296296296296" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" data-w="1080" src="https://wechat2rss.xlab.app/img-proxy/?k=79ba9001&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpU5AjRK9yj2gqk9eeIrmTtJwVpawDoDPpMktaVtJUG2Ab3u4uslZpAA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">这我也没办法，毕竟AI没玩过帝国时代2，就这样AI还会出错,比如GLM:</span><span leaf=""><br/></span><span leaf=""><img class="rich_pages wxw-img" data-imgfileid="100001977" data-ratio="0.2209106239460371" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" data-w="593" src="https://wechat2rss.xlab.app/img-proxy/?k=3be16eeb&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWJtBEzyKEx0hJwQZpYiaGmtpl2ibibg4icoRKXiadaZTbiciaP5JoNBbw5HIsaof0ajomap8fVUKP2HpdcwQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">内置工具call: 我也不知道为什么，deepseek的深度思考是不支持工具调用的，所以我没办法，只能做一个正则匹配的内置call，具体来说匹配tools开头的标签和结尾，然后把里面的json解析出来，事实证明，其他具备agent能力的模型，是内置call也好还是openai格式的call也罢都支持挺不错的，唯一就是deepseek的think模型完全不支持这样。反正非常蛋疼</span></p></li></ol><h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: inherit;font-weight: 500;line-height: 1.2;color: inherit;font-size: 2rem;"><span style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"></span><span leaf="">总结</span></h2><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;"><span leaf="">感谢你的耐心收看,如果你对帝国时代2的游戏引擎/游戏机制/优秀的游戏网络系统感兴趣的话，</span><strong style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-weight: bolder;"><span leaf="">更多详细的技术分析报告详我会整理大概半个月后发出来</span></strong><span leaf="">,微信公众号回复&#34;帝国时代2&#34;可以参与预约,如果预约的人太少,那就烂在肚子里面吧，因为他的游戏机制实在是太多，太复杂了，我还在考虑也不要在我忘记之前记录下来。</span><span leaf=""><br/></span><span leaf="">整个过程非常累人，这个工作量远远超出我的预期了，表现在，当我认为现在的功能完美能让AI用的时候，我发现AI又缺功能了，又缺功能，只能继续硬着头皮逆向，来来去去，，这种活本来预期三天的搞了快一个星期，我决定下次不整这种活了，国庆就应该好好休息。</span></p><p style="display: none;"><mp-style-type data-value="3"></mp-style-type></p>



<p><a href="2247485632">阅读原文</a></p>
<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=2df84376&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzkyOTc0NDY2Nw%3D%3D%26mid%3D2247485632%26idx%3D1%26sn%3D5099048f6d21234acfacb5f13d2c7545">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Mon, 06 Oct 2025 10:01:00 +0800</pubDate>
    </item>
    <item>
      <title>&#34;ucpd.sys后门事件&#34;详细分析技术报告-他是后门.....吗?</title>
      <link>https://mp.weixin.qq.com/s?__biz=MzkyOTc0NDY2Nw==&amp;mid=2247485442&amp;idx=1&amp;sn=a56332f9d4b4ef24ddcbc8da592399c8</link>
      <description></description>
      <content:encoded><![CDATA[<p>
原创 <span>为了安全鸭</span> <span>2025-09-18 10:03</span> <span style="display: inline-block;">日本</span>
</p>




<p>
<img src="https://wechat2rss.xlab.app/img-proxy/?k=375c7022&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FejibWMxI7nWLfPpNmeHIcKbjbmU2RFoZbpwhdGSZxgN5Aibd2PLhiapUN7UFSOEMCvMibkd7tNEtTv0nkicEj9vZJFw%2F0%3Fwx_fmt%3Djpeg"/>
</p>


<p><span leaf=""><span textstyle="" style="font-size: 24px;">前言</span></span></p><p><span leaf="">老实说,我非常不喜欢蹭热点,因为我认为人生不能把时间浪费在无意义的争论上.但是最近一篇文章引起了我的兴趣:</span></p><p style="text-align: center;" nodeleaf=""><img data-imgfileid="100001745" class="rich_pages wxw-img" data-ratio="1.1074074074074074" data-s="300,640" data-type="png" data-w="1080" type="block" src="https://wechat2rss.xlab.app/img-proxy/?k=6e72555b&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLfPpNmeHIcKbjbmU2RFoZbuicutvbUoMkhibV5xs1gLQn7w9iczBvqaJribuZgP2Mh7MBtb4Mmw8ebibg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p><span leaf="">因为整个微信公众号,整个新闻页面,都是这玩意了,不小心点了之后,感谢大数据,我的各种社交媒体首页,也全是这玩意推荐:</span></p><p style="text-align: center;" nodeleaf=""><img data-imgfileid="100001746" class="rich_pages wxw-img" data-ratio="1.1704885343968097" data-s="300,640" data-type="png" data-w="1003" type="block" src="https://wechat2rss.xlab.app/img-proxy/?k=7a93cc02&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLfPpNmeHIcKbjbmU2RFoZbicXAiaZ5QyhzJAgOAeBXcbKDuibAfpQgOonZUSM7M8C27mZnHVQRyRrmg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p><span leaf="">这些新闻无一例外都只是在散发焦虑</span></p><p><span leaf=""><span textstyle="" style="font-weight: bold;">并且没有一丝技术分析</span></span></p><div><p><span leaf="">事实真的如此吗? 如果是,这会给我们什么启示? 如果不是,微软最有可能装后门的地方在哪? 让我们从技术角度详细分析.而不是被新闻焦虑冲跨</span></p><p><span leaf=""><span textstyle="" style="font-size: 24px;">根源问题</span></span></p><p style="box-sizing: border-box;margin-top: 0px;margin-bottom: 1rem;color: rgb(33, 37, 41);font-family: &#34;Open Sans&#34;, Helvetica, Arial, sans-serif;font-size: 16px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><font dir="auto" style="box-sizing: border-box;vertical-align: inherit;"><font dir="auto" style="box-sizing: border-box;vertical-align: inherit;"><span leaf="">这一切的根源是,在Windows中,默认浏览器保存在以下注册表项中：</span></font></font></p><p style="text-align: center;" nodeleaf=""><img data-imgfileid="100001757" class="rich_pages wxw-img" data-ratio="0.5444444444444444" data-s="300,640" data-type="png" data-w="1080" type="block" src="https://wechat2rss.xlab.app/img-proxy/?k=f35354af&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLfPpNmeHIcKbjbmU2RFoZbgxHW6c0FuHx1aRjuQgsBX0RwtSNTBg4UaJTN7Pqvibq3ebTLicbaMhOQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="box-sizing: border-box;margin-top: 0px;margin-bottom: 1rem;color: rgb(33, 37, 41);font-family: &#34;Open Sans&#34;, Helvetica, Arial, sans-serif;font-size: 16px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><font dir="auto" style="box-sizing: border-box;vertical-align: inherit;"><font dir="auto" style="box-sizing: border-box;vertical-align: inherit;"><span leaf="">设置默认浏览器就像设置这些键的值一样简单——相对来说比较直观。然而，某些厂商经常滥用这一功能，在未经用户同意甚至未经用户交互的情况下，将默认浏览器劫持为自己的产品。</span></font></font></p><p style="box-sizing: border-box;margin-top: 0px;margin-bottom: 1rem;color: rgb(33, 37, 41);font-family: &#34;Open Sans&#34;, Helvetica, Arial, sans-serif;font-size: 16px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><font dir="auto" style="box-sizing: border-box;vertical-align: inherit;"><font dir="auto" style="box-sizing: border-box;vertical-align: inherit;"><span leaf="">为了解决这个问题，Windows 引入了一个</span></font></font><code style="box-sizing: border-box;font-family: &#34;Roboto Mono&#34;, Menlo, Consolas, &#34;Liberation Mono&#34;, monospace;font-size: 14px;color: rgb(108, 117, 125);word-break: break-word;"><span leaf="">Hash</span></code><font dir="auto" style="box-sizing: border-box;vertical-align: inherit;"><font dir="auto" style="box-sizing: border-box;vertical-align: inherit;"><span leaf="">子键，其中包含所选默认浏览器的哈希值。只有哈希值正确时，才会遵循默认浏览器设置。该哈希算法是专有的，只有在使用 Windows 的“设置”对话框进行设置时才能正确计算。它还包含当前计算机的熵，因此无法预先计算。</span></font></font></p><p style="text-align: center;" nodeleaf=""><img data-imgfileid="100001759" class="rich_pages wxw-img" data-ratio="0.39451114922813035" data-s="300,640" data-type="png" data-w="583" type="block" src="https://wechat2rss.xlab.app/img-proxy/?k=bb8bc3a0&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLfPpNmeHIcKbjbmU2RFoZbNlO7YQJIpSxnEGJAcF3EgicbogRtdRWreWCHrpylTKKg04EUbpJZCEA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="box-sizing: border-box;margin-top: 0px;margin-bottom: 1rem;color: rgb(33, 37, 41);font-family: &#34;Open Sans&#34;, Helvetica, Arial, sans-serif;font-size: 16px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><font dir="auto" style="box-sizing: border-box;vertical-align: inherit;"><font dir="auto" style="box-sizing: border-box;vertical-align: inherit;"><font dir="auto" style="box-sizing: border-box;color: rgb(33, 37, 41);font-family: &#34;Open Sans&#34;, Helvetica, Arial, sans-serif;font-size: 16px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;vertical-align: inherit;" data-pm-slice="0 0 []"><font dir="auto" style="box-sizing: border-box;vertical-align: inherit;"><span leaf="">当然，这个哈希值的秘密不会持续太久。2017年，Christoph Kolbicz 逆向工程了该哈希算法，并将其部署到他的 </span></font></font><font dir="auto" style="box-sizing: border-box;vertical-align: inherit;"><font dir="auto" style="box-sizing: border-box;vertical-align: inherit;"><span leaf="">SetUserFTA</span></font></font><font dir="auto" style="box-sizing: border-box;color: rgb(33, 37, 41);font-family: &#34;Open Sans&#34;, Helvetica, Arial, sans-serif;font-size: 16px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;vertical-align: inherit;"><font dir="auto" style="box-sizing: border-box;vertical-align: inherit;"><span leaf=""> 工具中，这是一个命令行实用程序，可以设置文件类型关联或默认浏览器。2021年，Mozilla 也允许 </span></font></font><font dir="auto" style="box-sizing: border-box;vertical-align: inherit;"><font dir="auto" style="box-sizing: border-box;vertical-align: inherit;"><span leaf="">Firefox</span></font></font><font dir="auto" style="box-sizing: border-box;color: rgb(33, 37, 41);font-family: &#34;Open Sans&#34;, Helvetica, Arial, sans-serif;font-size: 16px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;vertical-align: inherit;"><font dir="auto" style="box-sizing: border-box;vertical-align: inherit;"><span leaf="">直接将自身设置为默认浏览器。</span></font></font></font></font></p><p style="box-sizing: border-box;margin-top: 0px;margin-bottom: 1rem;color: rgb(33, 37, 41);font-family: &#34;Open Sans&#34;, Helvetica, Arial, sans-serif;font-size: 16px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><font dir="auto" style="box-sizing: border-box;vertical-align: inherit;"><font dir="auto" style="box-sizing: border-box;vertical-align: inherit;"><span leaf="">微软于 2024 年 3 月推出 UCPD 驱动程序，以应对其哈希算法的“破解”。UCPD 代表用户选择保护驱动程序，它是一种过滤驱动程序，用于保护存储默认浏览器设置（以及类似内容，例如默认 PDF 阅读器）的注册表项</span></font></font></p><p style="box-sizing: border-box;margin-top: 0px;margin-bottom: 1rem;color: rgb(33, 37, 41);font-family: &#34;Open Sans&#34;, Helvetica, Arial, sans-serif;font-size: 16px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><font dir="auto" style="box-sizing: border-box;vertical-align: inherit;"><font dir="auto" style="box-sizing: border-box;vertical-align: inherit;"><span leaf=""><span textstyle="" style="font-size: 24px;">驱动逆向</span></span></font></font></p><p style="box-sizing: border-box;margin-top: 0px;margin-bottom: 1rem;color: rgb(33, 37, 41);font-family: &#34;Open Sans&#34;, Helvetica, Arial, sans-serif;font-size: 16px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><font dir="auto" style="box-sizing: border-box;vertical-align: inherit;"><font dir="auto" style="box-sizing: border-box;vertical-align: inherit;"><span leaf=""><span textstyle="" style="font-size: 17px;">通过bn+MCP,我们很快的就完成了对我目前系统上的UCPD驱动逆向:</span></span></font></font></p><p style="box-sizing: border-box;margin-top: 0px;margin-bottom: 1rem;color: rgb(33, 37, 41);font-family: &#34;Open Sans&#34;, Helvetica, Arial, sans-serif;font-size: 16px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><font dir="auto" style="box-sizing: border-box;vertical-align: inherit;"><font dir="auto" style="box-sizing: border-box;vertical-align: inherit;"><span leaf=""><span textstyle="" style="font-size: 17px;">这个驱动的核心逻辑之一是注册了一个注册表回调,监控windows的注册表操作</span></span></font></font></p><p style="text-align: center;" nodeleaf=""><img data-imgfileid="100001760" class="rich_pages wxw-img" data-ratio="0.45" data-s="300,640" data-type="png" data-w="1080" type="block" src="https://wechat2rss.xlab.app/img-proxy/?k=35f61bfe&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLfPpNmeHIcKbjbmU2RFoZb8rvEXQgBZl0joFjxtic1NkWLGyeRmteU7JbO0N0nPeMia6kRf1ZdPicOQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="box-sizing: border-box;margin-top: 0px;margin-bottom: 1rem;color: rgb(33, 37, 41);font-family: &#34;Open Sans&#34;, Helvetica, Arial, sans-serif;font-size: 16px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><font dir="auto" style="box-sizing: border-box;vertical-align: inherit;"><font dir="auto" style="box-sizing: border-box;vertical-align: inherit;"><span leaf=""><span textstyle="" style="font-size: 17px;">可以看到,会监控读写删除</span></span></font></font></p><p style="text-align: center;" nodeleaf=""><img data-imgfileid="100001761" class="rich_pages wxw-img" data-ratio="0.7028360049321825" data-s="300,640" data-type="png" data-w="811" type="block" src="https://wechat2rss.xlab.app/img-proxy/?k=dc408e60&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLfPpNmeHIcKbjbmU2RFoZb9P3Caj6JyO0iaubALicMu5ko9MJEHzQAPdvfaLpHCd85e2dzYMKoSb1w%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="box-sizing: border-box;margin-top: 0px;margin-bottom: 1rem;color: rgb(33, 37, 41);font-family: &#34;Open Sans&#34;, Helvetica, Arial, sans-serif;font-size: 16px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><font dir="auto" style="box-sizing: border-box;vertical-align: inherit;"><font dir="auto" style="box-sizing: border-box;vertical-align: inherit;"></font></font></p><p><span leaf="">而这几个回调,其实都在干一件事:</span></p><p style="text-align: center;" nodeleaf=""><img data-imgfileid="100001762" class="rich_pages wxw-img" data-ratio="0.8700564971751412" data-s="300,640" data-type="png" data-w="885" type="block" src="https://wechat2rss.xlab.app/img-proxy/?k=946071ea&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLfPpNmeHIcKbjbmU2RFoZbtdy1nSdVjXQMlmMpic7mPsDkAzIhZPAWn1FFbZy96VC9ic9S1GtiaxWYw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p><span leaf="">在一个全局的保护列表里面,匹配注册表是否是被保护的对象</span></p><p><span leaf="">而这个列表是在函数</span><span leaf="">sub_1C0018310也就是驱动初始化的时候初始化的:</span></p><p style="text-align: center;" nodeleaf=""><img data-imgfileid="100001763" class="rich_pages wxw-img" data-ratio="0.637962962962963" data-s="300,640" data-type="png" data-w="1080" type="block" src="https://wechat2rss.xlab.app/img-proxy/?k=7bb7af36&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLfPpNmeHIcKbjbmU2RFoZbPf8dFa9oFSPemDhpbNTSoy7LArB5lEoKFq0gTnsExCtXypmQyMDftA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p><span leaf="">列表内容包括:</span></p><p><span leaf="">默认浏览器:</span></p><p><span leaf="">Software\\Microsoft\\Windows\\Shell\\Associations\\UrlAssociations\\http\\UserChoice</span></p><p><span leaf="">默认html文件打开方式:</span></p><p><span leaf="">Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.html\\UserChoice</span></p><p style="box-sizing: border-box;margin-top: 0px;margin-bottom: 1rem;color: rgb(33, 37, 41);font-family: &#34;Open Sans&#34;, Helvetica, Arial, sans-serif;font-size: 16px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf="">默认pdf打开方式(额...不知道为什么):</span></p><p><span leaf="">Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.pdf\\UserChoice</span></p><p><span leaf="">系统安装时候的设备时区</span><span leaf="" data-pm-slice="1 1 [&#34;para&#34;,null,&#34;para&#34;,{&#34;tagName&#34;:&#34;p&#34;,&#34;attributes&#34;:{&#34;style&#34;:&#34;box-sizing: border-box; margin-top: 0px; margin-bottom: 1rem; color: rgb(33, 37, 41); font-family: \&#34;Open Sans\&#34;, Helvetica, Arial, sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; 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;&#34;,&#34;data-pm-slice&#34;:&#34;0 0 []&#34;},&#34;namespaceURI&#34;:&#34;http://www.w3.org/1999/xhtml&#34;}]">:</span></p><p><span leaf="">SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Control Panel\\DeviceRegion</span></p><p><span leaf="">虽然不知道为什么,但是</span><span leaf="" data-pm-slice="1 1 [&#34;para&#34;,null,&#34;para&#34;,{&#34;tagName&#34;:&#34;p&#34;,&#34;attributes&#34;:{},&#34;namespaceURI&#34;:&#34;http://www.w3.org/1999/xhtml&#34;}]">这一块linux.do里面也说了</span></p><p style="text-align: center;" nodeleaf=""><img data-imgfileid="100001764" class="rich_pages wxw-img" data-ratio="0.8972222222222223" data-s="300,640" data-type="png" data-w="1080" type="block" src="https://wechat2rss.xlab.app/img-proxy/?k=d0bde3b2&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLfPpNmeHIcKbjbmU2RFoZbDIKkyu9OwBlgaKKqoibBh5x4ngIoDv10OzSxRbEVM5dH7kdUKSW3C3g%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="box-sizing: border-box;margin-top: 0px;margin-bottom: 1rem;color: rgb(33, 37, 41);font-family: &#34;Open Sans&#34;, Helvetica, Arial, sans-serif;font-size: 16px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf="">一些office文件的关联方式</span></p><p style="text-align: center;" nodeleaf=""><img class="rich_pages wxw-img" data-imgfileid="100001765" data-ratio="0.43732327992459946" data-s="300,640" type="block" data-type="png" data-w="1061" src="https://wechat2rss.xlab.app/img-proxy/?k=ee9f5170&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLfPpNmeHIcKbjbmU2RFoZbC75BK7r7YtIlgxOfyxI9Lvp07oOIQbRzZboicss0ej0UR69bIv2oIFA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="box-sizing: border-box;margin-top: 0px;margin-bottom: 1rem;color: rgb(33, 37, 41);font-family: &#34;Open Sans&#34;, Helvetica, Arial, sans-serif;font-size: 16px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf="">一些explorer的组件</span></p><p style="text-align: center;" nodeleaf=""><img class="rich_pages wxw-img" data-imgfileid="100001766" data-ratio="0.8884711779448622" data-s="300,640" type="block" data-type="png" data-w="798" src="https://wechat2rss.xlab.app/img-proxy/?k=5bf8cc9a&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLfPpNmeHIcKbjbmU2RFoZbYNWutGKVnBnK7xibBCEUwhD3hDT1XnqsbkpUboenS4AWm6YL8T6w4Iw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="box-sizing: border-box;margin-top: 0px;margin-bottom: 1rem;color: rgb(33, 37, 41);font-family: &#34;Open Sans&#34;, Helvetica, Arial, sans-serif;font-size: 16px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf="">一旦匹配中了这些保护列表,会看保护的类型,保护类型有几个，这里AI搞错了,我觉得这个应该叫做&#34;策略&#34;,而不是保护类型</span></p><p style="text-align: center;" nodeleaf=""><img class="rich_pages wxw-img" data-imgfileid="100001767" data-ratio="1.0342555994729907" data-s="300,640" type="block" data-type="png" data-w="759" src="https://wechat2rss.xlab.app/img-proxy/?k=8bc44ed4&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLfPpNmeHIcKbjbmU2RFoZbicIx4Yt6ChakDa0Tgiciabj9icEwm9juZutwibONdxpTMnibjrEUXIsAOJNg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="box-sizing: border-box;margin-top: 0px;margin-bottom: 1rem;color: rgb(33, 37, 41);font-family: &#34;Open Sans&#34;, Helvetica, Arial, sans-serif;font-size: 16px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf="">我们以默认浏览器为例子,他的默认级别是1</span></p><p style="text-align: center;" nodeleaf=""><img class="rich_pages wxw-img" data-imgfileid="100001768" data-ratio="0.43425925925925923" data-s="300,640" type="block" data-type="png" data-w="1080" src="https://wechat2rss.xlab.app/img-proxy/?k=135e5fda&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLfPpNmeHIcKbjbmU2RFoZbJdZHXiaEm5JlKibSV9LvoFia8fZzSGXO9PmicEn32q3ib5hicjpIZr5QjeRQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="box-sizing: border-box;margin-top: 0px;margin-bottom: 1rem;color: rgb(33, 37, 41);font-family: &#34;Open Sans&#34;, Helvetica, Arial, sans-serif;font-size: 16px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf="">我们先看策略1:</span></p><p style="text-align: center;" nodeleaf=""><img data-imgfileid="100001771" class="rich_pages wxw-img" data-ratio="0.6140845070422535" data-s="300,640" data-type="png" data-w="710" type="block" src="https://wechat2rss.xlab.app/img-proxy/?k=09954aaa&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLfPpNmeHIcKbjbmU2RFoZbqw1bHWgUcTjXwDjaic3o4QibkARmhCo1ID1rt5m8xiaVrDqXbfaF7riahg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="box-sizing: border-box;margin-top: 0px;margin-bottom: 1rem;color: rgb(33, 37, 41);font-family: &#34;Open Sans&#34;, Helvetica, Arial, sans-serif;font-size: 16px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf="">策略1会先检查是否是可信进程,检查方式是</span></p><p style="box-sizing: border-box;margin-top: 0px;margin-bottom: 1rem;color: rgb(33, 37, 41);font-family: &#34;Open Sans&#34;, Helvetica, Arial, sans-serif;font-size: 16px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf="">是否是微软签名</span></p><p style="box-sizing: border-box;margin-top: 0px;margin-bottom: 1rem;color: rgb(33, 37, 41);font-family: &#34;Open Sans&#34;, Helvetica, Arial, sans-serif;font-size: 16px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span style="color: rgb(33, 37, 41);font-family: &#34;Open Sans&#34;, Helvetica, Arial, sans-serif;font-size: 16px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;display: inline !important;float: none;" data-pm-slice="0 0 []"><span leaf="">可执行文件在不在单里面</span></span></p><p style="text-align: center;" nodeleaf=""><img class="rich_pages wxw-img" data-imgfileid="100001772" data-ratio="0.6798839458413927" data-s="300,640" type="block" data-type="png" data-w="1034" src="https://wechat2rss.xlab.app/img-proxy/?k=a9e84c20&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLfPpNmeHIcKbjbmU2RFoZbuTOhxSGD2uV6Xfagjmo06Ol7ibIglJKiaJG4FoQdiaPkWj501VZ3XMIXw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="box-sizing: border-box;margin-top: 0px;margin-bottom: 1rem;color: rgb(33, 37, 41);font-family: &#34;Open Sans&#34;, Helvetica, Arial, sans-serif;font-size: 16px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span style="color: rgb(33, 37, 41);font-family: &#34;Open Sans&#34;, Helvetica, Arial, sans-serif;font-size: 16px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;display: inline !important;float: none;" data-pm-slice="0 0 []"><span leaf="">其中微软签名是通过</span><span leaf="" data-pm-slice="1 1 [&#34;para&#34;,null,&#34;para&#34;,{&#34;tagName&#34;:&#34;p&#34;,&#34;attributes&#34;:{&#34;style&#34;:&#34;box-sizing: border-box; margin-top: 0px; margin-bottom: 1rem; color: rgb(33, 37, 41); font-family: \&#34;Open Sans\&#34;, Helvetica, Arial, sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; 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;&#34;,&#34;data-pm-slice&#34;:&#34;0 0 []&#34;},&#34;namespaceURI&#34;:&#34;http://www.w3.org/1999/xhtml&#34;}]">内核CI.dll做签名校验</span></span></p><p style="text-align: center;" nodeleaf=""><img class="rich_pages wxw-img" data-imgfileid="100001773" data-ratio="0.46745562130177515" data-s="300,640" type="block" data-type="png" data-w="845" src="https://wechat2rss.xlab.app/img-proxy/?k=cdb3b9a5&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLfPpNmeHIcKbjbmU2RFoZbY9uGE4IefG6W9Ma9XBqJl1PsSBHBPwvAfBTibsjzhQrE3mEQ3AIVAkA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="box-sizing: border-box;margin-top: 0px;margin-bottom: 1rem;color: rgb(33, 37, 41);font-family: &#34;Open Sans&#34;, Helvetica, Arial, sans-serif;font-size: 16px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span style="color: rgb(33, 37, 41);font-family: &#34;Open Sans&#34;, Helvetica, Arial, sans-serif;font-size: 16px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;display: inline !important;float: none;" data-pm-slice="0 0 []"><span leaf="" data-pm-slice="1 1 [&#34;para&#34;,null,&#34;para&#34;,{&#34;tagName&#34;:&#34;p&#34;,&#34;attributes&#34;:{&#34;style&#34;:&#34;box-sizing: border-box; margin-top: 0px; margin-bottom: 1rem; color: rgb(33, 37, 41); font-family: \&#34;Open Sans\&#34;, Helvetica, Arial, sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; 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;&#34;,&#34;data-pm-slice&#34;:&#34;0 0 []&#34;},&#34;namespaceURI&#34;:&#34;http://www.w3.org/1999/xhtml&#34;}]">列表如下:</span></span></p><p style="text-align: center;" nodeleaf=""><img class="rich_pages wxw-img" data-imgfileid="100001776" data-ratio="0.43846153846153846" data-s="300,640" type="block" data-type="png" data-w="1040" src="https://wechat2rss.xlab.app/img-proxy/?k=3d0b2fdc&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLfPpNmeHIcKbjbmU2RFoZbPwQRx0g7eViaxFrllzsDnLjicuINOlG0vKbeV0McWP5QicDOicoRfpKIsA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="box-sizing: border-box;margin-top: 0px;margin-bottom: 1rem;color: rgb(33, 37, 41);font-family: &#34;Open Sans&#34;, Helvetica, Arial, sans-serif;font-size: 16px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf="">其中让我们记住这个</span><span style="color: rgb(108, 117, 125);font-family: &#34;Roboto Mono&#34;, Menlo, Consolas, &#34;Liberation Mono&#34;, monospace;font-size: 14px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;display: inline !important;float: none;" data-pm-slice="0 0 []"><span leaf=""><span textstyle="" style="font-weight: bold;">explorer.exe 因为这个是伏笔.jpg</span></span></span></p><p style="box-sizing: border-box;margin-top: 0px;margin-bottom: 1rem;color: rgb(33, 37, 41);font-family: &#34;Open Sans&#34;, Helvetica, Arial, sans-serif;font-size: 16px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf="">现在我们搞清楚了目前的UCPD的驱动逻辑,他非常简单,不在白名单里面的进程,禁止修改这些注册表,也就是回调返回错误</span></p><p style="text-align: center;" nodeleaf=""><img class="rich_pages wxw-img" data-imgfileid="100001777" data-ratio="0.4194470924690181" data-s="300,640" type="block" data-type="png" data-w="1049" src="https://wechat2rss.xlab.app/img-proxy/?k=00fd1749&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLfPpNmeHIcKbjbmU2RFoZbQsGpic2SiazIYYQngueNrliam1uI9iaeUIZcZfYqlzNicfIWicJ7Y1kbQYwg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="box-sizing: border-box;margin-top: 0px;margin-bottom: 1rem;color: rgb(33, 37, 41);font-family: &#34;Open Sans&#34;, Helvetica, Arial, sans-serif;font-size: 16px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf="">并且同时发一份ETW记录</span></p><p style="text-align: center;" nodeleaf=""><img class="rich_pages wxw-img" data-imgfileid="100001778" data-ratio="0.9839108910891089" data-s="300,640" type="block" data-type="png" data-w="808" src="https://wechat2rss.xlab.app/img-proxy/?k=ad04ab86&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLfPpNmeHIcKbjbmU2RFoZbQfJodM7iczrJIz70Yy5dG8vJPCunSQibDlfuxiaeVQR4RbTLXWuMqK6IA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="box-sizing: border-box;margin-top: 0px;margin-bottom: 1rem;color: rgb(33, 37, 41);font-family: &#34;Open Sans&#34;, Helvetica, Arial, sans-serif;font-size: 16px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf="">并且在阻止后,还会做一次栈回溯然后发ETW,这可以理解,毕竟需要一些信息去判断什么代码触发链.(比如检查某些未知的流氓软件在篡改主页)</span></p><p style="text-align: center;" nodeleaf=""><img class="rich_pages wxw-img" data-imgfileid="100001784" data-ratio="0.5786516853932584" data-s="300,640" type="block" data-type="png" data-w="890" src="https://wechat2rss.xlab.app/img-proxy/?k=886b9899&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLfPpNmeHIcKbjbmU2RFoZbzITNSCul2pYj0kSdZvC3WG2lTwOls7kpm4SdFicWXeCGxLPBZ01GA2A%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="box-sizing: border-box;margin-top: 0px;margin-bottom: 1rem;color: rgb(33, 37, 41);font-family: &#34;Open Sans&#34;, Helvetica, Arial, sans-serif;font-size: 16px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf=""><span textstyle="" style="font-size: 24px;">结束了?</span></span></p><p style="box-sizing: border-box;margin-top: 0px;margin-bottom: 1rem;color: rgb(33, 37, 41);font-family: &#34;Open Sans&#34;, Helvetica, Arial, sans-serif;font-size: 16px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf=""><span textstyle="" style="font-size: 17px;">你以为到这里就结束了？ 没有,还有高手!</span></span></p><p style="box-sizing: border-box;margin-top: 0px;margin-bottom: 1rem;color: rgb(33, 37, 41);font-family: &#34;Open Sans&#34;, Helvetica, Arial, sans-serif;font-size: 16px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf="">UCPD这个驱动还创建了一个进程创建回调和一个object打开回调</span></p><p style="text-align: center;" nodeleaf=""><img class="rich_pages wxw-img" data-imgfileid="100001779" data-ratio="0.5194444444444445" data-s="300,640" type="block" data-type="png" data-w="1080" src="https://wechat2rss.xlab.app/img-proxy/?k=792b1d7c&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLfPpNmeHIcKbjbmU2RFoZbPhtFCGMoJ0vpyqBMZGdwKvdxx6qX6tA8um7hOJiczLfS4DZKBXgTm4Q%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="box-sizing: border-box;margin-top: 0px;margin-bottom: 1rem;color: rgb(33, 37, 41);font-family: &#34;Open Sans&#34;, Helvetica, Arial, sans-serif;font-size: 16px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf="">在进程创建的时候,会检查是否是这些进程名字或者签名,我把这个函数叫做</span><span leaf="">IsStringInChinaBlackList,里面包含了一些不能在这个公众号出现的国产软件:</span></p><p style="text-align: center;" nodeleaf=""><img class="rich_pages wxw-img" data-imgfileid="100001793" data-s="300,640" type="block" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=fb3c24af&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLfPpNmeHIcKbjbmU2RFoZbib72jgoDe51P78VaJU40SkpCaBPStIY5pH4Rib7ZghYHia9cj9sMDH4vA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="box-sizing: border-box;margin-top: 0px;margin-bottom: 1rem;color: rgb(33, 37, 41);font-family: &#34;Open Sans&#34;, Helvetica, Arial, sans-serif;font-size: 16px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf="">如果是,在object回调,也就是openprocess的时候,会判断是不是这些进程,如果是,则去掉部分权限,并且发ETW记录</span></p><p><span leaf="">  被移除的权限位：</span></p><p><span leaf="">  - 0x10: 可能是 PROCESS_VM_WRITE (写入进程内存)</span></p><p><span leaf="">  - 0x28: 可能是 PROCESS_TERMINATE + 其他权限</span></p><p style="text-align: center;" nodeleaf=""><img class="rich_pages wxw-img" data-imgfileid="100001781" data-ratio="0.43374642516682554" data-s="300,640" type="block" data-type="png" data-w="1049" src="https://wechat2rss.xlab.app/img-proxy/?k=8efea079&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLfPpNmeHIcKbjbmU2RFoZbVR29AtsKfgHYIAyf7sGBibg7hNaQQFvibqPWUpbWyynwNvU55UElq84Q%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="box-sizing: border-box;margin-top: 0px;margin-bottom: 1rem;color: rgb(33, 37, 41);font-family: &#34;Open Sans&#34;, Helvetica, Arial, sans-serif;font-size: 16px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf="">根据</span><span leaf="">xusheng的介绍</span></p><p style="text-align: center;" nodeleaf=""><img class="rich_pages wxw-img" data-imgfileid="100001792" data-s="300,640" type="block" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=ac86b13b&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLfPpNmeHIcKbjbmU2RFoZbQOQibNAQRUFfxhsM6nGPnTVd31Ie3LyyzPZPXT2OiboZX5bAJlFfjgPA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><blockquote class="js_blockquote_wrap"><div class="js_blockquote_digest"><p><span leaf="">现在应该很容易看出其意图——它阻止 ****.exe/******.exe/********.exe....将代码注入 explorer.exe/msedge.exe！UCPD 为什么要这么做？唯一的解释是，<span textstyle="" style="font-weight: bold;">他们试图通过向 explorer.exe/msedge.exe 注入代码来绕过 UCPD</span>，因为这两者都可以修改默认浏览器的注册表项。微软不喜欢这个主意，所以它直接封禁了违规者，从而加强了防护！</span></p></div><p class="blockquote_info js_blockquote_source" data-json="%7B%22type%22%3A%22out%22%2C%22article%22%3A%7B%7D%2C%22from%22%3A%22https%3A%2F%2Fbinary.ninja%2F2025%2F03%2F25%2Fdefault-browser-upcd.html%22%7D"><span class="blockquote_other"><a href="https://binary.ninja/2025/03/25/default-browser-upcd.html" target="_blank">https://binary.ninja/2025/03/25/default-browser-upcd.html</a></span></p></blockquote><p style="text-align: center;" nodeleaf=""><img class="rich_pages wxw-img" data-imgfileid="100001783" data-ratio="1" data-s="300,640" type="block" data-type="jpeg" data-w="300" src="https://wechat2rss.xlab.app/img-proxy/?k=c62194f2&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FejibWMxI7nWLfPpNmeHIcKbjbmU2RFoZbnQydtBxNicxzobuAuCSrmoYPwVsdQ79xfjvrV1ddeu9GoRcaHTPMCMw%2F640%3Fwx_fmt%3Djpeg%26from%3Dappmsg"/></p><p style="box-sizing: border-box;margin-top: 0px;margin-bottom: 1rem;color: rgb(33, 37, 41);font-family: &#34;Open Sans&#34;, Helvetica, Arial, sans-serif;font-size: 16px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf=""><span textstyle="" style="font-size: 24px;">微软如何真的投递后门</span></span></p><p style="box-sizing: border-box;margin-top: 0px;margin-bottom: 1rem;color: rgb(33, 37, 41);font-family: &#34;Open Sans&#34;, Helvetica, Arial, sans-serif;font-size: 16px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf=""><span textstyle="" style="font-size: 16px;">我们假设,发生了ww3,微软把windows武器化了,那么作为微软,如何提前埋好后门呢?</span></span></p><p style="box-sizing: border-box;margin-top: 0px;margin-bottom: 1rem;color: rgb(33, 37, 41);font-family: &#34;Open Sans&#34;, Helvetica, Arial, sans-serif;font-size: 16px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf=""><span textstyle="" style="font-size: 16px;font-weight: normal;">首先,微软不需要后门,他的windows update就是最大的后门,哪天推一个一键锁机补丁都有可能,不过windows update补丁被全球的安全从业人员审计着,至少在没到WW3的时候,哪怕有小规模冲突,都是不太可能投递的.(我甚至是怀疑WW3的时候大家是不是都已经没有网络了)</span></span></p><p style="box-sizing: border-box;margin-top: 0px;margin-bottom: 1rem;color: rgb(33, 37, 41);font-family: &#34;Open Sans&#34;, Helvetica, Arial, sans-serif;font-size: 16px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf=""><span textstyle="" style="font-size: 16px;">其次,如果微软真的需要&#34;偷&#34;资料,他只需要走windows defender就行了,windows defender会&#34;上传可疑文件&#34;但是这个文件怎么定义可疑,是他们说的算.保不准&#34;觉得&#34;你的文档带了中文可疑.</span></span><span leaf="" data-pm-slice="1 1 [&#34;para&#34;,null,&#34;para&#34;,{&#34;tagName&#34;:&#34;p&#34;,&#34;attributes&#34;:{&#34;style&#34;:&#34;box-sizing: border-box; margin-top: 0px; margin-bottom: 1rem; color: rgb(33, 37, 41); font-family: \&#34;Open Sans\&#34;, Helvetica, Arial, sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; 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;&#34;,&#34;data-pm-slice&#34;:&#34;0 0 []&#34;},&#34;namespaceURI&#34;:&#34;http://www.w3.org/1999/xhtml&#34;}]"><span textstyle="" style="font-size: 16px;">但是这里只是我瞎说的,没实际证据,原因很简单,defender的代码也是被全球各地的安全人员审计着,所以如果直接来一套后门，应该不超过一个星期就被发现了.</span></span></p><p style="box-sizing: border-box;margin-top: 0px;margin-bottom: 1rem;color: rgb(33, 37, 41);font-family: &#34;Open Sans&#34;, Helvetica, Arial, sans-serif;font-size: 16px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf="" data-pm-slice="1 1 [&#34;para&#34;,null,&#34;para&#34;,{&#34;tagName&#34;:&#34;p&#34;,&#34;attributes&#34;:{&#34;style&#34;:&#34;box-sizing: border-box; margin-top: 0px; margin-bottom: 1rem; color: rgb(33, 37, 41); font-family: \&#34;Open Sans\&#34;, Helvetica, Arial, sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; 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;&#34;,&#34;data-pm-slice&#34;:&#34;0 0 []&#34;},&#34;namespaceURI&#34;:&#34;http://www.w3.org/1999/xhtml&#34;}]"><span textstyle="" style="font-size: 16px;font-weight: bold;">所以这就带来一个问题,如果是常规后门,在没做代码加密的情况下,最多一个月就会被全球安全从业人员分析出来,代码加密了,说明那一块更可疑,只会吸引更强的大哥来分析,最终变成会议ppt,比如windows的战鸟:</span></span></p><p style="text-align: center;" nodeleaf=""><img class="rich_pages wxw-img" data-imgfileid="100001789" data-ratio="0.176" data-s="300,640" type="block" data-type="png" data-w="875" src="https://wechat2rss.xlab.app/img-proxy/?k=81a2e45c&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLfPpNmeHIcKbjbmU2RFoZbRSw9Yfk7LfQZMA4bSWTV3NaDiaQ0OsboDicS2uicQGEfFwLo358G41QGA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="box-sizing: border-box;margin-top: 0px;margin-bottom: 1rem;color: rgb(33, 37, 41);font-family: &#34;Open Sans&#34;, Helvetica, Arial, sans-serif;font-size: 16px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf="" data-pm-slice="1 1 [&#34;para&#34;,null,&#34;para&#34;,{&#34;tagName&#34;:&#34;p&#34;,&#34;attributes&#34;:{&#34;style&#34;:&#34;box-sizing: border-box; margin-top: 0px; margin-bottom: 1rem; color: rgb(33, 37, 41); font-family: \&#34;Open Sans\&#34;, Helvetica, Arial, sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; 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;&#34;,&#34;data-pm-slice&#34;:&#34;0 0 []&#34;},&#34;namespaceURI&#34;:&#34;http://www.w3.org/1999/xhtml&#34;}]"><a class="normal_text_link" target="_blank" style="" href="https://mp.weixin.qq.com/s?__biz=MzkyOTc0NDY2Nw==&amp;mid=2247483805&amp;idx=1&amp;sn=26361efa46a7861dbde365a0f975c6a6&amp;scene=21#wechat_redirect" textvalue="微软的代码虚拟机&#34;战斗之鸟&#34;(warbird)深度研究与逆向 #1" data-itemshowtype="0" linktype="text" data-linktype="2">微软的代码虚拟机&#34;战斗之鸟&#34;(warbird)深度研究与逆向 #1</a></span></p><p style="box-sizing: border-box;margin-top: 0px;margin-bottom: 1rem;color: rgb(33, 37, 41);font-family: &#34;Open Sans&#34;, Helvetica, Arial, sans-serif;font-size: 16px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf="" data-pm-slice="1 1 [&#34;para&#34;,null,&#34;para&#34;,{&#34;tagName&#34;:&#34;p&#34;,&#34;attributes&#34;:{&#34;style&#34;:&#34;box-sizing: border-box; margin-top: 0px; margin-bottom: 1rem; color: rgb(33, 37, 41); font-family: \&#34;Open Sans\&#34;, Helvetica, Arial, sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; 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;&#34;,&#34;data-pm-slice&#34;:&#34;0 0 []&#34;},&#34;namespaceURI&#34;:&#34;http://www.w3.org/1999/xhtml&#34;}]"><a class="normal_text_link" target="_blank" style="" href="https://mp.weixin.qq.com/s?__biz=MzkyOTc0NDY2Nw==&amp;mid=2247483818&amp;idx=1&amp;sn=570acc97ae612a97755a1795f4c60d00&amp;scene=21#wechat_redirect" textvalue="微软的代码虚拟机&#34;战斗之鸟&#34;(warbird)深度研究与逆向 #2" data-itemshowtype="0" linktype="text" data-linktype="2">微软的代码虚拟机&#34;战斗之鸟&#34;(warbird)深度研究与逆向 #2</a></span></p><p style="box-sizing: border-box;margin-top: 0px;margin-bottom: 1rem;color: rgb(33, 37, 41);font-family: &#34;Open Sans&#34;, Helvetica, Arial, sans-serif;font-size: 16px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf=""><span textstyle="" style="font-size: 16px;">有没有更隐蔽的后门呢? 隐蔽到我们常规安全人员无法分析的?</span></span></p><p style="box-sizing: border-box;margin-top: 0px;margin-bottom: 1rem;color: rgb(33, 37, 41);font-family: &#34;Open Sans&#34;, Helvetica, Arial, sans-serif;font-size: 16px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf=""><span textstyle="" style="font-size: 16px;">有的,那就是密码学.</span></span></p><p style="box-sizing: border-box;margin-top: 0px;margin-bottom: 1rem;color: rgb(33, 37, 41);font-family: &#34;Open Sans&#34;, Helvetica, Arial, sans-serif;font-size: 16px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf=""><span textstyle="" style="font-size: 16px;">比如在我审计XP的代码的时候:</span></span></p><p style="text-align: center;" nodeleaf=""><img class="rich_pages wxw-img" data-imgfileid="100001785" data-ratio="0.9184100418410042" data-s="300,640" type="block" data-type="png" data-w="956" src="https://wechat2rss.xlab.app/img-proxy/?k=6ee50fb4&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLfPpNmeHIcKbjbmU2RFoZb8QC1YO28IddcDDhaCC33AQNyOh8zbGpfxRIGcVkM7ia3N4XNTeTcRibQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="text-align: center;" nodeleaf=""><img data-imgfileid="100001786" class="rich_pages wxw-img" data-ratio="0.5739957716701902" data-s="300,640" data-type="png" data-w="946" type="block" src="https://wechat2rss.xlab.app/img-proxy/?k=462cd87c&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLfPpNmeHIcKbjbmU2RFoZbFa4b81TPcoJNSJPuJEfQfgpukZ0rwx4JJY1g5xLWrXJ10Q0vIRMllw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="text-align: center;" nodeleaf=""><img class="rich_pages wxw-img" data-imgfileid="100001787" data-ratio="0.9178498985801217" data-s="300,640" type="block" data-type="png" data-w="986" src="https://wechat2rss.xlab.app/img-proxy/?k=c8b4799a&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLfPpNmeHIcKbjbmU2RFoZb5DlkaHLtt7zL7FicUhdSUiabHy3E6e6TnUT8z7Flfe6qwg2FUeOsJyQA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="box-sizing: border-box;margin-top: 0px;margin-bottom: 1rem;color: rgb(33, 37, 41);font-family: &#34;Open Sans&#34;, Helvetica, Arial, sans-serif;font-size: 16px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf=""><span textstyle="" style="font-size: 16px;font-weight: normal;">当然以上是开玩笑的meme,因为我也搞不懂为什么,我本身不是学密码学的.只是觉得好奇怪。</span></span></p><p style="box-sizing: border-box;margin-top: 0px;margin-bottom: 1rem;color: rgb(33, 37, 41);font-family: &#34;Open Sans&#34;, Helvetica, Arial, sans-serif;font-size: 16px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf=""><span textstyle="" style="font-size: 16px;">玩笑归玩笑，话说回来，让我们头脑风暴一下, 如果微软要在和平时期搞后门，而不被发现(发现了我估计第二天全球就没多少用windows的设备了)，而且我们假定后门不能是“漏洞”类型的(要不然就陷入无穷无尽的阴谋论了).</span><span textstyle="" style="font-size: 16px;font-weight: bold;">那就只有密码学</span><span textstyle="" style="font-size: 16px;">,如果我们的密码基础设施被植入后门,可以做到:</span></span></p><p style="box-sizing: border-box;margin-top: 0px;margin-bottom: 1rem;color: rgb(33, 37, 41);font-family: &#34;Open Sans&#34;, Helvetica, Arial, sans-serif;font-size: 16px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf=""><span textstyle="" style="font-size: 16px;">0. </span></span><span leaf="" data-pm-slice="1 1 [&#34;para&#34;,null,&#34;para&#34;,{&#34;tagName&#34;:&#34;p&#34;,&#34;attributes&#34;:{&#34;style&#34;:&#34;box-sizing: border-box; margin-top: 0px; margin-bottom: 1rem; color: rgb(33, 37, 41); font-family: \&#34;Open Sans\&#34;, Helvetica, Arial, sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; 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;&#34;,&#34;data-pm-slice&#34;:&#34;0 0 []&#34;},&#34;namespaceURI&#34;:&#34;http://www.w3.org/1999/xhtml&#34;}]"><span textstyle="" style="font-size: 16px;">大部分安全从业人员无法察觉,这不是代码层面的事情.</span></span></p><p style="box-sizing: border-box;margin-top: 0px;margin-bottom: 1rem;color: rgb(33, 37, 41);font-family: &#34;Open Sans&#34;, Helvetica, Arial, sans-serif;font-size: 16px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf=""><span textstyle="" style="font-size: 16px;">1. 实时监控任意流量 -因为密码学存在漏洞,导致加密流量可以被解密</span></span></p><p style="box-sizing: border-box;margin-top: 0px;margin-bottom: 1rem;color: rgb(33, 37, 41);font-family: &#34;Open Sans&#34;, Helvetica, Arial, sans-serif;font-size: 16px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf=""><span textstyle="" style="font-size: 16px;">2. 伪造任意数字签名-如果密码学存在后门,攻击者完全可以伪造任意数字签名,一旦能伪造签名,重装系统就没有信任体系了.这无法防御.</span></span></p><p style="box-sizing: border-box;margin-top: 0px;margin-bottom: 1rem;color: rgb(33, 37, 41);font-family: &#34;Open Sans&#34;, Helvetica, Arial, sans-serif;font-size: 16px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf=""><span textstyle="" style="font-size: 16px;">3. 可以顺利甩锅,哪怕是windows被曝光用&#34;漏洞&#34;算法,windows也完全可以说是行业标准他带漏洞,让我打个安全更新给你修了.即便是被曝光,也不影响股票.</span></span></p><p style="box-sizing: border-box;margin-top: 0px;margin-bottom: 1rem;color: rgb(33, 37, 41);font-family: &#34;Open Sans&#34;, Helvetica, Arial, sans-serif;font-size: 16px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf=""><span textstyle="" style="font-size: 16px;">而且这事NSA又不是没干过:</span></span></p><p style="text-align: center;" nodeleaf=""><img class="rich_pages wxw-img" data-imgfileid="100001788" data-ratio="1.3896103896103895" data-s="300,640" type="block" data-type="png" data-w="770" src="https://wechat2rss.xlab.app/img-proxy/?k=90281f07&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLfPpNmeHIcKbjbmU2RFoZbG3lzmMiczicxQhEtSq7K4ALHGnXdApOc0og1C65BEL8PgpypRAHOiaMyg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="box-sizing: border-box;margin-top: 0px;margin-bottom: 1rem;color: rgb(33, 37, 41);font-family: &#34;Open Sans&#34;, Helvetica, Arial, sans-serif;font-size: 16px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf=""><span textstyle="" style="font-size: 24px;">彩蛋</span></span></p><p style="box-sizing: border-box;margin-top: 0px;margin-bottom: 1rem;color: rgb(33, 37, 41);font-family: &#34;Open Sans&#34;, Helvetica, Arial, sans-serif;font-size: 16px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf="">我搜资料的时候还发现国内也有人问过怎么过这玩意改主页....</span></p><p style="text-align: center;" nodeleaf=""><img class="rich_pages wxw-img" data-imgfileid="100001769" data-ratio="0.20105263157894737" data-s="300,640" type="block" data-type="png" data-w="950" src="https://wechat2rss.xlab.app/img-proxy/?k=2b0be06a&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLfPpNmeHIcKbjbmU2RFoZbY2wunD0zXKN5ia51sp6maT13Yy0AwahJyuu7pOibiaF6pN65rButYcfdg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="box-sizing: border-box;margin-top: 0px;margin-bottom: 1rem;color: rgb(33, 37, 41);font-family: &#34;Open Sans&#34;, Helvetica, Arial, sans-serif;font-size: 16px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><font dir="auto" style="box-sizing: border-box;vertical-align: inherit;"><font dir="auto" style="box-sizing: border-box;vertical-align: inherit;"><font dir="auto" style="box-sizing: border-box;color: rgb(33, 37, 41);font-family: &#34;Open Sans&#34;, Helvetica, Arial, sans-serif;font-size: 16px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;vertical-align: inherit;"><font dir="auto" style="box-sizing: border-box;vertical-align: inherit;"><span leaf=""><span textstyle="" style="font-size: 24px;">参考资料</span></span></font></font></font></font></p><p><span leaf=""><a href="https://binary.ninja/2025/03/25/default-browser-upcd.html" target="_blank">https://binary.ninja/2025/03/25/default-browser-upcd.html</a></span></p><p><span leaf=""><a href="https://linux.do/t/topic/884669" target="_blank">https://linux.do/t/topic/884669</a></span></p><p><span leaf=""><a href="https://bbs.kanxue.com/thread-285575.htm" target="_blank">https://bbs.kanxue.com/thread-285575.htm</a></span></p><p><span leaf=""><a href="https://github.com/xusheng6" target="_blank">https://github.com/xusheng6</a></span></p></div><p style="display: none;"><mp-style-type data-value="3"></mp-style-type></p>



<p><a href="2247485442">阅读原文</a></p>
<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=db9eb900&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzkyOTc0NDY2Nw%3D%3D%26mid%3D2247485442%26idx%3D1%26sn%3Da56332f9d4b4ef24ddcbc8da592399c8">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Thu, 18 Sep 2025 10:03:00 +0800</pubDate>
    </item>
    <item>
      <title>阻止通过漏洞驱动利用(byovd)技术致盲安全软件</title>
      <link>https://mp.weixin.qq.com/s?__biz=MzkyOTc0NDY2Nw==&amp;mid=2247485391&amp;idx=1&amp;sn=d6b003bb825f096fea77d5cabb1a10d3</link>
      <description></description>
      <content:encoded><![CDATA[<p>
原创 <span>为了安全鸭</span> <span>2025-09-16 10:00</span> <span style="display: inline-block;">北京</span>
</p>




<p>
<img src="https://wechat2rss.xlab.app/img-proxy/?k=c7c88df1&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FejibWMxI7nWIjDq2ULRWe2jqiaOic9ic1DQyHZfVcx20P5fQkFkpDtVw6XauoFzbTuR9iaib3Y2Il09vOH6t1AVv9kxQ%2F0%3Fwx_fmt%3Djpeg"/>
</p>


<h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf="">前言</span></h2><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">byovd,在2014年左右这些在业内还是被叫做&#34;vulnerable driver&#34;也不是什么神秘的东西,我知道的到现在也就几十年了吧</span><strong style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-weight: bolder;"><span leaf="">(实际可能更早,比如NSA的那个远控XP时代就用了)</span></strong><span leaf="">这些驱动有几个类型,</span><strong style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-weight: bolder;"><span leaf="">但是无非就是跟R3交互接口没验证签名导致函数被滥用。</span></strong></p><h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"></span><span leaf="">内核驱动调用ZwTerminateProcess</span></h2><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">现在信息安全领域见得多的还是这种内核发terminalprocess的东西，毕竟没游戏安全对抗那么激烈。大部分情况下关闭就行不做其他的操作</span><span leaf=""><img class="rich_pages wxw-img" data-imgfileid="100001717" data-ratio="0.42044134727061555" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" data-w="861" src="https://wechat2rss.xlab.app/img-proxy/?k=a2ec95fb&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIjDq2ULRWe2jqiaOic9ic1DQyZt0xLPJ83J5ibauRJzqBdcca3Y5GknP19cscfsDY3icTOHzicFLsvSN2w%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf="">就比如银狐木马用的:</span><span leaf=""><img class="rich_pages wxw-img" data-imgfileid="100001720" data-ratio="0.8453703703703703" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" data-w="1080" src="https://wechat2rss.xlab.app/img-proxy/?k=5b8b5b77&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIjDq2ULRWe2jqiaOic9ic1DQy8MZEpgcoKQY6WCC3pj1eA6H07icS9iarG2QQKJzbZ5WhmEHRRicEibw70g%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf="">这种情况跟上面说的一样，内核IO管理权限校验没做好，让人可以对任意进程发ZwTerminateProcess.</span></p><h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"></span><span leaf="">缓解</span></h2><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">实际上,在2020年左右Aidan Khoury的faceit反作弊(也负责后来的VGK反作弊)</span><span leaf="">就已经开始做缓解了(这个作者长得很帅,建议github star一下)</span><span leaf=""><a href="https://github.com/ajkhoury" target="_blank">https://github.com/ajkhoury</a></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" nodeleaf=""><img data-imgfileid="100001718" class="rich_pages wxw-img" data-ratio="0.3685185185185185" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=578d4502&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIjDq2ULRWe2jqiaOic9ic1DQyBNz7ibKAZnLq1VsIQSWBPcLJyxicz809Hd98p1vlRhVdJDI7Gzj7h2ww%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">缓解方法如下:</span></p><pre style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 13.118px;margin-top: 0px;margin-bottom: 1rem;overflow: auto;display: block;color: rgb(33, 37, 41);max-height: 400px;background-color: rgb(245, 245, 245);border: 1px solid rgb(204, 204, 204);padding: 0.5em;border-radius: 4px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><code style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: inherit;color: inherit;word-break: normal;white-space: pre-wrap;"><span leaf="">开机启动</span><span leaf="">标记/阻止 漏洞驱动加载</span><span leaf="">API 挂钩监控</span><span leaf="">前两个没什么好说的,无非就是拉黑驱动签名和HASH,但是漏洞驱动太多了.我们重点说第三点</span></code></pre><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">在windows系统中,随便挂钩系统驱动可能会被PG蓝屏.但是挂钩第三方驱动不会的.而保险的方式是挂钩驱动IAT,比如欧洲bro挂的BE的驱动的IAT导入函数列表</span><span leaf=""><img data-imgfileid="100001719" class="rich_pages wxw-img" data-ratio="0.6644674835061263" data-type="png" data-w="1061" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=8c3508eb&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIjDq2ULRWe2jqiaOic9ic1DQyWzg9Vmsp3MbbgJXpvyVH7MB04y9tdHAxdlYrneRgib9VdPhxnUEORDw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf="">是的,其实卡巴斯基和一些国外的EDR也挂了很多常见的驱动IAT或者IO HANDLE,目的就是为了防止漏洞驱动利用.比如</span><strong style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-weight: bolder;"><span leaf="">为什么SentinelOne EDR能阻止漏洞驱动利用,就是挂了IAT</span></strong><span leaf=""><img data-imgfileid="100001721" class="rich_pages wxw-img" data-ratio="0.525" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=26f6f004&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIjDq2ULRWe2jqiaOic9ic1DQyo1fAJvBu3CgNHw7Jn82oibqs4JtAbqicBxvs3KZNu4hN4hnHdgLs706A%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"></span><span leaf="">缓解POC</span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">让我们以一个卡饭流行的样本为例子,我们如何缓解他致盲edr:</span><span leaf=""><img data-imgfileid="100001725" class="rich_pages wxw-img" data-ratio="0.5546296296296296" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=6fb99dc1&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIjDq2ULRWe2jqiaOic9ic1DQyibC0YEjHHPGTQnicqg1NBtbOOtS9xiaSeNiaOJtZib7leb76h9icibw2Ix9Mw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf="">代码真的非常非常简单，我们只需要注册一个loadimage回调,然后判断是否是驱动,如果是,则hook导入表:</span><span leaf=""><img data-imgfileid="100001723" class="rich_pages wxw-img" data-ratio="0.3386046511627907" data-type="png" data-w="1075" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=3ecd52ca&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIjDq2ULRWe2jqiaOic9ic1DQy9ZPvXNWQOQlOHyGbJcnc9jEW5icj5FQN3cA3d6ueF8Zw1sp5Os6TzAg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf="">标准的导出表hook:</span><span leaf=""><img data-imgfileid="100001727" class="rich_pages wxw-img" data-ratio="1.3701863354037267" data-type="png" data-w="805" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=5d79c257&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIjDq2ULRWe2jqiaOic9ic1DQy5n2y5jFH88MIfgIUib2KGt2EmS5uTOkQ1EUcib0ATSsWuc2fGHianHggw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf="">hook后,我们判断是否是受保护进程,我这里以defender的msmpeng.exe为例子:</span><span leaf=""><img data-imgfileid="100001724" class="rich_pages wxw-img" data-ratio="1.0522292993630573" data-type="png" data-w="785" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=9840da2a&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIjDq2ULRWe2jqiaOic9ic1DQyJicZtVI7RvJe4l9ocmxDayWm15xzUkhSW8QGrM2Pj8a4tTjEDIhp6FQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><img data-imgfileid="100001726" class="rich_pages wxw-img" data-ratio="1.5103448275862068" data-type="png" data-w="725" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=0014b60d&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIjDq2ULRWe2jqiaOic9ic1DQyaY4Dh8E2szNYp5FhkZtlzzSoNDgXWfu1wkhIENMt7AZxTUSIbOZ1Xg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf="">完整代码:</span></p><pre style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 13.118px;margin-top: 0px;margin-bottom: 1rem;overflow: auto;display: block;color: rgb(33, 37, 41);max-height: 400px;background-color: rgb(245, 245, 245);border: 1px solid rgb(204, 204, 204);padding: 0.5em;border-radius: 4px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><code style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: inherit;color: inherit;word-break: normal;white-space: pre-wrap;"><span leaf="">/// @brief 根据进程句柄返回进程路径,必须要释放</span><span leaf="">/// @param ProcessHandle</span><span leaf="">/// @return 成功返回unicode_string* 否则返回null</span><span leaf="">auto QueryNameByHandle(HANDLE ProcessHandle) -&gt; PUNICODE_STRING {</span><span leaf="">    void* allocMemory = nullptr;</span><span leaf="">    uint32_t bufferSize = 0;</span><span leaf="">    bool isSuccess = false;</span><span leaf="">    do {</span><span leaf="">        if (ZwQueryInformationProcess(ProcessHandle, ProcessImageFileName, NULL,</span><span leaf="">                                      0, (PULONG)&amp;bufferSize) !=</span><span leaf="">            STATUS_INFO_LENGTH_MISMATCH) {</span><span leaf="">            break;</span><span leaf="">        }</span><span leaf="">        if (bufferSize == 0) {</span><span leaf="">            break;</span><span leaf="">        }</span><span leaf="">        allocMemory = ExAllocatePoolWithTag(PagedPool, bufferSize, HUOJI_TAG);</span><span leaf="">        if (allocMemory == nullptr) {</span><span leaf="">            break;</span><span leaf="">        }</span><span leaf="">        memset(allocMemory, 0x0, bufferSize);</span><span leaf="">        auto ntStatus = ZwQueryInformationProcess(</span><span leaf="">            ProcessHandle, ProcessImageFileName, allocMemory, bufferSize,</span><span leaf="">            (PULONG)&amp;bufferSize);</span><span leaf="">        if (NT_SUCCESS(ntStatus) == false) {</span><span leaf="">            break;</span><span leaf="">        }</span><span leaf="">        isSuccess = true;</span><span leaf="">    } while (false);</span><span leaf="">    if (isSuccess == false) {</span><span leaf="">        if (allocMemory != nullptr) {</span><span leaf="">            ExFreePoolWithTag(allocMemory, HUOJI_TAG);</span><span leaf="">            allocMemory = nullptr;</span><span leaf="">        }</span><span leaf="">    }</span><span leaf="">    return reinterpret_cast&lt;PUNICODE_STRING&gt;(allocMemory);</span><span leaf="">};</span><span leaf="">namespace Hooks {</span><span leaf="">/// @brief hook的漏洞利用函数</span><span leaf="">/// @param ProcessHandle</span><span leaf="">/// @param ExitStatus</span><span leaf="">/// @return</span><span leaf="">NTSTATUS</span><span leaf="">NTAPI</span><span leaf="">HookZwTerminateProcess(_In_opt_ HANDLE ProcessHandle,</span><span leaf="">                       _In_ NTSTATUS ExitStatus) {</span><span leaf="">    const static UNICODE_STRING defenderProcess =</span><span leaf="">        RTL_CONSTANT_STRING(L&#34;msmpeng.exe&#34;);</span><span leaf="">    PUNICODE_STRING TargetProcessName = nullptr;</span><span leaf="">    PUNICODE_STRING CurrentProcessName = nullptr;</span><span leaf="">    bool isBlock = false;</span><span leaf="">    do {</span><span leaf="">        if (ProcessHandle == (HANDLE)-1) {</span><span leaf="">            break;</span><span leaf="">        }</span><span leaf="">        TargetProcessName = QueryNameByHandle(ProcessHandle);</span><span leaf="">        if (TargetProcessName == nullptr) {</span><span leaf="">            break;</span><span leaf="">        }</span><span leaf="">        CurrentProcessName = QueryNameByHandle((HANDLE)-1);</span><span leaf="">        if (CurrentProcessName == nullptr) {</span><span leaf="">            break;</span><span leaf="">        }</span><span leaf="">        if (RtlSuffixUnicodeString(</span><span leaf="">                &amp;defenderProcess,</span><span leaf="">                reinterpret_cast&lt;PUNICODE_STRING&gt;(TargetProcessName),</span><span leaf="">                true) == false) {</span><span leaf="">            break;</span><span leaf="">        }</span><span leaf="">        DebugPrint(&#34;Detect vulnerable Driver Exploit\n&#34;);</span><span leaf="">        DebugPrint(&#34;Process for exploit: %wZ \n&#34;, CurrentProcessName);</span><span leaf="">        DebugPrint(&#34;try to kill: %wZ \n&#34;, TargetProcessName);</span><span leaf="">        isBlock = true;</span><span leaf="">    } while (false);</span><span leaf="">    if (TargetProcessName != nullptr) {</span><span leaf="">        ExFreePoolWithTag(TargetProcessName, HUOJI_TAG);</span><span leaf="">        TargetProcessName = nullptr;</span><span leaf="">    }</span><span leaf="">    if (CurrentProcessName != nullptr) {</span><span leaf="">        ExFreePoolWithTag(CurrentProcessName, HUOJI_TAG);</span><span leaf="">        CurrentProcessName = nullptr;</span><span leaf="">    }</span><span leaf="">    return isBlock ? STATUS_UNSUCCESSFUL</span><span leaf="">                   : ZwTerminateProcess(ProcessHandle, ExitStatus);</span><span leaf="">}</span><span leaf="">};  // namespace Hooks</span><span leaf="">auto LoadImageNotifyRoutine(PUNICODE_STRING FullImageName, HANDLE ProcessId,</span><span leaf="">                            PIMAGE_INFO ImageInfo) -&gt; void {</span><span leaf="">    if (ProcessId != 0) {</span><span leaf="">        return;</span><span leaf="">    }</span><span leaf="">    DriverUtil::IATHook(ImageInfo-&gt;ImageBase, (char*)&#34;ZwTerminateProcess&#34;,</span><span leaf="">                        &amp;Hooks::HookZwTerminateProcess);</span><span leaf="">}</span><span leaf="">auto InstallHook() -&gt; void {</span><span leaf="">    PsSetLoadImageNotifyRoutine(&amp;LoadImageNotifyRoutine);</span><span leaf="">}</span></code></pre><h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"></span><span leaf="">效果</span></h2><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">一旦发现目标正在尝试结束我们受保护进程,我们可以直接阻止他,这是效果,我们可以看到我们成功检测并且阻止了漏洞驱动利用:</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf=""><img data-imgfileid="100001730" class="rich_pages wxw-img" data-ratio="0.29814814814814816" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=e9a3c17c&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIjDq2ULRWe2jqiaOic9ic1DQyhjuGicUDbnJngXmgObhorKxTLESNewlWwymAYibWqiaAfrkAED0dicZeeQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"></span><span leaf="">代价?</span></h2><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">是的,如此简单背后是有自己的代价的: 他极其不稳定,比如闹得沸沸扬扬的火绒和卡巴斯基不兼容就是卡巴斯基挂了火绒的iat:</span><span leaf=""><img data-imgfileid="100001731" class="rich_pages wxw-img" data-ratio="0.4981481481481482" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=ea289322&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIjDq2ULRWe2jqiaOic9ic1DQyBwGXB54Vzic9c7YTPtcrlTQR9TVsyPj2sBUbajOg3CM1lonkcLz2R0A%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf="">此外一旦安装,无法热卸载驱动,怎么卸载都是不安全的.并且可能会有多个安全软件hook iat,到时候谁卸整个系统都会蓝屏.梦回XP时代杀毒软件互相打架。</span><span leaf="">而且这与任何现代游戏反作弊都不兼容,现在的游戏反作弊都也会hook iat,导致进一步冲突.</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><strong style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-weight: bolder;"><span leaf="">一般来说,客户在发现游戏和杀毒软件冲突的时候,会优先卸载杀毒软件.</span></strong></p><h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"></span><span leaf="">扩展阅读:直接物理内存读写</span></h2><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">在早期我印象中的漏洞驱动,都是一些主板刷bios/cpuz/gpuz的驱动，这些驱动有一些物理内存读写的API,忘记做校验导致被利用.利用去关闭dse</span><span leaf="">这里以GPUZ漏洞利用为例:</span><span leaf=""><img data-imgfileid="100001729" class="rich_pages wxw-img" data-ratio="0.6912325285895807" data-type="png" data-w="787" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=ef4bdedf&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIjDq2ULRWe2jqiaOic9ic1DQy8EARIT58fibANZX10bHIO5THuuII2rrkDxFa8cAjRHzKES5FP3icdyTQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf="">不做任何校验,直接用了MMIO:</span><span leaf=""><img data-imgfileid="100001728" class="rich_pages wxw-img" data-ratio="0.7948717948717948" data-type="png" data-w="663" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=857097b7&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIjDq2ULRWe2jqiaOic9ic1DQyjho45IlcicX7QGf39dcVib51I0ibqcfnOXdujMOhO4xyH4fKPFANZFLyw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf="">所以可以给gpuz发控制码读物理内存</span><span leaf=""><img data-imgfileid="100001732" class="rich_pages wxw-img" data-ratio="0.7921146953405018" data-type="png" data-w="837" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=1a2e5b78&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIjDq2ULRWe2jqiaOic9ic1DQyzTumgxFC7JVYjp1f962kW4jichl7ZVrDQ6La1UYVBRAI1QROpWz7buQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf="">而我们只有读物理内存的权利,所以还需要寻找到system PML4 这样才能翻译系统内存</span><span leaf="">有了系统PML4后,就可以做地址翻译,把虚拟地址翻译为物理地址.然后进行读写</span><span leaf=""><img data-imgfileid="100001735" class="rich_pages wxw-img" data-ratio="0.7221684414327202" data-type="png" data-w="1033" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=d173613f&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIjDq2ULRWe2jqiaOic9ic1DQyY1CgiaUMMETpU6PlFwISoia8k1SgnrkLJWkAEyAzxxg0eHOibwtTn90LQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf="">能做内核任意读写了,就可以干任何事情了,比如关闭驱动DSE</span><span leaf=""><img data-imgfileid="100001736" class="rich_pages wxw-img" data-ratio="0.6648148148148149" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=6368a5fc&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIjDq2ULRWe2jqiaOic9ic1DQy3IAIyFm4Vr4wiazuTdicy3nJpOofzjgPLT7Z8F7rMBjwbLPSENGs7tEQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf="">暴力搜特征码关的</span><span leaf=""><img data-imgfileid="100001733" class="rich_pages wxw-img" data-ratio="0.34096692111959287" data-type="png" data-w="393" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=5d5d066c&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIjDq2ULRWe2jqiaOic9ic1DQyPTbywfurGW3sFRqRMQ6ICQhZjy5IqygAgGAqUSwn6Atiah0LHf4hsZQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf="">关掉后就可以加载任意驱动了，或者跟之前一样, 遍历handle table拉高自己的handle权限 然后关闭安全软件</span><span leaf="">不过这个技术在系统windows1809后这种很少见了,因为windows加了一个机制,禁止这些物理内存读写的API访问系统CR3,如果访问了会被蓝屏</span><span leaf="">打开IDA,可以看到在iMapContiguousMemory的实现里面有这个代码</span><span leaf=""><img data-imgfileid="100001734" class="rich_pages wxw-img" data-ratio="0.6316590563165906" data-type="png" data-w="657" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=6dddd1db&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIjDq2ULRWe2jqiaOic9ic1DQyvo7WKeeqVWFeB5yEtaOOpib6aDjMm3J5KxBfBOTWb3Ztk5odPqiaUgLg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf="">可以看到,它通过MiFillSystemPtes</span></p><pre style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 13.118px;margin-top: 0px;margin-bottom: 1rem;overflow: auto;display: block;color: rgb(33, 37, 41);max-height: 400px;background-color: rgb(245, 245, 245);border: 1px solid rgb(204, 204, 204);padding: 0.5em;border-radius: 4px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><code style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: inherit;color: inherit;word-break: normal;white-space: pre-wrap;"><span leaf="">if ( (int)MiFillSystemPtes(v16, v12, v24, v5, v17, (__int64)&amp;v23) &lt; 0 )</span><span leaf="">  {</span><span leaf="">    MiReleasePtes(&amp;qword_43C0A0, v16, v14);</span><span leaf="">    return 0i64;</span><span leaf="">  }</span></code></pre><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">阻止了这些API对系统CR3的访问。访问不了系统CR3,也就没办法做后续了。</span><span leaf="">当然还有后续,后续有个全新的方法继续绕过继续利用,毕竟对抗永无止境:</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf=""><a class="normal_text_link" target="_blank" style="" href="https://mp.weixin.qq.com/s?__biz=MzkyOTc0NDY2Nw==&amp;mid=2247483740&amp;idx=1&amp;sn=eea4b2d0ad056403ca048960f79acf0a&amp;scene=21#wechat_redirect" textvalue="【漏洞分析】从驱动直接读写物理内存漏洞 到内存加载驱动分析" data-itemshowtype="0" linktype="text" data-linktype="2">【漏洞分析】从驱动直接读写物理内存漏洞 到内存加载驱动分析</a></span><span leaf=""><img data-imgfileid="100001737" class="rich_pages wxw-img" data-ratio="1.121706398996236" data-type="png" data-w="797" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=431eead0&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIjDq2ULRWe2jqiaOic9ic1DQy5uf63MD5u7jbKxaPUGMUanzoDqJ8teepjXjUm4LJZLXNTusMazlOKw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">对杀毒软件对抗这些感兴趣吗? 感兴趣具体更多可以参考:</span></p><p><span leaf=""><a class="normal_text_link" target="_blank" style="" href="https://mp.weixin.qq.com/s?__biz=MzkyOTc0NDY2Nw==&amp;mid=2247484509&amp;idx=1&amp;sn=6b20ac37b2085d07bce6087350cbe9e4&amp;scene=21#wechat_redirect" textvalue="深度了解现代安全软件对抗与缓解措施" data-itemshowtype="0" linktype="text" data-linktype="2">深度了解现代安全软件对抗与缓解措施</a></span></p><p style="display: none;"><mp-style-type data-value="3"></mp-style-type></p>



<p><a href="2247485391">阅读原文</a></p>
<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=b85bc8a6&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzkyOTc0NDY2Nw%3D%3D%26mid%3D2247485391%26idx%3D1%26sn%3Dd6b003bb825f096fea77d5cabb1a10d3">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Tue, 16 Sep 2025 10:00:00 +0800</pubDate>
    </item>
    <item>
      <title>深入研究银狐木马通过网络致盲安全软件的技术原理与解决方案</title>
      <link>https://mp.weixin.qq.com/s?__biz=MzkyOTc0NDY2Nw==&amp;mid=2247485364&amp;idx=1&amp;sn=8fd1ae4f1ee3e50572383bce2a7b4fff</link>
      <description>深入研究R3通过网络(WFP架构)致盲EDR的技术原理与解决方案</description>
      <content:encoded><![CDATA[<p>
原创 <span>为了安全鸭</span> <span>2025-08-31 10:00</span> <span style="display: inline-block;">北京</span>
</p>

<p>深入研究R3通过网络(WFP架构)致盲EDR的技术原理与解决方案</p>



<p>
<img src="https://wechat2rss.xlab.app/img-proxy/?k=cd708f69&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FejibWMxI7nWLIoePia9TZ1KiaibdMWtQZGPibYCpeuv90gpQVLAXr7M33cUbAnTVqmOsicsQicbdlsiaysQtn1niaHkWJyw%2F0%3Fwx_fmt%3Djpeg"/>
</p>


<h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf="">前言</span></h2><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">从2025年的安全对抗环境的越来越猖獗的银狐事件来看,我们进入了国内安全行业泡沫被戳破后的回归期:</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><img class="rich_pages wxw-img" data-imgfileid="100001685" data-type="png" style="box-sizing: border-box;vertical-align: middle;border: 0px;max-width: 100%;height: auto !important;" data-ratio="0.6592592592592592" data-w="1080" src="https://wechat2rss.xlab.app/img-proxy/?k=6cfee95a&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLIoePia9TZ1KiaibdMWtQZGPibicHrdia3frpAX7kQVRYibaPskDj6oFtzRIgK8I2LKuNztnicM8H0k1ew4A%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">国内正在回归到最原始的技术论成败的阶段,而不是PPT美观论成败阶段.</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">这一点,可以从这几年 银狐/RAT/红队 的一些手法论证:</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><strong style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-weight: bolder;"><span leaf="">各种威胁组织正在大量用漏洞/设计缺陷致盲EDR/AV</span></strong><span leaf="">,就比如今天所说的通过WFP致盲的问题</span></p><h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf="">WFP</span></h2><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">无论是银狐/黑产/APT 大规模用的EDRSilencer:</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">还是顺丰安全应急响应中心的沧总发的</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><a class="normal_text_link" target="_blank" style="" href="https://mp.weixin.qq.com/s?__biz=MzU3OTAyODk4MQ==&amp;mid=2247488823&amp;idx=1&amp;sn=570f9307f9f43f12cdd5e9517f294215&amp;scene=21#wechat_redirect" textvalue="EDR监测遭遇滑铁卢？无驱动技术让你轻松突破EDR！" data-itemshowtype="0" linktype="text" data-linktype="2">EDR监测遭遇滑铁卢？无驱动技术让你轻松突破EDR！</a></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">本质上是利用windows的一个狗屎机制-&gt;WFP</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">WFP最开始是想做一个ALL IN ONE的网络过滤框架，以代替NDIS.比如杀毒软件过滤可以用WFP，TUN/VPN/防火墙也可以用WFP实现自己的功能.只不过,他们设计之初忘记了一个核心要素: 鉴权</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">从理论上来说,WFP在设计之初应该考虑鉴权,最基本的如,R3不能影响R0的WFP回调,或者每个程序的WFP都跟自己的进程绑定,进程不在了则自动退出.等等,但是微软没有考虑到这一点,或者说写WFP的那伙人可能都不是windows的主力开发(参考minifilter架构,很明显确认基本不是一伙人).在windows中WFP里,</span><strong style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-weight: bolder;"><span leaf="">R3是可以影响到R0的回调的!</span></strong></p><h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"></span><span leaf="">黑产利用</span></h2><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">在EDRSilencer项目中我们可以看到,他们利用R3的WFP给其他进程套了一个WFP过滤器</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><img class="rich_pages wxw-img" data-imgfileid="100001686" data-type="png" style="box-sizing: border-box;vertical-align: middle;border: 0px;max-width: 100%;height: auto !important;" data-ratio="1.0453141091658085" data-w="971" src="https://wechat2rss.xlab.app/img-proxy/?k=27096078&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLIoePia9TZ1KiaibdMWtQZGPibiabIMNw2YDRYkhEQ9RM9GOPBmFqJTyGp6NGH6FNSx3HJfUuRgZIqZIg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">套完后我们可以看到多了一个layers,但是这个layers默认类型是FWP_ACTION_BLOCK</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" nodeleaf=""><img class="rich_pages wxw-img" data-imgfileid="100001687" data-type="png" style="box-sizing: border-box;vertical-align: middle;border: 0px;max-width: 100%;height: auto !important;" data-ratio="0.7589376915219612" data-w="979" src="https://wechat2rss.xlab.app/img-proxy/?k=9fe131df&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLIoePia9TZ1KiaibdMWtQZGPibpjGmSUNLjH1vpDFyiaBbWVicoXJicv0ibic6Ss16uHnwqLFGov8gqpNILBQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" nodeleaf=""><img class="rich_pages wxw-img" data-imgfileid="100001689" data-type="png" style="box-sizing: border-box;vertical-align: middle;border: 0px;max-width: 100%;height: auto !important;" data-ratio="0.4287037037037037" data-w="1080" src="https://wechat2rss.xlab.app/img-proxy/?k=194ff6b0&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLIoePia9TZ1KiaibdMWtQZGPibJYbe7dPpfOBRI5wNzGuiaWseSN6ElRBFRNNiaAicVskiaM5a8UlNIOsrfg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">在顺丰安全应急响应中心的沧总的代码中,是利用WFP删除杀毒软件的网络监控回调:</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><img class="rich_pages wxw-img" data-imgfileid="100001690" data-type="png" style="box-sizing: border-box;vertical-align: middle;border: 0px;max-width: 100%;height: auto !important;" data-ratio="0.9912536443148688" data-w="1029" src="https://wechat2rss.xlab.app/img-proxy/?k=bb85780b&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLIoePia9TZ1KiaibdMWtQZGPibdAMFUrfKqzjLKogXlg7s1w6HqHtaZybdYGg5vGUBSnpJt1ibuX0mvNA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" nodeleaf=""><img class="rich_pages wxw-img" data-imgfileid="100001688" data-type="png" style="box-sizing: border-box;vertical-align: middle;border: 0px;max-width: 100%;height: auto !important;" data-ratio="0.8712962962962963" data-w="1080" src="https://wechat2rss.xlab.app/img-proxy/?k=e87e2494&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLIoePia9TZ1KiaibdMWtQZGPibxyAXYfd0u1pyFwDdZsVt4lnE4I0IQx3mAOa0Kiciaib4E79Wraf2ARV4A%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span style="font-size: 2rem;caret-color: var(--weui-BRAND);">破局之道</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">让我们回归技术,冷静分析WFP的工作流程.让我们以沧总的代码为例,学习R3是如何给R0提交WFP操作的:</span></p><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"></span><span leaf="">WFP的R3-&gt;R0过程</span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">R3的WFP操作这个本质上是一个RPC客户端包装</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><img class="rich_pages wxw-img" data-imgfileid="100001696" data-type="png" style="box-sizing: border-box;vertical-align: middle;border: 0px;max-width: 100%;height: auto !important;" data-ratio="0.6350540216086434" data-w="833" src="https://wechat2rss.xlab.app/img-proxy/?k=9eab9d6c&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLIoePia9TZ1KiaibdMWtQZGPibbLf7s6nS4vw0mgX64DlloTCiadpeXcjaPHjZVIIIkuODHAeLNP0DNUg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">会发给</span></p><pre style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 13.118px;margin-top: 0px;margin-bottom: 1rem;overflow: auto;display: block;color: rgb(33, 37, 41);max-height: 400px;background-color: rgb(245, 245, 245);border: 1px solid rgb(204, 204, 204);padding: 0.5em;border-radius: 4px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><code style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: inherit;color: inherit;word-break: normal;white-space: pre-wrap;"><span leaf="">C:\Windows\system32\svchost.exe -k LocalServiceNoNetworkFirewall -p</span></code></pre><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">从windbg中我们可以论证到这一点:</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><img class="rich_pages wxw-img" data-imgfileid="100001694" data-type="png" style="box-sizing: border-box;vertical-align: middle;border: 0px;max-width: 100%;height: auto !important;" data-ratio="0.3990740740740741" data-w="1080" src="https://wechat2rss.xlab.app/img-proxy/?k=ccce645e&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLIoePia9TZ1KiaibdMWtQZGPibc3ibFFDlzwSiczhxpRLE3l0x0vXhYyB2R4iaFAlia4qA5G7twfszbDyoRw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">而这个svchost会调用BfeDeviceIoControl去进入内核</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><img class="rich_pages wxw-img" data-imgfileid="100001693" data-type="png" style="box-sizing: border-box;vertical-align: middle;border: 0px;max-width: 100%;height: auto !important;" data-ratio="0.33055555555555555" data-w="1080" src="https://wechat2rss.xlab.app/img-proxy/?k=b988731a&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLIoePia9TZ1KiaibdMWtQZGPibJYCZ0bd31wJ0US2zxkE2rPGUGVDPPFfrSYuJoCWaCbrv4o26jOnWgA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">内核会走到</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">而他最终会走到tcpip—&gt;KfdDriverEntry-&gt;KfdDispatchDevCtl</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><img class="rich_pages wxw-img" data-imgfileid="100001695" data-type="png" style="box-sizing: border-box;vertical-align: middle;border: 0px;max-width: 100%;height: auto !important;" data-ratio="0.7240740740740741" data-w="1080" src="https://wechat2rss.xlab.app/img-proxy/?k=7eaa2493&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLIoePia9TZ1KiaibdMWtQZGPibtYsd3jgCib32e0V2XCsicSrrsowtF0sxgxmKUoqjaiaN2vGGO8dXU6jfQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">然后这个转发到了netio!IoctlKfdBatchUpdate里面:</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><img class="rich_pages wxw-img" data-imgfileid="100001692" data-type="png" style="box-sizing: border-box;vertical-align: middle;border: 0px;max-width: 100%;height: auto !important;" data-ratio="0.3055555555555556" data-w="1080" src="https://wechat2rss.xlab.app/img-proxy/?k=4dd1de5a&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLIoePia9TZ1KiaibdMWtQZGPibkWJfZjYiaXzTjibPwZxabJuFfRcbaM4cxPe9raubv99ojQENJfmnnURA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">总体流程是:</span></p><pre style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 13.118px;margin-top: 0px;margin-bottom: 1rem;overflow: auto;display: block;color: rgb(33, 37, 41);max-height: 400px;background-color: rgb(245, 245, 245);border: 1px solid rgb(204, 204, 204);padding: 0.5em;border-radius: 4px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><code style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: inherit;color: inherit;word-break: normal;white-space: pre-wrap;"><span leaf="">R3-&gt;RPC服务器-&gt;bfe.dll-&gt;tcpip!KfdDriverEntry-&gt;tcpip!KfdDispatchDevCtl-&gt;netio!IoctlKfdBatchUpdate</span></code></pre><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"></span><span leaf="">IoctlKfdBatchUpdate</span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">IoctlKfdBatchUpdate是最后一步,这里先说结论,无论是EDRSilencer的给别人套WFP回调,还是沧总的删除WFP回调致盲网络过滤,都会走到BatchUpdate.</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">让我们仔细分析一下这个batchupdate.</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">他的AI美化代码如下,放心,我做了删减</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" nodeleaf=""><img class="rich_pages wxw-img" data-imgfileid="100001698" data-type="png" style="box-sizing: border-box;vertical-align: middle;border: 0px;max-width: 100%;height: auto !important;" data-ratio="0.5833333333333334" data-w="1080" src="https://wechat2rss.xlab.app/img-proxy/?k=466db1df&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLIoePia9TZ1KiaibdMWtQZGPib1gFpYKose8gcrGtp331iabmYzBazlquZkSR56BP6TSz9ic61ibyEH4h6w%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><pre style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 13.118px;margin-top: 0px;margin-bottom: 1rem;overflow: auto;display: block;color: rgb(33, 37, 41);max-height: 400px;background-color: rgb(245, 245, 245);border: 1px solid rgb(204, 204, 204);padding: 0.5em;border-radius: 4px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><code style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: inherit;color: inherit;word-break: normal;white-space: pre-wrap;"><br/><span leaf="">// 优化后的 IoctlKfdBatchUpdate 函数</span><br/><span leaf="">NTSTATUS IoctlKfdBatchUpdate(</span><br/><span leaf="">    PVOID BatchUpdateBuffer,</span><br/><span leaf="">    ULONG BatchUpdateSize,</span><br/><span leaf="">    PVOID *Result)</span><br/><span leaf="">{</span><br/><span leaf="">    // 解码批量更新对象</span><br/><span leaf="">    status = WfpMidlObjectDecode(</span><br/><span leaf="">        PWFP_BATCH_UPDATE_IOCTL_Decode,</span><br/><span leaf="">        BatchUpdateBuffer,</span><br/><span leaf="">        BatchUpdateSize,</span><br/><span leaf="">        (PVOID *)&amp;batchUpdateObj);</span><br/><span leaf="">    .....</span><br/><span leaf="">    // 处理添加过滤器到索引</span><br/><span leaf="">    for (i = 0; i &lt; batchUpdateObj-&gt;FilterCount; i++) {</span><br/><span leaf="">        PFILTER_DESCRIPTOR filterDesc = (PFILTER_DESCRIPTOR)((PBYTE)batchUpdateObj-&gt;FilterDescriptors + 24 * i);</span><br/><span leaf="">        PFILTER_OBJECT filterObj = *(PFILTER_OBJECT *)((PBYTE)batchUpdateObj-&gt;FilterObjects + 8 * i);</span><br/><span leaf="">        ......</span><br/><span leaf="">    }</span><br/><span leaf="">    // 处理删除过滤器</span><br/><span leaf="">    for (i = 0; i &lt; batchUpdateObj-&gt;DeleteFilterCount; i++) {</span><br/><span leaf="">        PFILTER_DESCRIPTOR filterDesc = (PFILTER_DESCRIPTOR)((PBYTE)batchUpdateObj-&gt;DeleteFilterDescriptors + 16 * i);</span><br/><span leaf="">        PFILTER_OBJECT filterObj = *(PFILTER_OBJECT *)((PBYTE)batchUpdateObj-&gt;DeleteFilterDescriptors + 16 * i + 8);</span><br/><span leaf="">        .......</span><br/><span leaf="">    }</span><br/><span leaf="">    ....</span><br/><span leaf="">    return status;</span><br/><span leaf="">}</span></code></pre><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">实际上,我们可以注意到,关键就在于WfpMidlObjectDecode所调用的PWFP_BATCH_UPDATE_IOCTL_Decode函数.而这个函数告诉我们,他在用RPC解码.R3发的其实是一个RPC的结构体:</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><img class="rich_pages wxw-img" data-imgfileid="100001697" data-type="png" style="box-sizing: border-box;vertical-align: middle;border: 0px;max-width: 100%;height: auto !important;" data-ratio="0.2776381909547739" data-w="796" src="https://wechat2rss.xlab.app/img-proxy/?k=2d7667ff&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLIoePia9TZ1KiaibdMWtQZGPib0Y94VGuD5pqXopG2EnnV1Q9ZtKYBCBpoQwRmQQBkjYOXqh0yyw7Xqg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><pre style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 13.118px;margin-top: 0px;margin-bottom: 1rem;overflow: auto;display: block;color: rgb(33, 37, 41);max-height: 400px;background-color: rgb(245, 245, 245);border: 1px solid rgb(204, 204, 204);padding: 0.5em;border-radius: 4px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><code style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: inherit;color: inherit;word-break: normal;white-space: pre-wrap;"><span leaf="">__int64 __fastcall PWFP_BATCH_UPDATE_IOCTL_Decode(__int64 handle, __int64 ppObject)</span><br/><span leaf="">{</span><br/><span leaf="">  return NdrMesTypeDecode3(</span><br/><span leaf="">           handle,</span><br/><span leaf="">           &amp;g_BatchUpdateTypeInfo,</span><br/><span leaf="">           &amp;g_BatchUpdateFormatString,</span><br/><span leaf="">           &amp;g_BatchUpdateProcFormatString,</span><br/><span leaf="">           1,</span><br/><span leaf="">           ppObject);</span><br/><span leaf="">}</span></code></pre><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">而他实际干的操作是,用户发来信息-&gt;RPC反序化-&gt;正常结构体</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">这个正常结构体长这样:</span></p><pre style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 13.118px;margin-top: 0px;margin-bottom: 1rem;overflow: auto;display: block;color: rgb(33, 37, 41);max-height: 400px;background-color: rgb(245, 245, 245);border: 1px solid rgb(204, 204, 204);padding: 0.5em;border-radius: 4px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><code style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: inherit;color: inherit;word-break: normal;white-space: pre-wrap;"><span leaf="">// 批量更新上下文结构体</span><br/><span leaf="">typedef struct _BATCH_UPDATE_CONTEXT {</span><br/><span leaf="">    PVOID BatchUpdateObject;      // 偏移量 0</span><br/><span leaf="">    BYTE UnknownData[20];          // 偏移量 8</span><br/><span leaf="">    BYTE StateArray[99];           // 偏移量 20</span><br/><span leaf="">    BYTE UnknownData2[1];         // 偏移量 119</span><br/><span leaf="">    ULONG Counter;                 // 偏移量 120</span><br/><span leaf="">    // 可能还有更多字段</span><br/><span leaf="">} BATCH_UPDATE_CONTEXT, *PBATCH_UPDATE_CONTEXT;</span><br/><span leaf="">// 批量更新对象结构体</span><br/><span leaf="">typedef struct _BATCH_UPDATE_OBJECT {</span><br/><span leaf="">    // 偏移量 0 处的未知字段</span><br/><span leaf="">    ULONG FilterCount;             // 偏移量 4</span><br/><span leaf="">    // 偏移量 8 处的未知字段</span><br/><span leaf="">    PVOID FilterDescriptors;       // 偏移量 16</span><br/><span leaf="">    PVOID FilterObjects;           // 偏移量 24</span><br/><span leaf="">    ULONG DeleteFilterCount;       // 偏移量 32</span><br/><span leaf="">    // 偏移量 36 处的未知字段</span><br/><span leaf="">    PVOID DeleteFilterDescriptors; // 偏移量 40</span><br/><span leaf="">    // 可能还有更多字段</span><br/><span leaf="">} BATCH_UPDATE_OBJECT, *PBATCH_UPDATE_OBJECT;</span><br/><span leaf="">// 过滤器描述符结构体</span><br/><span leaf="">typedef struct _FILTER_DESCRIPTOR {</span><br/><span leaf="">    // 偏移量 0 处的未知字段</span><br/><span leaf="">    USHORT FilterId;               // 偏移量 16</span><br/><span leaf="">    ULONG UnknownValue;            // 偏移量 20</span><br/><span leaf="">    // 可能还有更多字段</span><br/><span leaf="">} FILTER_DESCRIPTOR, *PFILTER_DESCRIPTOR;</span><br/><span leaf="">// 过滤器对象结构体</span><br/><span leaf="">typedef struct _FILTER_OBJECT {</span><br/><span leaf="">    // 偏移量 0 处的未知字段</span><br/><span leaf="">    ULONG Flags;                   // 偏移量 40</span><br/><span leaf="">    // 可能还有更多字段</span><br/><span leaf="">} FILTER_OBJECT, *PFILTER_OBJECT;</span><br/><span leaf="">// 内部过滤器结构体</span><br/><span leaf="">typedef struct _INT_FILTER {</span><br/><span leaf="">    // 偏移量 0 处的未知字段</span><br/><span leaf="">    LONG64 ReferenceCount;         // 偏移量 16</span><br/><span leaf="">    // 偏移量 24 处的未知字段</span><br/><span leaf="">    PFILTER_OBJECT FilterObject;   // 偏移量 24</span><br/><span leaf="">    // 偏移量 32 处的未知字段</span><br/><span leaf="">    ULONG StateFlags;              // 偏移量 52</span><br/><span leaf="">    // 可能还有更多字段</span><br/><span leaf="">} INT_FILTER, *PINT_FILTER;</span></code></pre><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf="">解决思路</span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">既然是IoControl,我们可以做irp stack attch.去检测这一行为,实际上,我们只需要附加Tcpip驱动就行:</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><img class="rich_pages wxw-img" data-imgfileid="100001702" data-type="png" style="box-sizing: border-box;vertical-align: middle;border: 0px;max-width: 100%;height: auto !important;" data-ratio="1.213903743315508" data-w="935" src="https://wechat2rss.xlab.app/img-proxy/?k=343ea7f9&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLIoePia9TZ1KiaibdMWtQZGPibBlysUE43nDt7zkH29ELde99JciaTJsOvffrWN0mK8Fa9eCO4uVO7S8A%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">关键问题在于,我们没有微软的MDL文件,这个文件是自动生成的,因此我们解不了用户发来的结构体.</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">因此我们要手动推导一下结构体,windbg断下iocontrole后看看buffer:</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><img class="rich_pages wxw-img" data-imgfileid="100001699" data-type="png" style="box-sizing: border-box;vertical-align: middle;border: 0px;max-width: 100%;height: auto !important;" data-ratio="0.16304347826086957" data-w="920" src="https://wechat2rss.xlab.app/img-proxy/?k=8a534722&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLIoePia9TZ1KiaibdMWtQZGPibkDibL0V8OmxmAc46O1h6dF6fzcXVLQRAGyJL6JewE6OHWnKdDbcv3SA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">把这buffer写到磁盘文件,用relcass打开推一下,这里直接说结论吧,有两个类型的删除操作,一个类型的增加操作,这里不说增加的,之说删除的.</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">经过几十分钟的推导后,我们从一开始的raw数据逐步推导出了如下操作:</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">raw数据:</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><img class="rich_pages wxw-img" data-imgfileid="100001703" data-type="png" style="box-sizing: border-box;vertical-align: middle;border: 0px;max-width: 100%;height: auto !important;" data-ratio="0.4925925925925926" data-w="1080" src="https://wechat2rss.xlab.app/img-proxy/?k=07ff1427&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLIoePia9TZ1KiaibdMWtQZGPibho9Jcq1UkucFUXGZ5XH4H9AgicILv43frPVgsmm6CEicISoCxoVYf26w%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">推导出来后的:</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">删除操作1: type0x40</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><img class="rich_pages wxw-img" data-imgfileid="100001700" data-type="png" style="box-sizing: border-box;vertical-align: middle;border: 0px;max-width: 100%;height: auto !important;" data-ratio="0.5158013544018059" data-w="886" src="https://wechat2rss.xlab.app/img-proxy/?k=9d345ac4&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLIoePia9TZ1KiaibdMWtQZGPibUObW0IJttGYricUly5Qico3xhl9Yx64kUtp9MibJjeLMbjCa9PGWtB4Rw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">删除操作2: type0x38</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><img class="rich_pages wxw-img" data-imgfileid="100001701" data-type="png" style="box-sizing: border-box;vertical-align: middle;border: 0px;max-width: 100%;height: auto !important;" data-ratio="0.48668796592119273" data-w="939" src="https://wechat2rss.xlab.app/img-proxy/?k=7513a459&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLIoePia9TZ1KiaibdMWtQZGPib31djXPX1Z7qF2fIhk8GPypTtwpFyic1oicGbCp4H9owruEtkd8OribFcg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">增加操作: type0x101:</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><img class="rich_pages wxw-img" data-imgfileid="100001704" data-type="png" style="box-sizing: border-box;vertical-align: middle;border: 0px;max-width: 100%;height: auto !important;" data-ratio="0.3074074074074074" data-w="1080" src="https://wechat2rss.xlab.app/img-proxy/?k=31a98f0c&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLIoePia9TZ1KiaibdMWtQZGPib7eCtng02hDq8pBCR0t8q0A3f5ve9BMxJRLFiap8QesgALG6TtYzBTibg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">让我们总结一下:</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">rpc_header-&gt;</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">type</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">data &lt;-这里面就是我们要的信息</span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">其中type == 0x38的时候</span></p><pre style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 13.118px;margin-top: 0px;margin-bottom: 1rem;overflow: auto;display: block;color: rgb(33, 37, 41);max-height: 400px;background-color: rgb(245, 245, 245);border: 1px solid rgb(204, 204, 204);padding: 0.5em;border-radius: 4px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><code style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: inherit;color: inherit;word-break: normal;white-space: pre-wrap;"><span leaf="">struct WfpUpdateBatch_Type0x38_Array {</span><br/><span leaf="">    uint32_t Array_MagicNum;    // 0x002C</span><br/><span leaf="">    uint32_t Array_Conditions;  // 0x0030</span><br/><span leaf="">    uint32_t Array_flags;       // 0x0034</span><br/><span leaf="">    uint32_t Array_unk3;        // 0x0038</span><br/><span leaf="">    uint32_t Array_unk4;        // 0x003C</span><br/><span leaf="">    uint32_t Array_LayerId;     // 0x0040</span><br/><span leaf="">    uint32_t Array_unk5;        // 0x0044</span><br/><span leaf="">};</span><br/><span leaf="">struct WfpUpdateBatch_Type0x38 {</span><br/><span leaf="">    WfpUpdateBatch_Header header;</span><br/><span leaf="">    uint32_t Version;        // 0x0010</span><br/><span leaf="">    uint32_t Unk5;           // 0x0014</span><br/><span leaf="">    uint32_t Unk6;           // 0x0018</span><br/><span leaf="">    uint32_t Unk7;           // 0x001C</span><br/><span leaf="">    uint32_t Unk8;           // 0x0020</span><br/><span leaf="">    uint32_t Unk9;           // 0x0024</span><br/><span leaf="">    uint32_t DelArrayCount;  // 0x0028</span><br/><span leaf="">    WfpUpdateBatch_Type0x38_Array Arrays[1];</span><br/><span leaf="">};</span></code></pre><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">其中type==0x40的时候</span></p><pre style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 13.118px;margin-top: 0px;margin-bottom: 1rem;overflow: auto;display: block;color: rgb(33, 37, 41);max-height: 400px;background-color: rgb(245, 245, 245);border: 1px solid rgb(204, 204, 204);padding: 0.5em;border-radius: 4px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><code style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: inherit;color: inherit;word-break: normal;white-space: pre-wrap;"><span leaf="">struct WfpUpdateBatch_Type0x40_Array {</span><br/><span leaf="">    uint32_t Array_MagicNum;    // 0x002C</span><br/><span leaf="">    uint32_t Array_unk;         // 0x0030</span><br/><span leaf="">    uint32_t Array_unk2;        // 0x0034</span><br/><span leaf="">    uint32_t Array_Conditions;  // 0x0038</span><br/><span leaf="">    uint32_t Array_unk4;        // 0x003C</span><br/><span leaf="">    uint32_t Array_unk5;        // 0x0040</span><br/><span leaf="">    uint32_t Array_unk6;        // 0x0044</span><br/><span leaf="">    uint32_t Array_LayerId;     // 0x0048</span><br/><span leaf="">    uint32_t Array_unk7;        // 0x004C</span><br/><span leaf="">};</span><br/><span leaf="">struct WfpUpdateBatch_Type0x40 {</span><br/><span leaf="">    WfpUpdateBatch_Header header;</span><br/><span leaf="">    uint32_t Version;        // 0x0010</span><br/><span leaf="">    uint32_t Unk4;           // 0x0014</span><br/><span leaf="">    uint32_t Unk5;           // 0x0018</span><br/><span leaf="">    uint32_t Unk6;           // 0x001C</span><br/><span leaf="">    uint32_t Unk7;           // 0x0020</span><br/><span leaf="">    uint32_t Unk8;           // 0x0024</span><br/><span leaf="">    uint32_t DelArrayCount;  // 0x0028</span><br/><span leaf="">    WfpUpdateBatch_Type0x40_Array Arrays[1];</span><br/><span leaf="">};</span></code></pre><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">那么问题就非常简单了:</span></p><ol style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" class="list-paddingleft-1"><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">irp hook tcpip驱动</span></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">判断IOCODE是不是batchupdate</span></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">解码WFP的结构体,通过自己推算的结构体</span></p></li></ol><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">让我们直接开始</span></p><h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf="">最终解决方案</span></h2><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"></span><span leaf="">irp hook tcpip驱动</span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf=""><img class="rich_pages wxw-img" data-imgfileid="100001705" data-type="png" style="box-sizing: border-box;vertical-align: middle;border: 0px;max-width: 100%;height: auto !important;" data-ratio="0.5316027088036117" data-w="886" src="https://wechat2rss.xlab.app/img-proxy/?k=11b0d59f&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLIoePia9TZ1KiaibdMWtQZGPibE5C6JqQrwAvZgUvCXsCTRVibLoWEDyIE6tQnv9Tm036nr6s2CzPmZtA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf=""><img class="rich_pages wxw-img" data-imgfileid="100001708" data-type="png" style="box-sizing: border-box;vertical-align: middle;border: 0px;max-width: 100%;height: auto !important;" data-ratio="1.2527472527472527" data-w="910" src="https://wechat2rss.xlab.app/img-proxy/?k=2d0f7e7a&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLIoePia9TZ1KiaibdMWtQZGPibO3auPiaNBGDNTkaNNmzkygwgOW2ZnEIfcTibXfvHxqHpdAicvbpqZVE1g%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"></span><span leaf="">判断IOCODE是不是batchupdate</span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" nodeleaf=""><img class="rich_pages wxw-img" data-imgfileid="100001706" data-type="png" style="box-sizing: border-box;vertical-align: middle;border: 0px;max-width: 100%;height: auto !important;" data-ratio="0.7494279176201373" data-w="874" src="https://wechat2rss.xlab.app/img-proxy/?k=788a7b06&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLIoePia9TZ1KiaibdMWtQZGPibdAnvSdSodl3a1sazgobBiapyfD9vfOJNDGqiaTaZga9zTF97Kp7sTF6A%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"></span><span leaf="">解码WFP的结构体,通过自己推算的结构体</span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" nodeleaf=""><img class="rich_pages wxw-img" data-imgfileid="100001707" data-type="png" style="box-sizing: border-box;vertical-align: middle;border: 0px;max-width: 100%;height: auto !important;" data-ratio="1.3555555555555556" data-w="900" src="https://wechat2rss.xlab.app/img-proxy/?k=5034c1e8&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLIoePia9TZ1KiaibdMWtQZGPibGE8LEuiasHVH8Jksjq6wz8XLKm7zZl1D7ibtcEsUhgWOuh8lHjUKLhdA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"></span><span leaf="">结果</span></h2><p><span leaf="">删除一些回调,可以看到成功检测:</span></p><p style="text-align: center;" nodeleaf=""><img class="rich_pages wxw-img" data-imgfileid="100001711" data-s="300,640" data-type="png" type="block" style="height: auto !important;" data-ratio="0.4" data-w="1080" src="https://wechat2rss.xlab.app/img-proxy/?k=0d750a7d&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLIoePia9TZ1KiaibdMWtQZGPibSgujXPzLgCVg1ywlaribhDBRzPj8HibdfYzGdllkBia0aS7dOEraPvCNQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><br style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"/><span leaf="">我们成功检测到了WFP回调删除,EDRSilencer同理能被检测.</span></p><h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"></span><span leaf="">后续</span></h2><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">其实，EDR在沧总那篇文章</span><span style="caret-color: var(--weui-BRAND);background-color: transparent;">出来后就做了更新了:</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf=""><img class="rich_pages wxw-img" data-imgfileid="100001710" data-type="png" style="box-sizing: border-box;vertical-align: middle;border: 0px;max-width: 100%;height: auto !important;" data-ratio="0.8703703703703703" data-w="1080" src="https://wechat2rss.xlab.app/img-proxy/?k=c91fcc7e&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLIoePia9TZ1KiaibdMWtQZGPibk9CbmZNMD6Onwic6bWw6BJiazddpzlartibXiclic2vMG8ZZZnSuABy0Dyg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">参考资料</span></h2><p class="mp_profile_iframe_wrp"><mp-common-profile class="custom_select_card mp_profile_iframe mp_common_widget" data-pluginname="mp-common-profile" data-from="0" data-id="Mzg2MzYxNTE4Nw==" data-alias="QAX-TIANSHOU" data-headimg="http://mmbiz.qpic.cn/mmbiz_png/2bn5C41lDTd5eKZicjrL5D0qlAHFxd5IbicyaeoL9u43NU2qTVNvdpp4DElkvL6bicrufblnjBsDNN3UibNS9TrV6Q/0?wx_fmt=png" data-nickname="奇安信天守" data-signature="奇安信天守为中小企业提供基于互联网的SaaS化的终端安全解决方案" data-service_type="2"></mp-common-profile></p><p class="mp_profile_iframe_wrp"><mp-common-profile class="custom_select_card mp_profile_iframe mp_common_widget" data-pluginname="mp-common-profile" data-from="0" data-id="MzU3OTAyODk4MQ==" data-alias="SFSRC-" data-headimg="http://mmbiz.qpic.cn/mmbiz_png/06tvL6Oj3eZ6X7uVOXLDKg4VibW2JibGxO6QpBGVMmKN2ASdsu3tf8JfwycbHNR8WkJHDSecQSvfumQic6q2YSoog/0?wx_fmt=png" data-nickname="顺丰安全应急响应中心" data-signature="顺丰安全应急响应中心（SFSRC）官方微信" data-service_type="1"></mp-common-profile></p><p><span leaf=""><a href="https://github.com/netero1010/EDRSilencer" target="_blank">https://github.com/netero1010/EDRSilencer</a></span></p><h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"></span><span leaf="">题外话</span></h2><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">自从搞安全以来,天天听大家说各种不好,确实,这行业从2012年开始就被喷这不好那不好,但是个人作为一个打工人还是认为,好不好只是行业的事情.</span><strong style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-weight: bolder;"><span leaf="">跟打工人毫无关系</span></strong><span leaf="">.打工人做的不是抱怨/焦虑. 而是提高自己,用比较古老的话来说:</span></p><blockquote style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin: 5px 0px 15px;overflow: hidden;border-width: 0px 0px 0px 4px;border-top-style: initial;border-right-style: initial;border-bottom-style: initial;border-left-style: solid;border-top-color: initial;border-right-color: initial;border-bottom-color: initial;border-left-color: rgb(122, 208, 58);border-image: initial;padding: 8px 12px;background-color: rgb(241, 241, 241);box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 1px 0px;font-size: 14.992px;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;"><span leaf="">技术在手,天下我有</span></p></blockquote><p style="display: none;"><mp-style-type data-value="3"></mp-style-type></p>



<p><a href="2247485364">阅读原文</a></p>
<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=3baa0d0a&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzkyOTc0NDY2Nw%3D%3D%26mid%3D2247485364%26idx%3D1%26sn%3D8fd1ae4f1ee3e50572383bce2a7b4fff">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Sun, 31 Aug 2025 10:00:00 +0800</pubDate>
    </item>
    <item>
      <title>从0制作IDA的F5代码还原功能(hex-rays插件) 上</title>
      <link>https://mp.weixin.qq.com/s?__biz=MzkyOTc0NDY2Nw==&amp;mid=2247485332&amp;idx=1&amp;sn=25ef87ab7af839c54e8e4727bfd045cb</link>
      <description></description>
      <content:encoded><![CDATA[<p>
原创 <span>为了安全鸭</span> <span>2025-08-12 09:30</span> <span style="display: inline-block;">北京</span>
</p>




<p>
<img src="https://wechat2rss.xlab.app/img-proxy/?k=39c5f6f0&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FejibWMxI7nWIdtrt4kzb38IAasb7XFry1OSO1yN56h6hW0mu18om3090EXSUaL3UichwuBMjTsL7GiaFwIAriaKCfw%2F0%3Fwx_fmt%3Djpeg"/>
</p>


<h1 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2.5rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf="">前言</span></h1><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">说来惭愧,鸭哥的业余时间娱乐活动一般除了 dota 外,就还剩下写代码,尤其是一些”高难度”的代码,我喜欢业余的时候打磨一下.每年给自己定个目标,比如去年是 VMP 还原的代码</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">[2025]VMP3.x 原理详解与还原思路</span><span leaf=""><br/></span><span leaf=""><a href="https://key08.com/index.php/2025/04/20/2467.html" target="_blank">https://key08.com/index.php/2025/04/20/2467.html</a></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">你是否想过IDA的F5/bn的 伪C代码怎么来的,即便是有开源的NSA的Ghidra/avast的retdec也看不懂代码? 因为这些都是复杂的成品工程项目,而核心代码相比各种乱七八糟的UI调用其实少得可怜</span><span leaf=""><br/></span><span leaf="">所以让我们实际操作一下,手写一个类似于IDA的F5的功能,一起学习一下这块的工作原理</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">这块做的过程中觉得很难,但是实际上,特别简单,没什么难度,我们依次介绍原理,详解,并且逐步实现一个看起来能用的东西</span></p><blockquote style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin: 5px 0px 15px;overflow: hidden;border-width: 0px 0px 0px 4px;border-top-style: initial;border-right-style: initial;border-bottom-style: initial;border-left-style: solid;border-top-color: initial;border-right-color: initial;border-bottom-color: initial;border-left-color: rgb(122, 208, 58);border-image: initial;padding: 8px 12px;background-color: rgb(241, 241, 241);box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 1px 0px;font-size: 14.992px;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;"><span leaf="">免责声明: 我不是专业搞编译器的，整个过程的路线是能跑就行,要是有高手发现我写的有问题,评论区跟我说一下,我们一起探讨一下</span></p></blockquote><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">先放几个成品图:</span><span leaf=""><br/></span><span leaf=""><img class="rich_pages wxw-img" data-imgfileid="100001641" data-ratio="0.3907407407407407" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" data-w="1080" src="https://wechat2rss.xlab.app/img-proxy/?k=323c63bc&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIdtrt4kzb38IAasb7XFry1Gq0UsWtuaTiaWUW2Ogzbd0SoWxVyUTnr1f1zIZiaF2fGwwdj5Sw9IZTQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" nodeleaf=""><img data-imgfileid="100001642" class="rich_pages wxw-img" data-ratio="0.4675925925925926" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=d17cd7d2&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIdtrt4kzb38IAasb7XFry1gItfTQfh6MicqiaUEy1rPzVYibXlR5dYYTyLhflicw3mBkeay5RyQicS0qQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">最开始的想法是为了做 NGAV:</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001643" class="rich_pages wxw-img" data-ratio="1.1532846715328466" data-type="png" data-w="959" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=9a0b33ef&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIdtrt4kzb38IAasb7XFry1PlMj4hB0phgoxMDnN4gD6jUEj469iatouhgn8pendNIfRrtjwXzRLFQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">2024 年终: 木马病毒自动化特征提取&amp;云端机器学习的思路分享</span><span leaf=""><br/></span><span leaf=""><a href="https://key08.com/index.php/2024/12/28/2310.html" target="_blank">https://key08.com/index.php/2024/12/28/2310.html</a></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">不过后来由于今年业务相关的东西太忙,在公司一直没时间写,只能周末空闲的时候当娱乐活动随便写写研究了.</span></p><blockquote style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin: 5px 0px 15px;overflow: hidden;border-width: 0px 0px 0px 4px;border-top-style: initial;border-right-style: initial;border-bottom-style: initial;border-left-style: solid;border-top-color: initial;border-right-color: initial;border-bottom-color: initial;border-left-color: rgb(122, 208, 58);border-image: initial;padding: 8px 12px;background-color: rgb(241, 241, 241);box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 1px 0px;font-size: 14.992px;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;"><span leaf="">警告,本文1万字,并且没有一点AI的参与,看不懂是正常的,我建议丢给GPT做阅读.我自己写完后看也头疼.不硬着头皮从0开始一步一步看是看不懂的.由于公众号的格式太难受了,想要pdf的朋友,后台回复”IDA制作”,可以拿到原始的PDF</span></p></blockquote><h1 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2.5rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf="">原理</span></h1><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">IDA 识别到能一键 F5 实际上可以分为几个具体步骤:</span></p><ol style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" class="list-paddingleft-1"><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">PE 识别，导入表，导出表，TLS 等等</span></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">基于（1），进行函数识别，标记哪些位置是函数</span></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">基于（2），提升为 LLIL 也就是 low level IL,这个主要负责将 汇编 转为自己的通用翻译语言。这代表上层不需要关系汇编的架构什么的（比如，X64，MIPS,等等 转 IL 后都不需要关心了）</span></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">基于（3） 提升为 MIDDLE LEVEL IL，而这个过程我们需要根据 RSP/RBP 访问标记函数，解析符号，并且识别函数内容</span></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">基于（4） 做进一步优化，总而成为 HIGHT LLIL。这一步后,就已经是 IDA F5 后的形状了</span></p></li></ol><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">需要注意的是,这个过程并不是严格线性的。比如在 LLIL 提升过程中,可能会发现新的函数,这时需要回到第 2 步重新进行函数识别。整个过程是迭代式的,每一步都可能影响其他步骤。</span><span leaf=""><br/></span><span leaf="">我们以 BN 为例子:</span><span leaf=""><br/></span><span leaf="">我们以 BN 为例子:</span></p><ol style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" class="list-paddingleft-1"><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">bn 的汇编模式:</span><span leaf=""><br/></span><span leaf=""><img class="rich_pages wxw-img" data-imgfileid="100001648" data-ratio="0.7046296296296296" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" data-w="1080" src="https://wechat2rss.xlab.app/img-proxy/?k=23b26490&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIdtrt4kzb38IAasb7XFry1DaqNtbNzwQibTNAbEjII2llwsAIs0ybDzNj7UG8d3KVDiaqA1zHHmhDw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">你可以看到,在这个阶段,bn 只是显示纯汇编(虽然可能有一些标注)</span></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">BN 的 llil 模式:</span><span leaf=""><br/></span><span leaf=""><img class="rich_pages wxw-img" data-imgfileid="100001644" data-ratio="0.9238095238095239" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" data-w="840" src="https://wechat2rss.xlab.app/img-proxy/?k=3334ac34&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIdtrt4kzb38IAasb7XFry1H4zD1ulqFfMHObVfttHjkvAcHw3jhym6oHicPdalvgk2feCDKAhwdOw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">这个时候,原来的汇编已经变成了 BN 的一种中间码,这样 BN 就能很愉快的处理各种乱七八糟的平台的汇编,比如 ARM,mips 等等</span><span leaf=""><br/></span><span leaf="">3.MLIL 模式:</span><span leaf=""><br/></span><span leaf=""><img class="rich_pages wxw-img" data-imgfileid="100001647" data-ratio="0.6182212581344902" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" data-w="922" src="https://wechat2rss.xlab.app/img-proxy/?k=0692748b&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIdtrt4kzb38IAasb7XFry1mXrf33Fz9iahOkzTcuDRM3ohywybSJc1kJeias99W3VXTibOlBjmkAiaSw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">这个模式下的 BN,在 LLIL 的基础上已经标识了</span><span leaf=""><br/></span><strong style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-weight: bolder;"><span leaf="">函数调用</span></strong><span leaf="">/</span><strong style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-weight: bolder;"><span leaf="">函数参数</span></strong><span leaf="">/</span><strong style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-weight: bolder;"><span leaf="">符号</span></strong><span leaf="">及代码做了</span><strong style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-weight: bolder;"><span leaf="">优化</span></strong></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">HLIL 模式与 C 语言模式:</span><span leaf=""><br/></span><span leaf=""><img class="rich_pages wxw-img" data-imgfileid="100001646" data-ratio="0.6482843137254902" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" data-w="816" src="https://wechat2rss.xlab.app/img-proxy/?k=866ad4b2&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIdtrt4kzb38IAasb7XFry1UHlZ7saHFVicnTBs6DkAdm424D4sgvGotQ5esiaD8dDrwSBRnA7oR7ibg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">这个时候,已经跟本来的 C 语言没什么区别了.可能没有 C 语言能导出去运行的功能而已，这个是 C 语言的</span><span leaf=""><br/></span><span leaf=""><img class="rich_pages wxw-img" data-imgfileid="100001645" data-ratio="0.498812351543943" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" data-w="842" src="https://wechat2rss.xlab.app/img-proxy/?k=ed8cf573&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIdtrt4kzb38IAasb7XFry17xJWX4qE6iakNj9CEa1zVaV6dWUeKgY5y2RZ6xW5kY7vsiad4WHibWNiaA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p></li></ol><h1 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2.5rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf="">函数识别</span></h1><h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"></span><span leaf="">初级函数识别</span></h2><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">我们整个旅程的第一步，就是识别函数.如何做到在没符号识别函数是一个学问，我们不能太宽泛，就先假定目标是 windows x64。</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">识别 winx64 的 函数 最基本的办法是遍历 text 段找 call,我们可以遍历出 所有的 call imm 指令以及 JMP 指令，这些指令通常是一个函数.</span><span leaf=""><br/></span><span leaf="">基本代码如下:</span><span leaf=""><br/></span><span leaf=""><img class="rich_pages wxw-img" data-imgfileid="100001649" data-ratio="0.6162927981109799" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" data-w="847" src="https://wechat2rss.xlab.app/img-proxy/?k=68f05839&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIdtrt4kzb38IAasb7XFry1XVlwCQAO1lsibticNpHGs4IPKdOmKquRbicIHCh1lUuQk2gvdY6XfSMaw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">其中 call 后就是我们识别的函数。</span><span leaf=""><br/></span><span leaf="">此外,msvc 编译器编译出来的程序,会带 cfg 保护区段</span></p><blockquote style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin: 5px 0px 15px;overflow: hidden;border-width: 0px 0px 0px 4px;border-top-style: initial;border-right-style: initial;border-bottom-style: initial;border-left-style: solid;border-top-color: initial;border-right-color: initial;border-bottom-color: initial;border-left-color: rgb(122, 208, 58);border-image: initial;padding: 8px 12px;background-color: rgb(241, 241, 241);box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 1px 0px;font-size: 14.992px;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;"><span leaf="">CFG（Control Flow Guard）是微软推出的漏洞利用缓解机制，从 Windows 8.1 开始引入，并且需要编译器的支持，编译器的版本为 Virtual Studio 2015 Updated 2 版本以上。</span><span leaf=""><br/></span><span leaf="">在开启了 CFG 支持以后，编译生成 exe 程序中，所有间接调用前面都会插入一个_guard_check_icall 的检查函数，如果系统不支持 CFG 机制，则该函数不会生效。</span></p></blockquote><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">如下就是一个经典的例子:</span></p><pre style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 13.118px;margin-top: 0px;margin-bottom: 1rem;overflow: auto;display: block;color: rgb(33, 37, 41);max-height: 400px;background-color: rgb(245, 245, 245);border: 1px solid rgb(204, 204, 204);padding: 0.5em;border-radius: 4px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><code style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: inherit;color: inherit;word-break: normal;white-space: pre-wrap;"><span leaf="">eax,[esi]</span><span leaf=""><br/></span><span leaf="">ecx, eax</span><span leaf=""><br/></span><span leaf="">call _guard_check_icall  // CFG检查函数</span><span leaf=""><br/></span><span leaf="">call eax</span><span leaf=""><br/></span></code></pre><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">_guard_check_icall 函数的地址,在 PE 程序被系统加载的时候会被替换成 nt!LdrpValidateUserCallTarget 函数的地址</span><span leaf=""><br/></span><span leaf="">nt!LdrpValidateUserCallTarget 函数的参数就是上面 ecx 的值，也就是间接调用的函数地址</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">校验逻辑如下：</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">1）间接调用函数地址共 4 字节,取高 3 字节的值加上 CFGBitmap 表的基址,得到 CFGBitmap 表中的值</span><span leaf=""><br/></span><span leaf="">2）判断间接调用地址是否 0x10 对齐：</span><span leaf=""><br/></span><span leaf="">2.1) 如果是对齐的,函数地址的第 4-8 位的值,就是上面获取的 CFGBitmap 表值的位偏移</span><span leaf=""><br/></span><span leaf="">2.2) 如果不是对齐的,函数地址的第 4-8 位的值,再或上 1,得到的值就是 CFGBitmap 表值的位偏移</span><span leaf=""><br/></span><span leaf="">3）验证 CFGBitmap 表值的位偏移处的 bit 位，如果是 1,则说明这个函数是有效的,否则产生异常</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">在 PE 结构的 loadConfig 信息中保存了：</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">1）_guard_check_icall 的函数地址</span><span leaf=""><br/></span><span leaf="">2）CFGBitmap 表的 RVA，这里面是该程序的每个函数的 RVA 转换成 1bit 的值,制作成的一个 CFGBitmap 表</span><span leaf=""><br/></span><span leaf="">3）CFGBitmap 中函数的数量</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">来源:</span><span leaf=""><br/></span><span leaf=""><a href="https://blog.csdn.net/cssxn/article/details/101285088" target="_blank">https://blog.csdn.net/cssxn/article/details/101285088</a></span><span leaf=""><br/></span><span leaf="">因此我们也必须要识别是否是来自 cfg 控制区段的跳转,否则我们是没办法检测到函数的</span><span leaf=""><br/></span><span leaf="">基本代码如下:</span><span leaf=""><br/></span><span leaf=""><img class="rich_pages wxw-img" data-imgfileid="100001651" data-ratio="1.165966386554622" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" data-w="952" src="https://wechat2rss.xlab.app/img-proxy/?k=b3dbb3a8&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIdtrt4kzb38IAasb7XFry1QffmC9AgO3UO199BZh7QhCqljfibXZWEseUy8Soqc5kiamrCIeYvL9sQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">值得注意的是，这个只是最基本的函数识别，这没办法处理其他情况，尤其是对于 VT 函数，我们应该需要搜索 rdata 去处理，除此之外，我们还需要从如下地方找：</span></p><ol style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" class="list-paddingleft-1"><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">暴力特征函数序言</span></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">异常处理表</span></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">TLS 回调</span></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">虚表/class</span></p></li></ol><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">除了直接的 call/jmp 指令识别,我们还需要处理以下情况:</span></p><pre style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 13.118px;margin-top: 0px;margin-bottom: 1rem;overflow: auto;display: block;color: rgb(33, 37, 41);max-height: 400px;background-color: rgb(245, 245, 245);border: 1px solid rgb(204, 204, 204);padding: 0.5em;border-radius: 4px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><code style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: inherit;color: inherit;word-break: normal;white-space: pre-wrap;"><span leaf="">// 典型的间接跳转模式</span><span leaf=""><br/></span><span leaf="">mov rax, [some_address]</span><span leaf=""><br/></span><span leaf="">call rax</span><span leaf=""><br/></span></code></pre><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">跳转表</span></p><pre style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 13.118px;margin-top: 0px;margin-bottom: 1rem;overflow: auto;display: block;color: rgb(33, 37, 41);max-height: 400px;background-color: rgb(245, 245, 245);border: 1px solid rgb(204, 204, 204);padding: 0.5em;border-radius: 4px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><code style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: inherit;color: inherit;word-break: normal;white-space: pre-wrap;"><span leaf="">// 常见于switch-case实现</span><span leaf=""><br/></span><span leaf="">jmp qword ptr [rax*8 + jump_table]</span><span leaf=""><br/></span></code></pre><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">这些情况需要进行数据流分析才能准确识别目标函数。</span><span leaf=""><br/></span><span leaf="">一个完整的代码如下:</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001650" class="rich_pages wxw-img" data-ratio="1.2410313901345291" data-type="png" data-w="892" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=49edfd73&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIdtrt4kzb38IAasb7XFry1VPKcqzaUoltGjicB8kn4HvRUmdMISjGicpY3BbvgicRVkTImGnEQdDmVQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><h1 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2.5rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf="">函数识别</span></h1><h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"></span><span leaf="">初级函数识别</span></h2><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">我们整个旅程的第一步，就是识别函数.如何做到在没符号识别函数是一个学问，我们不能太宽泛，就先假定目标是 windows x64。</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">识别 winx64 的 函数 最基本的办法是遍历 text 段找 call,我们可以遍历出 所有的 call imm 指令以及 JMP 指令，这些指令通常是一个函数.</span><span leaf=""><br/></span><span leaf="">基本代码如下:</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001652" class="rich_pages wxw-img" data-ratio="0.6162927981109799" data-type="png" data-w="847" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=68f05839&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIdtrt4kzb38IAasb7XFry1XVlwCQAO1lsibticNpHGs4IPKdOmKquRbicIHCh1lUuQk2gvdY6XfSMaw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">其中 call 后就是我们识别的函数。</span><span leaf=""><br/></span><span leaf="">此外,msvc 编译器编译出来的程序,会带 cfg 保护区段</span></p><blockquote style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin: 5px 0px 15px;overflow: hidden;border-width: 0px 0px 0px 4px;border-top-style: initial;border-right-style: initial;border-bottom-style: initial;border-left-style: solid;border-top-color: initial;border-right-color: initial;border-bottom-color: initial;border-left-color: rgb(122, 208, 58);border-image: initial;padding: 8px 12px;background-color: rgb(241, 241, 241);box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 1px 0px;font-size: 14.992px;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;"><span leaf="">CFG（Control Flow Guard）是微软推出的漏洞利用缓解机制，从 Windows 8.1 开始引入，并且需要编译器的支持，编译器的版本为 Virtual Studio 2015 Updated 2 版本以上。</span><span leaf=""><br/></span><span leaf="">在开启了 CFG 支持以后，编译生成 exe 程序中，所有间接调用前面都会插入一个_guard_check_icall 的检查函数，如果系统不支持 CFG 机制，则该函数不会生效。</span></p></blockquote><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">如下就是一个经典的例子:</span></p><pre style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 13.118px;margin-top: 0px;margin-bottom: 1rem;overflow: auto;display: block;color: rgb(33, 37, 41);max-height: 400px;background-color: rgb(245, 245, 245);border: 1px solid rgb(204, 204, 204);padding: 0.5em;border-radius: 4px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><code style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: inherit;color: inherit;word-break: normal;white-space: pre-wrap;"><span leaf="">eax,[esi]</span><span leaf=""><br/></span><span leaf="">ecx, eax</span><span leaf=""><br/></span><span leaf="">call _guard_check_icall  // CFG检查函数</span><span leaf=""><br/></span><span leaf="">call eax</span><span leaf=""><br/></span></code></pre><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">_guard_check_icall 函数的地址,在 PE 程序被系统加载的时候会被替换成 nt!LdrpValidateUserCallTarget 函数的地址</span><span leaf=""><br/></span><span leaf="">nt!LdrpValidateUserCallTarget 函数的参数就是上面 ecx 的值，也就是间接调用的函数地址</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">校验逻辑如下：</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">1）间接调用函数地址共 4 字节,取高 3 字节的值加上 CFGBitmap 表的基址,得到 CFGBitmap 表中的值</span><span leaf=""><br/></span><span leaf="">2）判断间接调用地址是否 0x10 对齐：</span><span leaf=""><br/></span><span leaf="">2.1) 如果是对齐的,函数地址的第 4-8 位的值,就是上面获取的 CFGBitmap 表值的位偏移</span><span leaf=""><br/></span><span leaf="">2.2) 如果不是对齐的,函数地址的第 4-8 位的值,再或上 1,得到的值就是 CFGBitmap 表值的位偏移</span><span leaf=""><br/></span><span leaf="">3）验证 CFGBitmap 表值的位偏移处的 bit 位，如果是 1,则说明这个函数是有效的,否则产生异常</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">在 PE 结构的 loadConfig 信息中保存了：</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">1）_guard_check_icall 的函数地址</span><span leaf=""><br/></span><span leaf="">2）CFGBitmap 表的 RVA，这里面是该程序的每个函数的 RVA 转换成 1bit 的值,制作成的一个 CFGBitmap 表</span><span leaf=""><br/></span><span leaf="">3）CFGBitmap 中函数的数量</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">来源:</span><span leaf=""><br/></span><span leaf=""><a href="https://blog.csdn.net/cssxn/article/details/101285088" target="_blank">https://blog.csdn.net/cssxn/article/details/101285088</a></span><span leaf=""><br/></span><span leaf="">因此我们也必须要识别是否是来自 cfg 控制区段的跳转,否则我们是没办法检测到函数的</span><span leaf=""><br/></span><span leaf="">基本代码如下:</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001653" class="rich_pages wxw-img" data-ratio="1.165966386554622" data-type="png" data-w="952" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=b3dbb3a8&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIdtrt4kzb38IAasb7XFry1QffmC9AgO3UO199BZh7QhCqljfibXZWEseUy8Soqc5kiamrCIeYvL9sQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">值得注意的是，这个只是最基本的函数识别，这没办法处理其他情况，尤其是对于 VT 函数，我们应该需要搜索 rdata 去处理，除此之外，我们还需要从如下地方找：</span></p><ol style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" class="list-paddingleft-1"><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">暴力特征函数序言</span></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">异常处理表</span></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">TLS 回调</span></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">虚表/class</span></p></li></ol><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">除了直接的 call/jmp 指令识别,我们还需要处理以下情况:</span></p><pre style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 13.118px;margin-top: 0px;margin-bottom: 1rem;overflow: auto;display: block;color: rgb(33, 37, 41);max-height: 400px;background-color: rgb(245, 245, 245);border: 1px solid rgb(204, 204, 204);padding: 0.5em;border-radius: 4px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><code style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: inherit;color: inherit;word-break: normal;white-space: pre-wrap;"><span leaf="">// 典型的间接跳转模式</span><span leaf=""><br/></span><span leaf="">mov rax, [some_address]</span><span leaf=""><br/></span><span leaf="">call rax</span><span leaf=""><br/></span></code></pre><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">跳转表</span></p><pre style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 13.118px;margin-top: 0px;margin-bottom: 1rem;overflow: auto;display: block;color: rgb(33, 37, 41);max-height: 400px;background-color: rgb(245, 245, 245);border: 1px solid rgb(204, 204, 204);padding: 0.5em;border-radius: 4px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><code style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: inherit;color: inherit;word-break: normal;white-space: pre-wrap;"><span leaf="">// 常见于switch-case实现</span><span leaf=""><br/></span><span leaf="">jmp qword ptr [rax*8 + jump_table]</span><span leaf=""><br/></span></code></pre><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">这些情况需要进行数据流分析才能准确识别目标函数。</span><span leaf=""><br/></span><span leaf="">一个完整的代码如下:</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001654" class="rich_pages wxw-img" data-ratio="1.2410313901345291" data-type="png" data-w="892" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=49edfd73&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIdtrt4kzb38IAasb7XFry1VPKcqzaUoltGjicB8kn4HvRUmdMISjGicpY3BbvgicRVkTImGnEQdDmVQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf="">函数识别的难点与挑战</span></h2><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">在基础函数识别之外，实际场景中还存在许多复杂情况需要处理：</span><span leaf=""><br/></span><span leaf="">编译器优化导致的函数识别困难</span></p><pre style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 13.118px;margin-top: 0px;margin-bottom: 1rem;overflow: auto;display: block;color: rgb(33, 37, 41);max-height: 400px;background-color: rgb(245, 245, 245);border: 1px solid rgb(204, 204, 204);padding: 0.5em;border-radius: 4px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><code style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: inherit;color: inherit;word-break: normal;white-space: pre-wrap;"><span leaf="">// 尾调用优化</span><span leaf=""><br/></span><span leaf="">void funcA() {</span><span leaf=""><br/></span><span leaf="">    return funcB();  // 编译器会直接优化为 jmp funcB</span><span leaf=""><br/></span><span leaf="">}</span><span leaf=""><br/></span><span leaf="">// 内联优化</span><span leaf=""><br/></span><span leaf="">inline void funcC() {</span><span leaf=""><br/></span><span leaf="">    // 函数体直接被插入调用处</span><span leaf=""><br/></span><span leaf="">}</span><span leaf=""><br/></span></code></pre><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">反调试技术的影响</span><span leaf=""><br/></span><span leaf="">一些程序会使用特殊技术干扰函数识别：</span></p><pre style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 13.118px;margin-top: 0px;margin-bottom: 1rem;overflow: auto;display: block;color: rgb(33, 37, 41);max-height: 400px;background-color: rgb(245, 245, 245);border: 1px solid rgb(204, 204, 204);padding: 0.5em;border-radius: 4px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><code style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: inherit;color: inherit;word-break: normal;white-space: pre-wrap;"><span leaf="">// 花指令</span><span leaf=""><br/></span><span leaf="">push rax</span><span leaf=""><br/></span><span leaf="">jmp $+5</span><span leaf=""><br/></span><span leaf="">db 0xE8  // 假call指令</span><span leaf=""><br/></span><span leaf="">pop rax</span><span leaf=""><br/></span><span leaf="">// 真实代码继续...</span><span leaf=""><br/></span></code></pre><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">虚函数表的处理</span><span leaf=""><br/></span><span leaf="">需要专门的算法来处理 C++的虚函数表：</span></p><pre style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 13.118px;margin-top: 0px;margin-bottom: 1rem;overflow: auto;display: block;color: rgb(33, 37, 41);max-height: 400px;background-color: rgb(245, 245, 245);border: 1px solid rgb(204, 204, 204);padding: 0.5em;border-radius: 4px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><code style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: inherit;color: inherit;word-break: normal;white-space: pre-wrap;"><span leaf="">struct VTable {</span><span leaf=""><br/></span><span leaf="">    void* func1;</span><span leaf=""><br/></span><span leaf="">    void* func2;</span><span leaf=""><br/></span><span leaf="">};</span><span leaf=""><br/></span><span leaf="">class Base {</span><span leaf=""><br/></span><span leaf="">    virtual void vfunc() = 0;</span><span leaf=""><br/></span><span leaf="">    VTable* vtable;</span><span leaf=""><br/></span><span leaf="">};</span><span leaf=""><br/></span></code></pre><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">改进的函数识别算法</span><span leaf=""><br/></span><span leaf="">我们可以通过以下方式提高函数识别的准确率：</span></p><ol style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" class="list-paddingleft-1"><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">启发式规则</span><span leaf=""><br/></span><span leaf="">检查函数序言模式（非仅 prolog）</span><span leaf=""><br/></span><span leaf="">分析栈平衡情况</span><span leaf=""><br/></span><span leaf="">追踪寄存器使用模式</span></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">交叉引用</span></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">数据流分析</span></p></li></ol><h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"></span><span leaf="">函数大小计算</span></h2><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">现在,我们遇到了一个麻烦: 函数大小计算</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">可能有一些逆向人认为,直接查找 ret 即可完成任务。知道了函数开头，直接查找第一次出现的 ret 就是函数的大小。</span><span leaf=""><br/></span><span leaf="">但是事实并非如此，并且函数大小计算是一个充满启发性的计算。不是想象中那么容易能算出来的。让我们一步一步的说明为什么</span></p><h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"></span><span leaf="">存在的问题</span></h2><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">如果我们直接看函数的 ret 会怎么样？看第一次出现的 ret，就能非常轻松的确定是哪个。</span><span leaf=""><br/></span><span leaf="">如果实际这样做过，你就会发现，大小完全的不准。这是因为各个编译器编译参数不一样,</span><strong style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-weight: bolder;"><span leaf="">不一定是以 ret 为函数结尾</span></strong></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">比如这个函数:</span></p><pre style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 13.118px;margin-top: 0px;margin-bottom: 1rem;overflow: auto;display: block;color: rgb(33, 37, 41);max-height: 400px;background-color: rgb(245, 245, 245);border: 1px solid rgb(204, 204, 204);padding: 0.5em;border-radius: 4px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><code style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: inherit;color: inherit;word-break: normal;white-space: pre-wrap;"><span leaf="">int test_function(int x) {</span><span leaf=""><br/></span><span leaf="">    volatile int a = x;</span><span leaf=""><br/></span><span leaf="">    if (a &gt; 0) {</span><span leaf=""><br/></span><span leaf="">        for (int i = 0; i &lt; a; i++) {</span><span leaf=""><br/></span><span leaf="">            if (i * i &gt; a) {</span><span leaf=""><br/></span><span leaf="">                return a + i;</span><span leaf=""><br/></span><span leaf="">            }</span><span leaf=""><br/></span><span leaf="">        }</span><span leaf=""><br/></span><span leaf="">        return a + 1;</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span leaf="">    return a - 1;</span><span leaf=""><br/></span><span leaf="">}</span><span leaf=""><br/></span></code></pre><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">在 clang 的情况下,是这样:</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001657" class="rich_pages wxw-img" data-ratio="0.42407407407407405" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=c32709cb&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIdtrt4kzb38IAasb7XFry1TNs9C3ib5peHH8xh7Mhxfsic1u8Fic71VEg7TPxa8FAx6JibpXd7Fz9adQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><pre style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 13.118px;margin-top: 0px;margin-bottom: 1rem;overflow: auto;display: block;color: rgb(33, 37, 41);max-height: 400px;background-color: rgb(245, 245, 245);border: 1px solid rgb(204, 204, 204);padding: 0.5em;border-radius: 4px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><code style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: inherit;color: inherit;word-break: normal;white-space: pre-wrap;"><span leaf="">test_function(int):</span><span leaf=""><br/></span><span leaf="">        push    rbp</span><span leaf=""><br/></span><span leaf="">        mov     rbp, rsp</span><span leaf=""><br/></span><span leaf="">        mov     dword ptr [rbp - 8], edi</span><span leaf=""><br/></span><span leaf="">        mov     eax, dword ptr [rbp - 8]</span><span leaf=""><br/></span><span leaf="">        mov     dword ptr [rbp - 12], eax</span><span leaf=""><br/></span><span leaf="">        mov     eax, dword ptr [rbp - 12]</span><span leaf=""><br/></span><span leaf="">        cmp     eax, 0</span><span leaf=""><br/></span><span leaf="">        jle     .LBB0_8</span><span leaf=""><br/></span><span leaf="">        mov     dword ptr [rbp - 16], 0</span><span leaf=""><br/></span><span leaf="">.LBB0_2:</span><span leaf=""><br/></span><span leaf="">        mov     eax, dword ptr [rbp - 16]</span><span leaf=""><br/></span><span leaf="">        mov     ecx, dword ptr [rbp - 12]</span><span leaf=""><br/></span><span leaf="">        cmp     eax, ecx</span><span leaf=""><br/></span><span leaf="">        jge     .LBB0_7</span><span leaf=""><br/></span><span leaf="">        mov     eax, dword ptr [rbp - 16]</span><span leaf=""><br/></span><span leaf="">        imul    eax, dword ptr [rbp - 16]</span><span leaf=""><br/></span><span leaf="">        mov     ecx, dword ptr [rbp - 12]</span><span leaf=""><br/></span><span leaf="">        cmp     eax, ecx</span><span leaf=""><br/></span><span leaf="">        jle     .LBB0_5</span><span leaf=""><br/></span><span leaf="">        mov     eax, dword ptr [rbp - 12]</span><span leaf=""><br/></span><span leaf="">        add     eax, dword ptr [rbp - 16]</span><span leaf=""><br/></span><span leaf="">        mov     dword ptr [rbp - 4], eax</span><span leaf=""><br/></span><span leaf="">        jmp     .LBB0_9</span><span leaf=""><br/></span><span leaf="">.LBB0_5:</span><span leaf=""><br/></span><span leaf="">        jmp     .LBB0_6</span><span leaf=""><br/></span><span leaf="">.LBB0_6:</span><span leaf=""><br/></span><span leaf="">        mov     eax, dword ptr [rbp - 16]</span><span leaf=""><br/></span><span leaf="">        add     eax, 1</span><span leaf=""><br/></span><span leaf="">        mov     dword ptr [rbp - 16], eax</span><span leaf=""><br/></span><span leaf="">        jmp     .LBB0_2</span><span leaf=""><br/></span><span leaf="">.LBB0_7:</span><span leaf=""><br/></span><span leaf="">        mov     eax, dword ptr [rbp - 12]</span><span leaf=""><br/></span><span leaf="">        add     eax, 1</span><span leaf=""><br/></span><span leaf="">        mov     dword ptr [rbp - 4], eax</span><span leaf=""><br/></span><span leaf="">        jmp     .LBB0_9</span><span leaf=""><br/></span><span leaf="">.LBB0_8:</span><span leaf=""><br/></span><span leaf="">        mov     eax, dword ptr [rbp - 12]</span><span leaf=""><br/></span><span leaf="">        sub     eax, 1</span><span leaf=""><br/></span><span leaf="">        mov     dword ptr [rbp - 4], eax</span><span leaf=""><br/></span><span leaf="">.LBB0_9:</span><span leaf=""><br/></span><span leaf="">        mov     eax, dword ptr [rbp - 4]</span><span leaf=""><br/></span><span leaf="">        pop     rbp</span><span leaf=""><br/></span><span leaf="">        ret</span><span leaf=""><br/></span></code></pre><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">开了-o2 优化后,会变成这样</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001658" class="rich_pages wxw-img" data-ratio="0.43148148148148147" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=a1f5e9b5&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIdtrt4kzb38IAasb7XFry1FbYibe7rlYZWvwIaQx8QpxIbHKvLYwuHk9puFICWzqm6YQbV1ONzMdA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><pre style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 13.118px;margin-top: 0px;margin-bottom: 1rem;overflow: auto;display: block;color: rgb(33, 37, 41);max-height: 400px;background-color: rgb(245, 245, 245);border: 1px solid rgb(204, 204, 204);padding: 0.5em;border-radius: 4px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><code style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: inherit;color: inherit;word-break: normal;white-space: pre-wrap;"><span leaf="">test_function(int):</span><span leaf=""><br/></span><span leaf="">        mov     dword ptr [rsp - 4], edi</span><span leaf=""><br/></span><span leaf="">        cmp     dword ptr [rsp - 4], 0</span><span leaf=""><br/></span><span leaf="">        mov     eax, dword ptr [rsp - 4]</span><span leaf=""><br/></span><span leaf="">        jle     .LBB0_7</span><span leaf=""><br/></span><span leaf="">        test    eax, eax</span><span leaf=""><br/></span><span leaf="">        jle     .LBB0_6</span><span leaf=""><br/></span><span leaf="">        xor     eax, eax</span><span leaf=""><br/></span><span leaf="">.LBB0_3:</span><span leaf=""><br/></span><span leaf="">        mov     ecx, eax</span><span leaf=""><br/></span><span leaf="">        imul    ecx, eax</span><span leaf=""><br/></span><span leaf="">        cmp     ecx, dword ptr [rsp - 4]</span><span leaf=""><br/></span><span leaf="">        jg      .LBB0_4</span><span leaf=""><br/></span><span leaf="">        inc     eax</span><span leaf=""><br/></span><span leaf="">        cmp     eax, dword ptr [rsp - 4]</span><span leaf=""><br/></span><span leaf="">        jl      .LBB0_3</span><span leaf=""><br/></span><span leaf="">.LBB0_6:</span><span leaf=""><br/></span><span leaf="">        mov     eax, dword ptr [rsp - 4]</span><span leaf=""><br/></span><span leaf="">        inc     eax</span><span leaf=""><br/></span><span leaf="">        ret</span><span leaf=""><br/></span><span leaf="">.LBB0_7:</span><span leaf=""><br/></span><span leaf="">        dec     eax</span><span leaf=""><br/></span><span leaf="">        ret</span><span leaf=""><br/></span><span leaf="">.LBB0_4:</span><span leaf=""><br/></span><span leaf="">        add     eax, dword ptr [rsp - 4]</span><span leaf=""><br/></span><span leaf="">        ret</span><span leaf=""><br/></span></code></pre><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">非常明显，我们多了几个 RET,这是因为:</span><span leaf=""><br/></span><span leaf="">不开优化（-O0）时：</span></p><blockquote style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin: 5px 0px 15px;overflow: hidden;border-width: 0px 0px 0px 4px;border-top-style: initial;border-right-style: initial;border-bottom-style: initial;border-left-style: solid;border-top-color: initial;border-right-color: initial;border-bottom-color: initial;border-left-color: rgb(122, 208, 58);border-image: initial;padding: 8px 12px;background-color: rgb(241, 241, 241);box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 1px 0px;font-size: 14.992px;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;"><span leaf="">编译器会按照代码的字面顺序直接翻译</span><span leaf=""><br/></span><span leaf="">所有返回语句通常会跳转到函数末尾的一个公共返回点</span><span leaf=""><br/></span><span leaf="">这样做便于调试，因为执行路径更直观</span></p></blockquote><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">开启优化（-O2）时：</span></p><blockquote style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin: 5px 0px 15px;overflow: hidden;border-width: 0px 0px 0px 4px;border-top-style: initial;border-right-style: initial;border-bottom-style: initial;border-left-style: solid;border-top-color: initial;border-right-color: initial;border-bottom-color: initial;border-left-color: rgb(122, 208, 58);border-image: initial;padding: 8px 12px;background-color: rgb(241, 241, 241);box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 1px 0px;font-size: 14.992px;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;"><span leaf="">编译器会尝试优化执行路径，减少指令数量</span><span leaf=""><br/></span><span leaf="">如果发现直接返回比跳转到公共返回点更高效，就会生成多个 ret</span><span leaf=""><br/></span><span leaf="">这样可以省去额外的跳转指令</span></p></blockquote><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">所以,直接找 ret 不可取,并且导致了一个麻烦的结论</span></p><blockquote style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin: 5px 0px 15px;overflow: hidden;border-width: 0px 0px 0px 4px;border-top-style: initial;border-right-style: initial;border-bottom-style: initial;border-left-style: solid;border-top-color: initial;border-right-color: initial;border-bottom-color: initial;border-left-color: rgb(122, 208, 58);border-image: initial;padding: 8px 12px;background-color: rgb(241, 241, 241);box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 1px 0px;font-size: 14.992px;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;"><span leaf="">所有软件对函数大小的计算,都是启发性的,并不能精准识别.</span></p></blockquote><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">我们需要一个更加聪明的办法.</span></p><h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"></span><span leaf="">聪明的办法</span></h2><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">要准确计算函数大小，我们需要分析函数的控制流。主要思路是：追踪所有可能的执行路径，直到找到所有可能的结束点。</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">具体来说,我们需要：</span></p><ol style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" class="list-paddingleft-1"><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">追踪所有的跳转指令（jmp, jz, jnz 等）</span></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">分析条件分支创造的多个执行路径</span></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">找到每个路径的终点（ret 指令）</span></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">取所有终点中地址最大的那个作为函数结束位置</span></p></li></ol><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">这将会尽可能的找到我们需要的函数方向.</span></p><h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"></span><span leaf="">具体实现</span></h2><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">基本的实现流程如下：</span></p><pre style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 13.118px;margin-top: 0px;margin-bottom: 1rem;overflow: auto;display: block;color: rgb(33, 37, 41);max-height: 400px;background-color: rgb(245, 245, 245);border: 1px solid rgb(204, 204, 204);padding: 0.5em;border-radius: 4px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><code style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: inherit;color: inherit;word-break: normal;white-space: pre-wrap;"><span leaf="">function FindFunctionEnd(startAddress):</span><span leaf=""><br/></span><span leaf="">    1. 反汇编当前地址的指令</span><span leaf=""><br/></span><span leaf="">    2. 如果是返回指令，记录当前位置+指令长度</span><span leaf=""><br/></span><span leaf="">    3. 如果是跳转指令：</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="">    4. 返回找到的最远结束地址</span><span leaf=""><br/></span></code></pre><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">为了避免重复分析和无限递归，我们需要：</span></p><ol style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" class="list-paddingleft-1"><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">使用哈希表记录已分析过的地址</span></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">检查跳转目标是否在合理范围内</span></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">防止向低地址的非法跳转</span></p></li></ol><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"></span><span leaf="">关键点处理</span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">跳转指令分析：</span></p><pre style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 13.118px;margin-top: 0px;margin-bottom: 1rem;overflow: auto;display: block;color: rgb(33, 37, 41);max-height: 400px;background-color: rgb(245, 245, 245);border: 1px solid rgb(204, 204, 204);padding: 0.5em;border-radius: 4px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><code style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: inherit;color: inherit;word-break: normal;white-space: pre-wrap;"><span leaf="">if (isJump(instruction)) {</span><span leaf=""><br/></span><span leaf="">    // 获取跳转目标</span><span leaf=""><br/></span><span leaf="">    targetAddress = getJumpTarget(instruction);</span><span leaf=""><br/></span><span leaf="">    // 验证目标地址</span><span leaf=""><br/></span><span leaf="">    if (isValidTarget(targetAddress)) {</span><span leaf=""><br/></span><span leaf="">        // 递归分析新路径</span><span leaf=""><br/></span><span leaf="">        endAddr = max(endAddr, FindFunctionEnd(targetAddress));</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span leaf="">}</span><span leaf=""><br/></span></code></pre><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">这样会追踪所有可能的执行路径</span></p><pre style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 13.118px;margin-top: 0px;margin-bottom: 1rem;overflow: auto;display: block;color: rgb(33, 37, 41);max-height: 400px;background-color: rgb(245, 245, 245);border: 1px solid rgb(204, 204, 204);padding: 0.5em;border-radius: 4px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><code style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: inherit;color: inherit;word-break: normal;white-space: pre-wrap;"><span leaf="">示例代码：</span><span leaf=""><br/></span><span leaf="">if (x &gt; 0) {</span><span leaf=""><br/></span><span leaf="">    return 1;</span><span leaf=""><br/></span><span leaf="">} else {</span><span leaf=""><br/></span><span leaf="">    return 2;</span><span leaf=""><br/></span><span leaf="">}</span><span leaf=""><br/></span><span leaf="">汇编代码：</span><span leaf=""><br/></span><span leaf="">    cmp eax, 0</span><span leaf=""><br/></span><span leaf="">    jle else_branch   // 条件跳转,创建两条路径</span><span leaf=""><br/></span><span leaf="">    mov eax, 1</span><span leaf=""><br/></span><span leaf="">    ret              // 路径1的结束点</span><span leaf=""><br/></span><span leaf="">else_branch:</span><span leaf=""><br/></span><span leaf="">    mov eax, 2</span><span leaf=""><br/></span><span leaf="">    ret              // 路径2的结束点</span><span leaf=""><br/></span></code></pre><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">如果不分析跳转,就会漏掉 else 分支的 ret,导致函数大小计算错误</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><strong style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-weight: bolder;"><span leaf="">另外这个不允许向上跳转，向上跳转则认为这个跳转没意义,我们假设代码是从下到上的.因此还需要地址合法性检查</span></strong></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">地址合法性检查代码:</span></p><pre style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 13.118px;margin-top: 0px;margin-bottom: 1rem;overflow: auto;display: block;color: rgb(33, 37, 41);max-height: 400px;background-color: rgb(245, 245, 245);border: 1px solid rgb(204, 204, 204);padding: 0.5em;border-radius: 4px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><code style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: inherit;color: inherit;word-break: normal;white-space: pre-wrap;"><span leaf="">bool isValidTarget(targetAddress) {</span><span leaf=""><br/></span><span leaf="">    // 不允许向低地址跳转</span><span leaf=""><br/></span><span leaf="">    if (targetAddress &lt; functionStart)</span><span leaf=""><br/></span><span leaf="">        return false;</span><span leaf=""><br/></span><span leaf="">    // 不允许跳出代码段</span><span leaf=""><br/></span><span leaf="">    if (targetAddress &gt; codeSegmentEnd)</span><span leaf=""><br/></span><span leaf="">        return false;</span><span leaf=""><br/></span><span leaf="">    // 避免重复分析</span><span leaf=""><br/></span><span leaf="">    if (alreadyAnalyzed(targetAddress))</span><span leaf=""><br/></span><span leaf="">        return false;</span><span leaf=""><br/></span><span leaf="">    return true;</span><span leaf=""><br/></span><span leaf="">}</span><span leaf=""><br/></span></code></pre><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">地址合法性检查存在的意义是,防止向下跳转导致的误判,如下所示:</span></p><pre style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 13.118px;margin-top: 0px;margin-bottom: 1rem;overflow: auto;display: block;color: rgb(33, 37, 41);max-height: 400px;background-color: rgb(245, 245, 245);border: 1px solid rgb(204, 204, 204);padding: 0.5em;border-radius: 4px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><code style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: inherit;color: inherit;word-break: normal;white-space: pre-wrap;"><span leaf="">function_A:</span><span leaf=""><br/></span><span leaf="">    ...</span><span leaf=""><br/></span><span leaf="">function_B:</span><span leaf=""><br/></span><span leaf="">    jmp function_A   // 如果允许向下跳转，可能误判为function_B的一部分</span><span leaf=""><br/></span></code></pre><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">以及避免跨段访问</span></p><pre style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 13.118px;margin-top: 0px;margin-bottom: 1rem;overflow: auto;display: block;color: rgb(33, 37, 41);max-height: 400px;background-color: rgb(245, 245, 245);border: 1px solid rgb(204, 204, 204);padding: 0.5em;border-radius: 4px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><code style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: inherit;color: inherit;word-break: normal;white-space: pre-wrap;"><span leaf="">.text:</span><span leaf=""><br/></span><span leaf="">    function_start:</span><span leaf=""><br/></span><span leaf="">        jmp data_section  // 不允许跳转到数据段</span><span leaf=""><br/></span><span leaf="">.data:</span><span leaf=""><br/></span><span leaf="">    data_section:</span><span leaf=""><br/></span><span leaf="">        db &#34;Hello&#34;</span><span leaf=""><br/></span></code></pre><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">这样,我们终于能安心的寻找最后一个 RET 了:</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001656" class="rich_pages wxw-img" data-ratio="0.3748290013679891" data-type="png" data-w="731" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=c4bdb539&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIdtrt4kzb38IAasb7XFry118BuVR94eqbDyKugAtWKUZ7AicBStFH6NE1sMA3qJMf46oBWj1XqXHw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf="">测试</span></h2><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">上面的代码,IDA 里面大小是 0x50:</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001662" class="rich_pages wxw-img" data-ratio="0.8175925925925925" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=995d18f6&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIdtrt4kzb38IAasb7XFry17RZsDyYuOwaH7nnhDicIia0EkYlHknghY8WFTgHGic7oTl66WKiaPlLmtQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">而以上的实现,也是 0x50:</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001661" class="rich_pages wxw-img" data-ratio="0.4351851851851852" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=7c8758fc&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIdtrt4kzb38IAasb7XFry14MdcC2KprsomUF8Iia9xU5PgMFasXiamcHv7aLX9VVcJywUemyfU9oYg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">如果直接看单独 ret 的存在,我们是没办法这样匹配的</span></p><h1 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2.5rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"></span><span leaf="">CFG 分析的基本原理</span></h1><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">控制流图是程序分析的核心，它将代码分解为基本块（Basic Blocks），并表示这些块之间的控制转移关系。我们的实现主要分为以下几个步骤：</span></p><ol style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" class="list-paddingleft-1"><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">识别函数入口点</span></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">分解函数为基本块</span></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">建立基本块之间的连接关系</span></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">处理特殊情况（如 CFG 保护机制）</span></p></li></ol><h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"></span><span leaf="">基本块的本质与控制流分析</span></h2><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">在编译理论和静态分析领域，基本块（Basic Block）是程序分析的基础单元。一个基本块是满足以下条件的最大连续指令序列：</span></p><ol style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" class="list-paddingleft-1"><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">只有一个入口点（第一条指令）</span></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">只有一个出口点（最后一条指令）</span></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">如果执行了第一条指令，那么块内的所有指令都会按顺序执行，没有分支、跳转或者提前终止</span></p></li></ol><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">基本块的这种特性使得我们可以将复杂的程序分解为更易于分析的单元，进而构建控制流图（CFG）。</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">如图所示,这个就是 IDA 的每个块的直观表示:</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001660" class="rich_pages wxw-img" data-ratio="1.122100122100122" data-type="png" data-w="819" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=3a9cce80&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIdtrt4kzb38IAasb7XFry1Hdqf09OIdgLgaZVuQeZm0ttj3Te6nHLzw8YSxxZz2j5icZq9ueudl9A%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">为了实现块分析,我们需要两步走</span></p><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"></span><span leaf="">第一步：识别所有基本块的起始地址</span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">这一步的核心思想是通过广度优先搜索（BFS）来识别所有可能的基本块起始点。我们从函数入口开始，在遇到控制流改变的指令时（如跳转、条件分支、返回等），我们认为当前基本块结束，并且标记潜在的新基本块起始点：</span></p><pre style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 13.118px;margin-top: 0px;margin-bottom: 1rem;overflow: auto;display: block;color: rgb(33, 37, 41);max-height: 400px;background-color: rgb(245, 245, 245);border: 1px solid rgb(204, 204, 204);padding: 0.5em;border-radius: 4px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><code style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: inherit;color: inherit;word-break: normal;white-space: pre-wrap;"><span leaf="">std::set&lt;uint64_t&gt; blockStarts{addressInFile};  // 初始化集合，包含函数的入口地址</span><span leaf=""><br/></span><span leaf="">std::set&lt;uint64_t&gt; processedAddrs;  // 已处理地址集合</span><span leaf=""><br/></span><span leaf="">std::queue&lt;uint64_t&gt; workList;      // 工作队列</span><span leaf=""><br/></span><span leaf="">workList.push(addressInFile);</span><span leaf=""><br/></span><span leaf="">// 第一轮：找出所有基本块的起始地址</span><span leaf=""><br/></span><span leaf="">while (!workList.empty()) {</span><span leaf=""><br/></span><span leaf="">    uint64_t currentAddr = workList.front();</span><span leaf=""><br/></span><span leaf="">    workList.pop();</span><span leaf=""><br/></span><span leaf="">    // 避免重复处理</span><span leaf=""><br/></span><span leaf="">    if (processedAddrs.count(currentAddr) &gt; 0) {</span><span leaf=""><br/></span><span leaf="">        continue;</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span leaf="">    processedAddrs.insert(currentAddr);</span><span leaf=""><br/></span><span leaf="">    // 反汇编当前地址处的指令</span><span leaf=""><br/></span><span leaf="">    cs_insn* insn;</span><span leaf=""><br/></span><span leaf="">    size_t offset = currentAddr - addressInFile;</span><span leaf=""><br/></span><span leaf="">    if (offset &gt;= size) continue;</span><span leaf=""><br/></span><span leaf="">    size_t count = cs_disasm(handle, addressInMemory + offset,</span><span leaf=""><br/></span><span leaf="">                             size - offset, currentAddr, 0, &amp;insn);</span><span leaf=""><br/></span><span leaf="">    if (count == 0) continue;</span><span leaf=""><br/></span><span leaf="">    // 遍历反汇编出的指令</span><span leaf=""><br/></span><span leaf="">    for (size_t i = 0; i &lt; count; i++) {</span><span leaf=""><br/></span><span leaf="">        auto theInsn = &amp;insn[i];</span><span leaf=""><br/></span><span leaf="">        auto termType = GetBlockTerminatorType(theInsn);</span><span leaf=""><br/></span><span leaf="">        // 如果是块终止指令（如跳转、返回等）</span><span leaf=""><br/></span><span leaf="">        if (termType != BlockTerminatorType::kNone) {</span><span leaf=""><br/></span><span leaf="">            auto targets = GetBlockTargets(theInsn);</span><span leaf=""><br/></span><span leaf="">            auto isCondJmp = is_cond_jump(theInsn);</span><span leaf=""><br/></span><span leaf="">            // 处理跳转目标</span><span leaf=""><br/></span><span leaf="">            for (auto target : targets) {</span><span leaf=""><br/></span><span leaf="">                if (target &gt;= addressInFile &amp;&amp; target &lt; addressInFile + size) {</span><span leaf=""><br/></span><span leaf="">                    blockStarts.insert(target);</span><span leaf=""><br/></span><span leaf="">                    workList.push(target);</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="">            if (isCondJmp &amp;&amp; i + 1 &lt; count) {</span><span leaf=""><br/></span><span leaf="">                blockStarts.insert(insn[i + 1].address);</span><span leaf=""><br/></span><span leaf="">                workList.push(insn[i + 1].address);</span><span leaf=""><br/></span><span leaf="">            }</span><span leaf=""><br/></span><span leaf="">            // 非返回且非条件跳转情况下，也考虑后续指令</span><span leaf=""><br/></span><span leaf="">            if (termType != BlockTerminatorType::kRet &amp;&amp; !isCondJmp) {</span><span leaf=""><br/></span><span leaf="">                if (i + 1 &lt; count) {</span><span leaf=""><br/></span><span leaf="">                    blockStarts.insert(insn[i + 1].address);</span><span leaf=""><br/></span><span leaf="">                    workList.push(insn[i + 1].address);</span><span leaf=""><br/></span><span leaf="">                }</span><span leaf=""><br/></span><span leaf="">            }</span><span leaf=""><br/></span><span leaf="">            break;  // 当前基本块结束</span><span leaf=""><br/></span><span leaf="">        }</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span leaf="">    cs_free(insn, count);</span><span leaf=""><br/></span><span leaf="">}</span><span leaf=""><br/></span></code></pre><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">对于跳转指令（如 JMP、JE 等），跳转目标地址成为新基本块的起始点</span><span leaf=""><br/></span><span leaf="">对于条件跳转，不仅跳转目标是新基本块，跳转指令之后的下一条指令也是新基本块</span><span leaf=""><br/></span><span leaf="">对于返回指令（RET），没有新的基本块起始点</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">这个过程使用工作队列（workList）实现，以确保我们能够处理所有可达的代码路径，即使存在复杂的跳转关系。</span></p><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"></span><span leaf="">第二步：创建基本块对象</span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">在这一步中，我们根据第一步识别的所有基本块起始地址，构建完整的基本块对象。对于每个起始地址，我们：</span></p><ol style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" class="list-paddingleft-1"><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">创建一个新的基本块对象</span></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">设置起始地址（文件中和内存中）</span></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">反汇编指令，直到找到一个终止指令或下一个已知的基本块起始点</span></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">记录终止类型和后继块地址</span></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">设置结束地址</span></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">将完整的基本块添加到列表中</span></p></li></ol><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">这种方法可以确保我们不会漏掉任何执行路径，并且正确识别基本块的边界。</span></p><pre style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 13.118px;margin-top: 0px;margin-bottom: 1rem;overflow: auto;display: block;color: rgb(33, 37, 41);max-height: 400px;background-color: rgb(245, 245, 245);border: 1px solid rgb(204, 204, 204);padding: 0.5em;border-radius: 4px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><code style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: inherit;color: inherit;word-break: normal;white-space: pre-wrap;"><span leaf="">// 第二轮：根据起始地址创建实际的基本块对象</span><span leaf=""><br/></span><span leaf="">for (auto blockStart : blockStarts) {</span><span leaf=""><br/></span><span leaf="">    Block currentBlock;</span><span leaf=""><br/></span><span leaf="">    currentBlock.startAddressInFile = blockStart;</span><span leaf=""><br/></span><span leaf="">    currentBlock.startAddressInMemory = func.address + (blockStart - addressInFile);</span><span leaf=""><br/></span><span leaf="">    size_t offset = blockStart - addressInFile;</span><span leaf=""><br/></span><span leaf="">    if (offset &gt;= size) continue;</span><span leaf=""><br/></span><span leaf="">    cs_insn* insn;</span><span leaf=""><br/></span><span leaf="">    size_t count = cs_disasm(handle, addressInMemory + offset,</span><span leaf=""><br/></span><span leaf="">                             size - offset, blockStart, 0, &amp;insn);</span><span leaf=""><br/></span><span leaf="">    if (count == 0) continue;</span><span leaf=""><br/></span><span leaf="">    for (size_t i = 0; i &lt; count; i++) {</span><span leaf=""><br/></span><span leaf="">        auto termType = GetBlockTerminatorType(&amp;insn[i]);</span><span leaf=""><br/></span><span leaf="">        // 如果是终止指令</span><span leaf=""><br/></span><span leaf="">        if (termType != BlockTerminatorType::kNone) {</span><span leaf=""><br/></span><span leaf="">            auto isCondJmp = is_cond_jump(&amp;insn[i]);</span><span leaf=""><br/></span><span leaf="">            currentBlock.terminatorType = termType;</span><span leaf=""><br/></span><span leaf="">            currentBlock.nextBlockAddresses = GetBlockTargets(&amp;insn[i]);</span><span leaf=""><br/></span><span leaf="">            currentBlock.endAddressInFile = insn[i].address + insn[i].size;</span><span leaf=""><br/></span><span leaf="">            currentBlock.endAddressInMemory = func.address + (insn[i].address - addressInFile) + insn[i].size;</span><span leaf=""><br/></span><span leaf="">            // 对于条件跳转，添加顺序执行的下一个块地址</span><span leaf=""><br/></span><span leaf="">            if (isCondJmp &amp;&amp; i + 1 &lt; count) {</span><span leaf=""><br/></span><span leaf="">                currentBlock.nextBlockAddresses.push_back(insn[i + 1].address);</span><span leaf=""><br/></span><span leaf="">            }</span><span leaf=""><br/></span><span leaf="">            // 检查目标的有效性</span><span leaf=""><br/></span><span leaf="">            bool hasValidTarget = false;</span><span leaf=""><br/></span><span leaf="">            for (auto target : currentBlock.nextBlockAddresses) {</span><span leaf=""><br/></span><span leaf="">                if (target &gt;= addressInFile &amp;&amp; target &lt; addressInFile + size) {</span><span leaf=""><br/></span><span leaf="">                    hasValidTarget = true;</span><span leaf=""><br/></span><span leaf="">                    break;</span><span leaf=""><br/></span><span leaf="">                }</span><span leaf=""><br/></span><span leaf="">            }</span><span leaf=""><br/></span><span leaf="">            if (hasValidTarget || termType == BlockTerminatorType::kRet) {</span><span leaf=""><br/></span><span leaf="">                blocks.push_back(std::make_shared&lt;Block&gt;(currentBlock));</span><span leaf=""><br/></span><span leaf="">            }</span><span leaf=""><br/></span><span leaf="">            break;</span><span leaf=""><br/></span><span leaf="">        }</span><span leaf=""><br/></span><span leaf="">        // 如果下一条指令是已知的新块起始点</span><span leaf=""><br/></span><span leaf="">        if (i + 1 &lt; count &amp;&amp; blockStarts.count(insn[i + 1].address) &gt; 0) {</span><span leaf=""><br/></span><span leaf="">            currentBlock.endAddressInFile = insn[i].address + insn[i].size;</span><span leaf=""><br/></span><span leaf="">            currentBlock.terminatorType = BlockTerminatorType::kNone;</span><span leaf=""><br/></span><span leaf="">            currentBlock.endAddressInMemory = func.address + ((insn[i].address + insn[i].size) - addressInFile);</span><span leaf=""><br/></span><span leaf="">            blocks.push_back(std::make_shared&lt;Block&gt;(currentBlock));</span><span leaf=""><br/></span><span leaf="">            break;</span><span leaf=""><br/></span><span leaf="">        }</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span leaf="">    cs_free(insn, count);</span><span leaf=""><br/></span><span leaf="">}</span><span leaf=""><br/></span></code></pre><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"></span><span leaf="">细节 1: 判断块终止符类型</span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">我这边简单的识别了各种类型的返回指令和跳转指令，并将它们映射到对应的终止符类型。值得注意的是，CALL 指令通常不会结束基本块，因为调用完成后控制流会继续。</span></p><pre style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 13.118px;margin-top: 0px;margin-bottom: 1rem;overflow: auto;display: block;color: rgb(33, 37, 41);max-height: 400px;background-color: rgb(245, 245, 245);border: 1px solid rgb(204, 204, 204);padding: 0.5em;border-radius: 4px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><code style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: inherit;color: inherit;word-break: normal;white-space: pre-wrap;"><span leaf="">auto GetBlockTerminatorType(const cs_insn* insn) -&gt; BlockTerminatorType {</span><span leaf=""><br/></span><span leaf="">    if (insn-&gt;id == X86_INS_RET) return BlockTerminatorType::kRet;</span><span leaf=""><br/></span><span leaf="">    if (insn-&gt;id == X86_INS_JMP) return BlockTerminatorType::kJmp;</span><span leaf=""><br/></span><span leaf="">    if (insn-&gt;id == X86_INS_JE) return BlockTerminatorType::kJz;</span><span leaf=""><br/></span><span leaf="">    if (insn-&gt;id == X86_INS_JNE) return BlockTerminatorType::kJnz;</span><span leaf=""><br/></span><span leaf="">    if (insn-&gt;id == X86_INS_JBE) return BlockTerminatorType::kJbe;</span><span leaf=""><br/></span><span leaf="">    if (insn-&gt;id == X86_INS_JB) return BlockTerminatorType::kJb;</span><span leaf=""><br/></span><span leaf="">    if (insn-&gt;id == X86_INS_JS) return BlockTerminatorType::kJs;</span><span leaf=""><br/></span><span leaf="">    if (insn-&gt;id == X86_INS_JO) return BlockTerminatorType::kJ0;</span><span leaf=""><br/></span><span leaf="">    if (insn-&gt;id == X86_INS_JP) return BlockTerminatorType::kJp;</span><span leaf=""><br/></span><span leaf="">    if (insn-&gt;id == X86_INS_JAE) return BlockTerminatorType::kJnb;</span><span leaf=""><br/></span><span leaf="">    // if (insn-&gt;id == X86_INS_CALL) return BlockTerminatorType::kCall;</span><span leaf=""><br/></span><span leaf="">    return BlockTerminatorType::kNone;</span><span leaf=""><br/></span><span leaf="">}</span><span leaf=""><br/></span></code></pre><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"></span><span leaf="">细节 2: 确定跳转目标</span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">我们同时也需要确定跳转指令的目标地址。它处理了两种常见情况:</span><span leaf=""><br/></span><span leaf="">立即数操作数（如 JMP 0x1000）- 直接提取立即数值作为目标地址</span><span leaf=""><br/></span><span leaf="">基于 RIP 的内存操作数（如 JMP [RIP+0x100]）- 计算有效地址</span><span leaf=""><br/></span><span leaf="">此外，对于终止指令，还需要添加下一条指令的地址作为”fall-through”路径。</span></p><pre style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 13.118px;margin-top: 0px;margin-bottom: 1rem;overflow: auto;display: block;color: rgb(33, 37, 41);max-height: 400px;background-color: rgb(245, 245, 245);border: 1px solid rgb(204, 204, 204);padding: 0.5em;border-radius: 4px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><code style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: inherit;color: inherit;word-break: normal;white-space: pre-wrap;"><span leaf="">auto GetBlockTargets(const cs_insn* insn) -&gt; std::vector&lt;uint64_t&gt; {</span><span leaf=""><br/></span><span leaf="">    std::vector&lt;uint64_t&gt; targets;</span><span leaf=""><br/></span><span leaf="">    // 检查指令是否有操作数</span><span leaf=""><br/></span><span leaf="">    if (insn-&gt;detail == nullptr || insn-&gt;detail-&gt;x86.op_count == 0) {</span><span leaf=""><br/></span><span leaf="">        return targets;</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span leaf="">    // 从立即数或内存操作数获取目标地址</span><span leaf=""><br/></span><span leaf="">    const auto&amp; operand = insn-&gt;detail-&gt;x86.operands[0];</span><span leaf=""><br/></span><span leaf="">    if (operand.type == X86_OP_IMM) {</span><span leaf=""><br/></span><span leaf="">        targets.push_back(operand.imm);</span><span leaf=""><br/></span><span leaf="">    } else if (operand.type == X86_OP_MEM &amp;&amp; operand.mem.base == X86_REG_RIP) {</span><span leaf=""><br/></span><span leaf="">        uint64_t nextInstructionAddr = insn-&gt;address + insn-&gt;size;</span><span leaf=""><br/></span><span leaf="">        uint64_t target = nextInstructionAddr + operand.mem.disp;</span><span leaf=""><br/></span><span leaf="">        targets.push_back(target);</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span leaf="">    // 对于条件跳转，也添加下一条指令地址</span><span leaf=""><br/></span><span leaf="">    auto termType = GetBlockTerminatorType(insn);</span><span leaf=""><br/></span><span leaf="">    if (termType != BlockTerminatorType::kNone) {</span><span leaf=""><br/></span><span leaf="">        targets.push_back(insn-&gt;address + insn-&gt;size);</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span leaf="">    return targets;</span><span leaf=""><br/></span><span leaf="">}</span><span leaf=""><br/></span></code></pre><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"></span><span leaf="">细节 3: 判断跳转条件</span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">我们需要一个函数区分条件跳转和无条件跳转。它首先排除无条件跳转（JMP），然后检查指令是否属于跳转组。这对于正确处理控制流至关重要，因为条件跳转会产生两条可能的执行路径。</span></p><pre style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 13.118px;margin-top: 0px;margin-bottom: 1rem;overflow: auto;display: block;color: rgb(33, 37, 41);max-height: 400px;background-color: rgb(245, 245, 245);border: 1px solid rgb(204, 204, 204);padding: 0.5em;border-radius: 4px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><code style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: inherit;color: inherit;word-break: normal;white-space: pre-wrap;"><span leaf="">inline auto is_cond_jump(cs_insn* ins) -&gt; bool {</span><span leaf=""><br/></span><span leaf="">    // 如果是无条件跳转，返回false</span><span leaf=""><br/></span><span leaf="">    if (ins-&gt;id == X86_INS_JMP) return false;</span><span leaf=""><br/></span><span leaf="">    // 遍历指令组</span><span leaf=""><br/></span><span leaf="">    for (int i = 0; i &lt; ins-&gt;detail-&gt;groups_count; i++) {</span><span leaf=""><br/></span><span leaf="">        if (ins-&gt;detail-&gt;groups[i] == X86_GRP_JUMP) return true;</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span leaf="">    return false;</span><span leaf=""><br/></span><span leaf="">}</span><span leaf=""><br/></span></code></pre><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"></span><span leaf="">基本块之间的关系建立</span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">在构建完所有基本块后，我们需要建立它们之间的关系。这是通过记录每个块的后继块地址实现的：</span></p><pre style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 13.118px;margin-top: 0px;margin-bottom: 1rem;overflow: auto;display: block;color: rgb(33, 37, 41);max-height: 400px;background-color: rgb(245, 245, 245);border: 1px solid rgb(204, 204, 204);padding: 0.5em;border-radius: 4px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><code style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: inherit;color: inherit;word-break: normal;white-space: pre-wrap;"><span leaf="">currentBlock.nextBlockAddresses = GetBlockTargets(&amp;insn[i]);</span><span leaf=""><br/></span><span leaf="">// 对于条件跳转，添加顺序执行的下一个块地址</span><span leaf=""><br/></span><span leaf="">if (isCondJmp &amp;&amp; i + 1 &lt; count) {</span><span leaf=""><br/></span><span leaf="">    currentBlock.nextBlockAddresses.push_back(insn[i + 1].address);</span><span leaf=""><br/></span><span leaf="">}</span><span leaf=""><br/></span></code></pre><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">这样，我们就建立了基本块之间的控制流关系，为完整的控制流图（CFG）奠定了基础。</span></p><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"></span><span leaf="">效果展示</span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">这个是这个算法与 IDA 的块对比截图,基本上 1:1 还原了 IDA 的块构建:</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001663" class="rich_pages wxw-img" data-ratio="0.4648148148148148" data-type="jpeg" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=12f3bf89&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FejibWMxI7nWIdtrt4kzb38IAasb7XFry10U4Z5UrCcZNXuiavdqANG0mLLjuo9VKnm4n1AMB0wbOOMOzwjKO657Q%2F640%3Fwx_fmt%3Djpeg%26from%3Dappmsg"/></span></p><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"></span><span leaf="">其他待解决问题</span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">目前来说,我们还需要处理:</span></p><ol style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" class="list-paddingleft-1"><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">表驱动跳转：使用跳转表（jump table）实现 switch 语句</span></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">内联汇编：可能包含非标准的控制流转移</span></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">异常处理：try-catch 结构创建的隐式控制流</span></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">间接跳转：通过寄存器或内存中的地址进行跳转</span><span leaf=""><br/></span><span leaf="">这几个也是现代混淆引擎最喜欢操作的部分,属于混淆-反混淆对抗阶段.如果这个系列反响还不错,我会单独出一期介绍一些主流的方法</span></p></li></ol><h1 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2.5rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"></span><span leaf="">函数参数识别</span></h1><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">我们必须要知道一个事实是, 在没 PDB 之前，是没有一个准确的函数识别办法的，现如今所有的办法都是启发式的办法，</span><strong style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-weight: bolder;"><span leaf="">这也是为什么逆向工具在遇到混淆的时候会拉闸</span></strong><span leaf="">。我们这边不介绍复杂的启发算法，只说一个简单的： </span><strong style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-weight: bolder;"><span leaf="">堆栈遍历+模式匹配</span></strong><span leaf=""> (只说 X64 的)</span></p><blockquote style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin: 5px 0px 15px;overflow: hidden;border-width: 0px 0px 0px 4px;border-top-style: initial;border-right-style: initial;border-bottom-style: initial;border-left-style: solid;border-top-color: initial;border-right-color: initial;border-bottom-color: initial;border-left-color: rgb(122, 208, 58);border-image: initial;padding: 8px 12px;background-color: rgb(241, 241, 241);box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 1px 0px;font-size: 14.992px;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;"><span leaf="">注意只是大概,目前没有任何靠谱办法除了不用 PDB 的情况下识别出参数,这也是为什么 IDA 也不准确</span></p></blockquote><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">我喜欢把这个方法叫做,stackwalker</span></p><h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"></span><span leaf="">stackwalker</span></h2><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">你可能觉得不可思议,其实他的原理非常简单(其实我想破脑袋才想出来的):</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">第一遍：收集所有栈访问</span><span leaf=""><br/></span><span leaf="">第二遍：分析参数使用情况</span><span leaf=""><br/></span><span leaf="">第三遍: 转换为vector并排序</span></p><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"></span><span leaf="">第一遍：收集所有栈访问</span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">他的原理很简单,我们统计一下是不是在序言里面,如果在prologue前,一定是参数(“启发式”),并且我们要找到rsp的adjust值,用来计算rsp和rbp的Δ,因为可能rbp,rsp操控的对象是一个var</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">它本质上是一个大号的模式匹配,匹配出来序言前的变量,这些一定是参数</span></p><pre style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 13.118px;margin-top: 0px;margin-bottom: 1rem;overflow: auto;display: block;color: rgb(33, 37, 41);max-height: 400px;background-color: rgb(245, 245, 245);border: 1px solid rgb(204, 204, 204);padding: 0.5em;border-radius: 4px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><code style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: inherit;color: inherit;word-break: normal;white-space: pre-wrap;"><span leaf="">    for (auto&amp; theBlocks : func-&gt;llil_blocks) {</span><span leaf=""><br/></span><span leaf="">        const auto blockItem = theBlocks.get();</span><span leaf=""><br/></span><span leaf="">        for (auto&amp; llil_ins : blockItem-&gt;instructions) {</span><span leaf=""><br/></span><span leaf="">            if (firstBlockWalked == false &amp;&amp; func-&gt;inPrologue) {</span><span leaf=""><br/></span><span leaf="">                if (llil_ins-&gt;type == LLIL::LLILInstruction::ARITHMETIC &amp;&amp;</span><span leaf=""><br/></span><span leaf="">                    llil_ins-&gt;op == LLIL::LLILInstruction::Operation::ADD) {</span><span leaf=""><br/></span><span leaf="">                    func-&gt;stackAdjustment += 8;</span><span leaf=""><br/></span><span leaf="">                    if (!llil_ins-&gt;operands.empty() &amp;&amp;</span><span leaf=""><br/></span><span leaf="">                        llil_ins-&gt;operands[0]-&gt;type ==</span><span leaf=""><br/></span><span leaf="">                            LLIL::LLILOperand::REGISTER &amp;&amp;</span><span leaf=""><br/></span><span leaf="">                        llil_ins-&gt;operands[0]-&gt;value == &#34;rbp&#34;) {</span><span leaf=""><br/></span><span leaf="">                        func-&gt;foundPushRbp = true;</span><span leaf=""><br/></span><span leaf="">                    }</span><span leaf=""><br/></span><span leaf="">                } else if (llil_ins-&gt;type ==</span><span leaf=""><br/></span><span leaf="">                               LLIL::LLILInstruction::ARITHMETIC &amp;&amp;</span><span leaf=""><br/></span><span leaf="">                           llil_ins-&gt;op ==</span><span leaf=""><br/></span><span leaf="">                               LLIL::LLILInstruction::Operation::SUB &amp;&amp;</span><span leaf=""><br/></span><span leaf="">                           llil_ins-&gt;operands.size() &gt;= 2 &amp;&amp;</span><span leaf=""><br/></span><span leaf="">                           llil_ins-&gt;operands[0]-&gt;type ==</span><span leaf=""><br/></span><span leaf="">                               LLIL::LLILOperand::REGISTER &amp;&amp;</span><span leaf=""><br/></span><span leaf="">                           llil_ins-&gt;operands[0]-&gt;value == &#34;rsp&#34; &amp;&amp;</span><span leaf=""><br/></span><span leaf="">                           llil_ins-&gt;operands[1]-&gt;type ==</span><span leaf=""><br/></span><span leaf="">                               LLIL::LLILOperand::IMMEDIATE) {</span><span leaf=""><br/></span><span leaf="">                    func-&gt;stackAdjustment += llil_ins-&gt;operands[1]-&gt;immediate;</span><span leaf=""><br/></span><span leaf="">                    func-&gt;inPrologue = false;</span><span leaf=""><br/></span><span leaf="">                } else if (llil_ins-&gt;type == LLIL::LLILInstruction::LEA &amp;&amp;</span><span leaf=""><br/></span><span leaf="">                           llil_ins-&gt;operands.size() &gt;= 2 &amp;&amp;</span><span leaf=""><br/></span><span leaf="">                           llil_ins-&gt;operands[0]-&gt;type ==</span><span leaf=""><br/></span><span leaf="">                               LLIL::LLILOperand::REGISTER &amp;&amp;</span><span leaf=""><br/></span><span leaf="">                           llil_ins-&gt;operands[0]-&gt;value == &#34;rbp&#34; &amp;&amp;</span><span leaf=""><br/></span><span leaf="">                           llil_ins-&gt;operands[1]-&gt;type ==</span><span leaf=""><br/></span><span leaf="">                               LLIL::LLILOperand::MEMORY &amp;&amp;</span><span leaf=""><br/></span><span leaf="">                           llil_ins-&gt;operands[1]-&gt;base == &#34;rsp&#34;) {</span><span leaf=""><br/></span><span leaf="">                    func-&gt;rbpRspOffset = llil_ins-&gt;operands[1]-&gt;offset;</span><span leaf=""><br/></span><span leaf="">                    func-&gt;inPrologue = false;</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="">            auto processMemOperand = [&amp;](const LLIL::LLILOperand op,</span><span leaf=""><br/></span><span leaf="">                                         bool isDest) {</span><span leaf=""><br/></span><span leaf="">                if (op.type != LLIL::LLILOperand::MEMORY) return;</span><span leaf=""><br/></span><span leaf="">                int64_t offset;</span><span leaf=""><br/></span><span leaf="">                if (op.base == &#34;rsp&#34;) {</span><span leaf=""><br/></span><span leaf="">                    offset = op.offset;</span><span leaf=""><br/></span><span leaf="">                } else if (op.base == &#34;rbp&#34;) {</span><span leaf=""><br/></span><span leaf="">                    offset = func-&gt;stackAdjustment - op.offset;</span><span leaf=""><br/></span><span leaf="">                } else {</span><span leaf=""><br/></span><span leaf="">                    return;</span><span leaf=""><br/></span><span leaf="">                }</span><span leaf=""><br/></span><span leaf="">                StackAccess access;</span><span leaf=""><br/></span><span leaf="">                access.isRead = !isDest;</span><span leaf=""><br/></span><span leaf="">                access.isLea = llil_ins-&gt;type == LLIL::LLILInstruction::LEA;</span><span leaf=""><br/></span><span leaf="">                access.insIndex = insIndex;</span><span leaf=""><br/></span><span leaf="">                access.isBeforePrologue = func-&gt;inPrologue;</span><span leaf=""><br/></span><span leaf="">                access.ins = llil_ins.get();</span><span leaf=""><br/></span><span leaf="">                stackAccesses[offset].push_back(access);</span><span leaf=""><br/></span><span leaf="">            };</span><span leaf=""><br/></span><span leaf="">            // 在处理序言中的参数保存指令时</span><span leaf=""><br/></span><span leaf="">            if (func-&gt;inPrologue &amp;&amp;</span><span leaf=""><br/></span><span leaf="">                llil_ins-&gt;type == LLIL::LLILInstruction::ASSIGN) {</span><span leaf=""><br/></span><span leaf="">                // 如果是写入操作，记录目标偏移</span><span leaf=""><br/></span><span leaf="">                for (auto&amp; op : llil_ins-&gt;operands) {</span><span leaf=""><br/></span><span leaf="">                    if (op-&gt;type == LLIL::LLILOperand::MEMORY &amp;&amp;</span><span leaf=""><br/></span><span leaf="">                        op-&gt;base == &#34;rsp&#34;) {</span><span leaf=""><br/></span><span leaf="">                        /*</span><span leaf=""><br/></span><span leaf="">                        int64_t targetOffset =</span><span leaf=""><br/></span><span leaf="">                            op-&gt;base == &#34;rsp&#34;</span><span leaf=""><br/></span><span leaf="">                                ? op-&gt;offset</span><span leaf=""><br/></span><span leaf="">                                : func-&gt;stackAdjustment - op-&gt;offset;</span><span leaf=""><br/></span><span leaf="">                        */</span><span leaf=""><br/></span><span leaf="">                        handledOffsets.insert(op-&gt;offset);</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="">            if (llil_ins-&gt;type == LLIL::LLILInstruction::ASSIGN) {</span><span leaf=""><br/></span><span leaf="">                if (llil_ins-&gt;operands.size() &gt;= 2) {</span><span leaf=""><br/></span><span leaf="">                    processMemOperand(*llil_ins-&gt;operands[0], true);   // dest</span><span leaf=""><br/></span><span leaf="">                    processMemOperand(*llil_ins-&gt;operands[1], false);  // src</span><span leaf=""><br/></span><span leaf="">                }</span><span leaf=""><br/></span><span leaf="">            } else {</span><span leaf=""><br/></span><span leaf="">                //   恢复栈指针</span><span leaf=""><br/></span><span leaf="">                //   lea     rsp, [rbp+0xc8]</span><span leaf=""><br/></span><span leaf="">                if (llil_ins-&gt;operands.size() &gt;= 2) {</span><span leaf=""><br/></span><span leaf="">                    if (llil_ins-&gt;operands[0]-&gt;value == &#34;rsp&#34; &amp;&amp;</span><span leaf=""><br/></span><span leaf="">                        llil_ins-&gt;operands[1]-&gt;base == &#34;rbp&#34;) {</span><span leaf=""><br/></span><span leaf="">                        continue;</span><span leaf=""><br/></span><span leaf="">                    }</span><span leaf=""><br/></span><span leaf="">                }</span><span leaf=""><br/></span><span leaf="">                for (const auto&amp; op : llil_ins-&gt;operands) {</span><span leaf=""><br/></span><span leaf="">                    processMemOperand(*op, false);</span><span leaf=""><br/></span><span leaf="">                }</span><span leaf=""><br/></span><span leaf="">            }</span><span leaf=""><br/></span><span leaf="">            insIndex++;</span><span leaf=""><br/></span><span leaf="">        }</span><span leaf=""><br/></span><span leaf="">        firstBlockWalked = true;  // 标记已经处理过第一个块</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span></code></pre><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">然后对于 序言里面拷贝rcx什么的到栈的操作,一律算参数</span></p><pre style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 13.118px;margin-top: 0px;margin-bottom: 1rem;overflow: auto;display: block;color: rgb(33, 37, 41);max-height: 400px;background-color: rgb(245, 245, 245);border: 1px solid rgb(204, 204, 204);padding: 0.5em;border-radius: 4px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><code style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: inherit;color: inherit;word-break: normal;white-space: pre-wrap;"><span leaf="">// 序言里面拷贝rcx什么的到栈的操作</span><span leaf=""><br/></span><span leaf="">    /*</span><span leaf=""><br/></span><span leaf="">        140012510  44894c2420         mov     dword [rsp+0x20 {arg_20}], r9d</span><span leaf=""><br/></span><span leaf="">        140012515  4489442418         mov     dword [rsp+0x18 {arg_18}], r8d</span><span leaf=""><br/></span><span leaf="">        14001251a  89542410           mov     dword [rsp+0x10 {arg_10}], edx</span><span leaf=""><br/></span><span leaf="">        14001251e  894c2408           mov     dword [rsp+0x8 {arg_8}], ecx</span><span leaf=""><br/></span><span leaf="">        140012522  55                 push    rbp {__saved_rbp}</span><span leaf=""><br/></span><span leaf="">        140012523  57                 push    rdi {__saved_rdi}</span><span leaf=""><br/></span><span leaf="">    */</span><span leaf=""><br/></span><span leaf="">    // bool isInPrologue = handledOffsets.find(offset) !=</span><span leaf=""><br/></span><span leaf="">    // handledOffsets.end();</span><span leaf=""><br/></span><span leaf="">    for (auto&amp; offsetAddr : handledOffsets) {</span><span leaf=""><br/></span><span leaf="">        auto info = std::make_shared&lt;ParamInfo&gt;();</span><span leaf=""><br/></span><span leaf="">        auto theVars = std::make_shared&lt;_FuncVariableInfo&gt;();</span><span leaf=""><br/></span><span leaf="">        info-&gt;offset = offsetAddr;</span><span leaf=""><br/></span><span leaf="">        info-&gt;confidence = 1.f;</span><span leaf=""><br/></span><span leaf="">        info-&gt;insMemAddress = 0;</span><span leaf=""><br/></span><span leaf="">        info-&gt;regIndex = getRegIndexByOffset(offsetAddr);</span><span leaf=""><br/></span><span leaf="">        paramsByOffset[offsetAddr] = info;</span><span leaf=""><br/></span><span leaf="">        theVars-&gt;rawName = &#34;param_&#34; + std::to_string(varIndex);</span><span leaf=""><br/></span><span leaf="">        theVars-&gt;beautifullyName = theVars-&gt;rawName;</span><span leaf=""><br/></span><span leaf="">        theVars-&gt;offset = info-&gt;offset;</span><span leaf=""><br/></span><span leaf="">        theVars-&gt;regIndex = info-&gt;regIndex;</span><span leaf=""><br/></span><span leaf="">        theVars-&gt;insMemAddress = info-&gt;insMemAddress;</span><span leaf=""><br/></span><span leaf="">        func-&gt;funcVars[offsetAddr] = theVars;</span><span leaf=""><br/></span><span leaf="">        varIndex += 1;</span><span leaf=""><br/></span><span leaf="">        func-&gt;ParamInfo.push_back(info);</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span></code></pre><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"></span><span leaf="">第二遍：分析参数</span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">然后我们分析我们捕获的所有栈访问的情况,标注这些是参数,还是无用的变量,没很复杂,基本上lea+不是在序言用的就是参数,否则只是变量,核心代码如下:</span></p><pre style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 13.118px;margin-top: 0px;margin-bottom: 1rem;overflow: auto;display: block;color: rgb(33, 37, 41);max-height: 400px;background-color: rgb(245, 245, 245);border: 1px solid rgb(204, 204, 204);padding: 0.5em;border-radius: 4px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><code style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: inherit;color: inherit;word-break: normal;white-space: pre-wrap;"><span leaf="">    for (const auto&amp; [offset, accesses] : stackAccesses) {</span><span leaf=""><br/></span><span leaf="">        // if (offset &lt; 0x8 || (offset % 8) != 0) continue;</span><span leaf=""><br/></span><span leaf="">        bool hasRealAccess = false;</span><span leaf=""><br/></span><span leaf="">        bool onlyLea = true;</span><span leaf=""><br/></span><span leaf="">        bool usedBeforePrologue = false;</span><span leaf=""><br/></span><span leaf="">        uint64_t firstAccessAddr = 0;</span><span leaf=""><br/></span><span leaf="">        for (const auto&amp; access : accesses) {</span><span leaf=""><br/></span><span leaf="">            if (!access.isLea) {</span><span leaf=""><br/></span><span leaf="">                hasRealAccess = true;</span><span leaf=""><br/></span><span leaf="">                onlyLea = false;</span><span leaf=""><br/></span><span leaf="">            }</span><span leaf=""><br/></span><span leaf="">            if (access.isBeforePrologue) {  // 假设前5条指令是prologue之前</span><span leaf=""><br/></span><span leaf="">                usedBeforePrologue = true;</span><span leaf=""><br/></span><span leaf="">            }</span><span leaf=""><br/></span><span leaf="">            if (firstAccessAddr == 0) {</span><span leaf=""><br/></span><span leaf="">                firstAccessAddr = access.ins-&gt;address;</span><span leaf=""><br/></span><span leaf="">            }</span><span leaf=""><br/></span><span leaf="">        }</span><span leaf=""><br/></span><span leaf="">        auto theVars = std::make_shared&lt;_FuncVariableInfo&gt;();</span><span leaf=""><br/></span><span leaf="">        auto info = std::make_shared&lt;ParamInfo&gt;();</span><span leaf=""><br/></span><span leaf="">        info-&gt;offset = offset;</span><span leaf=""><br/></span><span leaf="">        info-&gt;confidence = 0.6f;</span><span leaf=""><br/></span><span leaf="">        info-&gt;insMemAddress = firstAccessAddr;</span><span leaf=""><br/></span><span leaf="">        info-&gt;regIndex = getRegIndexByOffset(offset);</span><span leaf=""><br/></span><span leaf="">        if (accesses[0].isLea == false &amp;&amp; usedBeforePrologue) {</span><span leaf=""><br/></span><span leaf="">            paramsByOffset[offset] = info;</span><span leaf=""><br/></span><span leaf="">            theVars-&gt;rawName = &#34;param_&#34; + std::to_string(varIndex);</span><span leaf=""><br/></span><span leaf="">        } else {</span><span leaf=""><br/></span><span leaf="">            theVars-&gt;rawName = &#34;var_&#34; + std::to_string(varIndex);</span><span leaf=""><br/></span><span leaf="">        }</span><span leaf=""><br/></span><span leaf="">        theVars-&gt;beautifullyName = theVars-&gt;rawName;</span><span leaf=""><br/></span><span leaf="">        theVars-&gt;offset = info-&gt;offset;</span><span leaf=""><br/></span><span leaf="">        theVars-&gt;regIndex = info-&gt;regIndex;</span><span leaf=""><br/></span><span leaf="">        theVars-&gt;insMemAddress = info-&gt;insMemAddress;</span><span leaf=""><br/></span><span leaf="">        func-&gt;funcVars[offset] = theVars;</span><span leaf=""><br/></span><span leaf="">        varIndex += 1;</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span></code></pre><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"></span><span leaf="">最后排个序就行</span></h3><pre style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 13.118px;margin-top: 0px;margin-bottom: 1rem;overflow: auto;display: block;color: rgb(33, 37, 41);max-height: 400px;background-color: rgb(245, 245, 245);border: 1px solid rgb(204, 204, 204);padding: 0.5em;border-radius: 4px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><code style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: inherit;color: inherit;word-break: normal;white-space: pre-wrap;"><span leaf="">   // 转换为vector并排序</span><span leaf=""><br/></span><span leaf="">    // func-&gt;ParamInfo.clear();</span><span leaf=""><br/></span><span leaf="">    // 大于四的情况下,寄存器那组传参会保存到栈上.但是地址会和之前的冲突,导致我们ParamInfo只有四个,实际寄存器已经传参了</span><span leaf=""><br/></span><span leaf="">    if (paramsByOffset.size() &gt; 4) {</span><span leaf=""><br/></span><span leaf="">        for (const auto&amp; [offset, param] : paramsByOffset) {</span><span leaf=""><br/></span><span leaf="">            func-&gt;ParamInfo.push_back(param);</span><span leaf=""><br/></span><span leaf="">        }</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span leaf="">    std::sort(func-&gt;ParamInfo.begin(), func-&gt;ParamInfo.end(),</span><span leaf=""><br/></span><span leaf="">              [](const std::shared_ptr&lt;ParamInfo&gt;&amp; a,</span><span leaf=""><br/></span><span leaf="">                 const std::shared_ptr&lt;ParamInfo&gt;&amp; b) {</span><span leaf=""><br/></span><span leaf="">                  if (a-&gt;regIndex != -1 &amp;&amp; b-&gt;regIndex != -1)</span><span leaf=""><br/></span><span leaf="">                      return a-&gt;regIndex &lt; b-&gt;regIndex;</span><span leaf=""><br/></span><span leaf="">                  if (a-&gt;regIndex != -1) return true;</span><span leaf=""><br/></span><span leaf="">                  if (b-&gt;regIndex != -1) return false;</span><span leaf=""><br/></span><span leaf="">                  return a-&gt;offset &lt; b-&gt;offset;</span><span leaf=""><br/></span><span leaf="">              });</span><span leaf=""><br/></span><span leaf="">    func-&gt;ParamNum = func-&gt;ParamInfo.size();</span><span leaf=""><br/></span></code></pre><h3 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 1.75rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"></span><span leaf="">效果:</span></h3><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">我们正确的显示了参数列表:</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001659" class="rich_pages wxw-img" data-ratio="0.14573991031390135" data-type="png" data-w="892" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=bd48560b&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIdtrt4kzb38IAasb7XFry1CWQPCaicmWicccicypsQ3RXVke3fkyibfRFmdPWHOTOiclwyibcoH20VNicMw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">ida的:</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001664" class="rich_pages wxw-img" data-ratio="0.1689259645464025" data-type="png" data-w="959" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=707319a0&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIdtrt4kzb38IAasb7XFry16K41QFLVMVuq7YHenlsonDGVJEpx9HLMRpz21OsvlbJlQzibqyzujcg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><h1 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2.5rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf="">提升为Low-level il</span></h1><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">在有了blocks/参数/calls后,我们终于可以开始正式的提升了,所谓提升,就是把汇编变成与平台无关的il.要是允许,我们可以x86提,x64提,arm提,跟平台无关.</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=""><img data-imgfileid="100001666" class="rich_pages wxw-img" data-ratio="1.1901408450704225" data-type="png" data-w="710" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=9d730dbf&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIdtrt4kzb38IAasb7XFry1a0mDnCjUE8bvftYDlbl6V9YPHKddM4TbfGVkEN2UrSBUt3TFKF4PvQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">指令里面包含操作数</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001665" class="rich_pages wxw-img" data-ratio="0.6906077348066298" data-type="png" data-w="905" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=0d958c62&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIdtrt4kzb38IAasb7XFry13dgMWwhcnuE4rgI3OMMN8BVd5Rjyp0XfgUOVwWY8lY82micZwV7lmKA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">以及一些其他信息,比如计算操作所需要的,左边右边.以及CF影响</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001667" class="rich_pages wxw-img" data-ratio="0.6412825651302605" data-type="png" data-w="998" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=055f6b43&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIdtrt4kzb38IAasb7XFry1FEX99qmK1Sx95cppORHicoMh14Sibicty5NYe9ib8hxUzznqDwcmibtdjdQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">一些有意思的指令:</span></p><h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"></span><span leaf="">memset</span></h2><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">在asm2llil的过程中,我们可以处理一些有意思的指令,比如 rep stosd这种,我们可以处理一下标记为memset</span><span leaf=""><br/></span><span leaf="">stosdrep</span></p><h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"></span><span leaf="">call</span></h2><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">call需要特殊处理标记一下目标地址,原因是一些函数,其实是空客(你ida里面经常看得到的j_subxxx就是warper函数,纯空壳),所以也要特殊处理一下,之后的mlil用：</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" nodeleaf=""><img data-imgfileid="100001669" class="rich_pages wxw-img" data-ratio="0.7842592592592592" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=631b916c&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIdtrt4kzb38IAasb7XFry1ia4h1boxdLmLPbNyZQ7rT9rIvh6a3BylAibLfr7ob20055TGSlkUib1BQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"></span><span leaf="">跳转</span></h2><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">值得注意的是,跳转我们需要特殊处理一下,毕竟涉及到后续的if</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001668" class="rich_pages wxw-img" data-ratio="0.946969696969697" data-type="png" data-w="924" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=dfb5331a&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIdtrt4kzb38IAasb7XFry1XTU6JqtcX4qQ8GibyoxwBgjC7MozzP7uoVWDGrE1j28CGazsekHPYCA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">如果上一个命令,是影响跳转的,比如cmp/sub,那么100%就是跳转了:</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001674" class="rich_pages wxw-img" data-ratio="0.9181818181818182" data-type="png" data-w="990" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=ec003d47&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIdtrt4kzb38IAasb7XFry1vlAJZWZTruiaZtdEnecVqMAiaycOILZNgpFoJONvdoudVhcO1gqeTKtQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">这一块我们需要稍微标记一下</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001671" class="rich_pages wxw-img" data-ratio="0.721205597416577" data-type="png" data-w="929" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=11b91f3c&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIdtrt4kzb38IAasb7XFry1TbwRiaHicpaLj55lmwkhlXP0X2Ge1dN4Cib1mHEBUIdQh3zEj5kb8B8Hg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">剩下的还是体力活了~ 还好现在AI发达,赛博搬砖了这块</span></p><h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"></span><span leaf="">体力活</span></h2><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">然后就是纯体力活了,这块没有一丝技术</span><span leaf=""><br/></span><span leaf="">暴力枚举capstone的指令(枚举不了的,就直接当汇编显示了之后,现在你知道ida的什么asm { vmwrite }指令块咋来的了吧):</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001673" class="rich_pages wxw-img" data-ratio="0.9248269040553907" data-type="png" data-w="1011" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=be6051e0&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIdtrt4kzb38IAasb7XFry1wZwAibeHaAo8cicjQ3XiaaxtDWN6PJzyVb68IpCNiaE8Hdau7dygslZRew%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">比如mov这一类,属于ASSIGN</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001672" class="rich_pages wxw-img" data-ratio="0.8193018480492813" data-type="png" data-w="974" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=99de4191&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIdtrt4kzb38IAasb7XFry1nKricic8Pxk58SnicuLRzlpj96RFQps0dRaOpjZ7v3UK46GBsE4kr8gkQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">push单独一下</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001670" class="rich_pages wxw-img" data-ratio="0.6386292834890965" data-type="png" data-w="963" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=85dcb59d&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIdtrt4kzb38IAasb7XFry1y3XnO5jK0l9LKJuvqPH5ciatXMib2TQvHDnRblukkKLpgqNfl91MlOJA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><span leaf=""><br/></span><span leaf="">计算属于ARITHMETIC</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001675" class="rich_pages wxw-img" data-ratio="1.230566534914361" data-type="png" data-w="759" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=a5c68e1d&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIdtrt4kzb38IAasb7XFry1XibCoA2iaBQoIMOpOh4duMW4GQ1NEfmwJajIDanYuyMVMVNG44F3l3UQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"></span><span leaf="">测试</span></h2><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">最后剩下的就是这样(忽略这些残缺的打印,这个是很早期的实现了,那会指令还没补全):</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001676" class="rich_pages wxw-img" data-ratio="0.4775828460038986" data-type="jpeg" data-w="1026" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=92c592a5&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FejibWMxI7nWIdtrt4kzb38IAasb7XFry10e8lAR2NdNT1RZAg2MrjovVbtKicrpzADbxPTeW39bKyV1CYN9577icA%2F640%3Fwx_fmt%3Djpeg%26from%3Dappmsg"/></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">我们就完成了基本的asm2llil了,后续一系列操作都围绕这个llil进行</span></p><h1 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2.5rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf="">提升为Middle-level il</span></h1><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">llil可以说是为了我们后续整个打好基础,而mlil让我们可以做一些基本操作,从而优化掉llil.</span><span leaf=""><br/></span><span leaf="">由于有llil的苦逼体力搬砖,我们mlil的操作将变成非常容易.实际上他就是合并一些LLIL指令</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001677" class="rich_pages wxw-img" data-ratio="0.8952380952380953" data-type="png" data-w="1050" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=ddea0283&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIdtrt4kzb38IAasb7XFry1icQtrnW3MwVib5ibTJQPHgzAMt8WkiclqGEg8jNTib6iaOsPz6bu0JJQoMqA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"></span><span leaf="">call合并</span></h2><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">如你所见,在llil中我们是没有call的信息的(比如call的几个参数,几个变量被拿去call了).而在mlil里面,我们可以做到,如果是IAT,我们则直接标注符号,如果是未知的函数,我们直接取目标函数的信息,然后通过目标函数的参数数量,去推算出参数数量</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001678" class="rich_pages wxw-img" data-ratio="0.8298507462686567" data-type="png" data-w="1005" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=6aed469e&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIdtrt4kzb38IAasb7XFry1eqRDQT3qR5H7IxNictSj3bTFOGCAgicQGmEMZAITCB92EUoz1UlQ4ZGA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">当然这个call做得我不满意,原因是:</span></p><ol style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" class="list-paddingleft-1"><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">对于IAT来说,我们不应该猜测IAT的函数数量,而是直接找.h文件,因为我们怎么猜测都没.h文件的准,实际上ida,BN都是由这些定义符号的,但是,懒了</span></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">对于目标call来说,我们需要做第二次call参数修正,即调用栈参数修正,两个比对,才能正确的比对出参数,如您所见,我没做,因为懒了,这样会导致一个问题,memcall(比如ida里面常见的 v1(xxx,xxx,xxx) 变量call,我们拿不到参数.也会解析失败)但是你懂的,懒了.</span></p></li></ol><h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"></span><span leaf="">jcc合并</span></h2><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">这非常关键,因为我们的ifelse,dowhile都离不开jcc的合并识别,为了实现识别”if去哪”,我们需要</span></p><ol style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;" class="list-paddingleft-1"><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">处理比较操作 (CMP, TEST)</span></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">检查这个COMPARE指令是否被后面的条件跳转使用</span></p></li><li style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"><p><span leaf="">在当前块中查找下一个指令</span></p></li></ol><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">这样我们才能知道”跳哪”</span></p><pre style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: 13.118px;margin-top: 0px;margin-bottom: 1rem;overflow: auto;display: block;color: rgb(33, 37, 41);max-height: 400px;background-color: rgb(245, 245, 245);border: 1px solid rgb(204, 204, 204);padding: 0.5em;border-radius: 4px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><code style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);font-family: SFMono-Regular, Menlo, Monaco, Consolas, &#34;Liberation Mono&#34;, &#34;Courier New&#34;, monospace;font-size: inherit;color: inherit;word-break: normal;white-space: pre-wrap;"><span leaf="">if (llil_ins-&gt;type == LLIL::LLILInstruction::COMPARE) {</span><span leaf=""><br/></span><span leaf="">                // 处理比较操作 (CMP, TEST)</span><span leaf=""><br/></span><span leaf="">                // 检查这个COMPARE指令是否被后面的条件跳转使用</span><span leaf=""><br/></span><span leaf="">                bool isUsedByCondJmp = false;</span><span leaf=""><br/></span><span leaf="">                // 在当前块中查找下一个指令</span><span leaf=""><br/></span><span leaf="">                auto currentBlock = llil_block;</span><span leaf=""><br/></span><span leaf="">                auto currentIt =</span><span leaf=""><br/></span><span leaf="">                    std::find(currentBlock-&gt;instructions.begin(),</span><span leaf=""><br/></span><span leaf="">                              currentBlock-&gt;instructions.end(), llil_ins);</span><span leaf=""><br/></span><span leaf="">                if (currentIt != currentBlock-&gt;instructions.end()) {</span><span leaf=""><br/></span><span leaf="">                    auto nextIt = std::next(currentIt);</span><span leaf=""><br/></span><span leaf="">                    if (nextIt != currentBlock-&gt;instructions.end()) {</span><span leaf=""><br/></span><span leaf="">                        auto nextIns = *nextIt;</span><span leaf=""><br/></span><span leaf="">                        if (nextIns-&gt;type == LLIL::LLILInstruction::COND_JUMP) {</span><span leaf=""><br/></span><span leaf="">                            // 检查条件跳转是否使用了这个COMPARE的结果</span><span leaf=""><br/></span><span leaf="">                            // 在x86架构中，CMP指令后紧跟的条件跳转通常会使用CMP设置的状态标志</span><span leaf=""><br/></span><span leaf="">                            isUsedByCondJmp = true;</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="">                if (isUsedByCondJmp) {</span><span leaf=""><br/></span><span leaf="">                    // 如果COMPARE被条件跳转使用，则标记为已优化，不显示</span><span leaf=""><br/></span><span leaf="">                    mlil_ins-&gt;type = MLILInstruction::kOptimized_already_ASSIGN;</span><span leaf=""><br/></span><span leaf="">                } else {</span><span leaf=""><br/></span><span leaf="">                    // 否则正常处理为ARITHMETIC操作</span><span leaf=""><br/></span><span leaf="">                    mlil_ins-&gt;type = MLILInstruction::ARITHMETIC;</span><span leaf=""><br/></span><span leaf="">                    mlil_ins-&gt;op = MLILInstruction::</span><span leaf=""><br/></span><span leaf="">                        SUB;  // 比较操作实际上是减法但不保存结果</span><span leaf=""><br/></span><span leaf="">                    for (auto&amp; llil_op : llil_ins-&gt;operands) {</span><span leaf=""><br/></span><span leaf="">                        auto mlil_op = std::make_shared&lt;MLILOperand&gt;();</span><span leaf=""><br/></span><span leaf="">                        mlil_op-&gt;add_in_file = llil_op-&gt;add_in_file;</span><span leaf=""><br/></span><span leaf="">                        mlil_op-&gt;add_in_mem = llil_op-&gt;add_in_mem;</span><span leaf=""><br/></span><span leaf="">                        if (llil_op-&gt;type == LLIL::LLILOperand::MEMORY) {</span><span leaf=""><br/></span><span leaf="">                            int64_t targetOffset =</span><span leaf=""><br/></span><span leaf="">                                llil_op-&gt;base == &#34;rsp&#34;</span><span leaf=""><br/></span><span leaf="">                                    ? llil_op-&gt;offset</span><span leaf=""><br/></span><span leaf="">                                    : func-&gt;stackAdjustment - llil_op-&gt;offset;</span><span leaf=""><br/></span><span leaf="">                            if (func-&gt;funcVars.find(targetOffset) ==</span><span leaf=""><br/></span><span leaf="">                                func-&gt;funcVars.end()) {</span><span leaf=""><br/></span><span leaf="">                                if (llil_op-&gt;base == &#34;rsp&#34; ||</span><span leaf=""><br/></span><span leaf="">                                    llil_op-&gt;base == &#34;rbp&#34;) {</span><span leaf=""><br/></span><span leaf="">                                    __debugbreak();</span><span leaf=""><br/></span><span leaf="">                                    continue;</span><span leaf=""><br/></span><span leaf="">                                }</span><span leaf=""><br/></span><span leaf="">                                // not a variable, must be registry base access</span><span leaf=""><br/></span><span leaf="">                                mlil_op-&gt;base_reg = llil_op-&gt;base;</span><span leaf=""><br/></span><span leaf="">                                {</span><span leaf=""><br/></span><span leaf="">                                    std::stringstream ss;</span><span leaf=""><br/></span><span leaf="">                                    ss &lt;&lt; std::showbase &lt;&lt; std::hex</span><span leaf=""><br/></span><span leaf="">                                       &lt;&lt; llil_op-&gt;offset;</span><span leaf=""><br/></span><span leaf="">                                    mlil_op-&gt;base_index = ss.str();</span><span leaf=""><br/></span><span leaf="">                                }</span><span leaf=""><br/></span><span leaf="">                                mlil_op-&gt;type =</span><span leaf=""><br/></span><span leaf="">                                    MLILOperand::kREGISTER_BASE_ACCESS;</span><span leaf=""><br/></span><span leaf="">                            } else {</span><span leaf=""><br/></span><span leaf="">                                mlil_op-&gt;type = MLILOperand::kVar;</span><span leaf=""><br/></span><span leaf="">                                mlil_op-&gt;variableInfo =</span><span leaf=""><br/></span><span leaf="">                                    func-&gt;funcVars[targetOffset];</span><span leaf=""><br/></span><span leaf="">                            }</span><span leaf=""><br/></span><span leaf="">                        } else if (llil_op-&gt;type ==</span><span leaf=""><br/></span><span leaf="">                                   LLIL::LLILOperand::IMMEDIATE) {</span><span leaf=""><br/></span><span leaf="">                            mlil_op-&gt;type = MLILOperand::kIMMEDIATE;</span><span leaf=""><br/></span><span leaf="">                            mlil_op-&gt;value = llil_op-&gt;value;</span><span leaf=""><br/></span><span leaf="">                            mlil_op-&gt;size = llil_op-&gt;size;</span><span leaf=""><br/></span><span leaf="">                        } else if (llil_op-&gt;type ==</span><span leaf=""><br/></span><span leaf="">                                   LLIL::LLILOperand::REGISTER) {</span><span leaf=""><br/></span><span leaf="">                            mlil_op-&gt;type = MLILOperand::kREGISTER;</span><span leaf=""><br/></span><span leaf="">                            mlil_op-&gt;value = llil_op-&gt;value;</span><span leaf=""><br/></span><span leaf="">                            mlil_op-&gt;size = llil_op-&gt;size;</span><span leaf=""><br/></span><span leaf="">                        }</span><span leaf=""><br/></span><span leaf="">                        mlil_ins-&gt;operands.push_back(mlil_op);</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></code></pre><h2 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"></span><span leaf="">结果</span></h2><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">这是结果,可以看到,我们的MLIL跟BN的MLIL是几乎一模一样的,除了他做了一些美观优化:</span><span leaf=""><br/></span><span leaf=""><img data-imgfileid="100001679" class="rich_pages wxw-img" data-ratio="0.31574074074074077" data-type="png" data-w="1080" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=f157ca38&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIdtrt4kzb38IAasb7XFry1C5Kqeh1qR8Rz2WX9aIygibTj1wHZsoHUFcE2Pqxnqvyq9Z9hibGAI8cg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">实际上到MLIL,我们就可以直接把他用于网络安全的操作了(比如做NGAV)</span><span leaf=""><br/></span><span leaf="">下面的HLIL是给人看,而不是给机器脚本看的</span></p><h1 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2.5rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;" data-pm-slice="0 0 []"><span leaf="">提升了Hight-level il</span></h1><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">经过MLIL的提升后,我们终于可以提升为hight-level的il了,他在MLIL的基础上,增加了编译器优化/友好的C风格,blocks识别去美化代码(比如把goto变成ifelse或者是do-while),这一块就比较复杂了</span><span leaf=""><br/></span><span leaf="">基本上,IDA/BN做到优秀代码可读大部分跟他这块的优化有关系</span></p><blockquote style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin: 5px 0px 15px;overflow: hidden;border-width: 0px 0px 0px 4px;border-top-style: initial;border-right-style: initial;border-bottom-style: initial;border-left-style: solid;border-top-color: initial;border-right-color: initial;border-bottom-color: initial;border-left-color: rgb(122, 208, 58);border-image: initial;padding: 8px 12px;background-color: rgb(241, 241, 241);box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 1px 0px;font-size: 14.992px;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;"><span leaf="">不要被混淆概念,IDA没HLIL这种概念</span></p></blockquote><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">你可能注意到标题有上和下,因为这是上,我们就不继续介绍了,这块介绍能再写几万字,涉及到非常底层的编译器原理,这块涉及到的pass可以干非常非常多的事情,如去混淆,如识别golang的ABI重新编写输出函数从而避免被golang的垃圾代码搞坏大脑(部分函数参数识别要放在MLIL里面做),rust识别也同理,因为这块不属于抽象层的东西,属于最终给用户看的界面.说起来非常费劲.</span></p><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">最后给张成品效果图,如果这篇文章阅读量超过4000,我立刻更新下一章介绍这块.</span><span leaf=""><br/></span><span leaf=""><img class="rich_pages wxw-img" data-imgfileid="100001680" data-ratio="0.4675925925925926" style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);vertical-align: middle;border: 0px;max-width: 100%;" data-type="png" data-w="1080" src="https://wechat2rss.xlab.app/img-proxy/?k=d17cd7d2&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWIdtrt4kzb38IAasb7XFry1gItfTQfh6MicqiaUEy1rPzVYibXlR5dYYTyLhflicw3mBkeay5RyQicS0qQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></p><blockquote style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin: 5px 0px 15px;overflow: hidden;border-width: 0px 0px 0px 4px;border-top-style: initial;border-right-style: initial;border-bottom-style: initial;border-left-style: solid;border-top-color: initial;border-right-color: initial;border-bottom-color: initial;border-left-color: rgb(122, 208, 58);border-image: initial;padding: 8px 12px;background-color: rgb(241, 241, 241);box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 1px 0px;font-size: 14.992px;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;"><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;"><span leaf="">实际上我最后也没搞完这块的优化,要做太费劲了.retdec项目取了个巧,给llvm做优化,但是很臃肿.</span></p></blockquote><h1 style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 0.5rem;font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-weight: 500;line-height: 1.2;color: rgb(102, 102, 102);font-size: 2.5rem;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: left;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;"><span style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);"></span><span leaf="">最后</span></h1><p style="box-sizing: border-box;scrollbar-width: thin;scrollbar-color: rgb(136, 136, 136) rgb(241, 241, 241);margin-top: 0px;margin-bottom: 1rem;display: block;color: rgb(102, 102, 102);font-family: &#34;Hiragino Sans GB&#34;, 微软雅黑, 黑体, Arial, sans-serif;font-size: 14.992px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: left;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;"><span leaf="">非常感谢你的耐心收看,这可能是全网唯一一篇介绍反汇编工具的内部原理的,我希望你能学到一些什么.觉得看不懂也不要气馁,很多概念我也不懂,乱写能跑就行.</span></p><p style="display: none;"><mp-style-type data-value="3"></mp-style-type></p>



<p><a href="2247485332">阅读原文</a></p>
<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=6e939685&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzkyOTc0NDY2Nw%3D%3D%26mid%3D2247485332%26idx%3D1%26sn%3D25ef87ab7af839c54e8e4727bfd045cb">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Tue, 12 Aug 2025 09:30:00 +0800</pubDate>
    </item>
    <item>
      <title>VMP源码学习(1) 变异分析与代码bug</title>
      <link>https://mp.weixin.qq.com/s?__biz=MzkyOTc0NDY2Nw==&amp;mid=2247485288&amp;idx=1&amp;sn=74c85fd0a3c61b7eb98415cb7128c40d</link>
      <description>VMP源码学习——变异分析背景：VMP在23年泄露了一份代码，尽管目前在github上代码已经大部分被删除，但</description>
      <content:encoded><![CDATA[<p>
原创 <span>CrazyHarb</span> <span>2025-07-31 10:01</span> <span style="display: inline-block;">北京</span>
</p>




<p>
<img src="https://wechat2rss.xlab.app/img-proxy/?k=1b535832&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FejibWMxI7nWLrnOqM6OfWzmvIXxc57vdHYbFINu1NgSUoiak4yon0icUHhsiclwVsyibsQTUxjVhJgQz8OGARNtCK5w%2F0%3Fwx_fmt%3Djpeg"/>
</p>


<p style="margin-top:24.0pt;margin-bottom:24.0pt;margin-left:0.0pt;line-height:120%;"><span style="font-size:26.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">VMP源码学习——变异分析</span></span><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"></span></p><p style="margin-top:19.0pt;margin-bottom:7.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:1;"><span style="mso-bookmark:heading_0;"><span style="font-size:18.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">背景：</span></span></span><span style="mso-bookmark:heading_0;"></span><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;text-indent:21.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">VMP在23年泄露了一份代码，尽管目前在github上代码已经大部分被删除，但也让我们有机会得以窥探一眼这款商业混淆软件的内部原理。目前，网上关于这份源码的分析“少之又少”（这句话怎么这么耳熟），所以笔者打算分享一下对该源码的分析，旨在抛砖引玉。</span></span><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;"><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"><o:p><span leaf=""> </span></o:p></span></p><p style="margin-top:19.0pt;margin-bottom:7.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:1;"><span style="mso-bookmark:heading_1;"><span style="font-size:18.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">功能分析：</span></span></span><span style="mso-bookmark:heading_1;"></span><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;text-indent:21.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">针对代码的混淆与加密，目前提供了三种功能即（</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">变异</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">、</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">虚拟</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">、</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">变异+虚拟</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">），代码中支持了变异、虚拟两种混淆功能，本文将从变异功能出发，抛砖引玉，深入VMP而出不来。</span></span><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;"><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"><o:p><span leaf=""> </span></o:p></span></p><p style="margin-top:19.0pt;margin-bottom:7.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:1;"><span style="mso-bookmark:heading_2;"><span style="font-size:18.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">入口点：</span></span></span><span style="mso-bookmark:heading_2;"></span><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"></span></p><table style="margin-left: 0.0;border: none;border-collapse: collapse;mso-table-layout-alt: fixed;mso-border-top-alt: solid #DEE0E3 0.25pt;mso-border-left-alt: solid #DEE0E3 0.25pt;mso-border-bottom-alt: solid #DEE0E3 0.25pt;mso-border-right-alt: solid #DEE0E3 0.25pt;mso-padding-alt: 0pt 5.4pt 0pt 5.4pt;width: 100%;"><tbody><tr><td data-colwidth="552" width="552" valign="top" style="background: rgb(245, 246, 247);border-width: 1pt;border-style: solid;border-color: rgb(222, 224, 227);padding: 3pt 6pt 1.5pt;"><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;color:#646A73;"><span leaf="">C                  </span><span leaf=""><br/></span></span><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;"><span leaf="">void IntelFunction::Mutate(const CompileContext &amp;ctx, bool for_virtualization)</span></span><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"></span></p></td></tr></tbody></table><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;"><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"><o:p><span leaf=""> </span></o:p></span></p><p style="margin-top:19.0pt;margin-bottom:7.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:1;"><span style="mso-bookmark:heading_3;"><span style="font-size:18.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">垃圾代码初始化：</span></span></span><span style="mso-bookmark:heading_3;"></span><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"></span><o:page></o:page></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:center;margin-left:0.0pt;line-height:120%;"><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"><span leaf=""><img style="width:552.010009765625px;height:224.0px;" class="rich_pages wxw-img" data-ratio="0.4067179279643869" data-w="2471" src="https://wechat2rss.xlab.app/img-proxy/?k=4d6d3ecc&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FejibWMxI7nWLrnOqM6OfWzmvIXxc57vdH3yH5MNrLXoCbV4S467LxD47Olhuy1odA2GOichjQ04Zg9hcxkLFWVEw%2F640%3Fwx_fmt%3Dpng"/></span></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;text-indent:21.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">首先，会初始化一个垃圾指令的列表，这里的垃圾指令代表的是不会对后续的运行产生影响的指令，垃圾指令的存在只是为了扩大文件，加大逆向的时间成本，初始化逻辑中IntelCommand代表一条指令，例如</span></span><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"></span></p><table style="margin-left: 0.0;border: none;border-collapse: collapse;mso-table-layout-alt: fixed;mso-border-top-alt: solid #DEE0E3 0.25pt;mso-border-left-alt: solid #DEE0E3 0.25pt;mso-border-bottom-alt: solid #DEE0E3 0.25pt;mso-border-right-alt: solid #DEE0E3 0.25pt;mso-padding-alt: 0pt 5.4pt 0pt 5.4pt;width: 100%;"><tbody><tr><td data-colwidth="552" width="552" valign="top" style="background: rgb(245, 246, 247);border-width: 1pt;border-style: solid;border-color: rgb(222, 224, 227);padding: 3pt 6pt 1.5pt;"><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;color:#646A73;"><span leaf="">Assembly language                  </span><span leaf=""><br/></span></span><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;"><span leaf="">mov rax, 1</span></span><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"></span></p></td></tr></tbody></table><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;text-indent:21.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">IntelOperand代表操作数，例如 rax rbx等，在这段初始化中，垃圾指令的列表共初始化了78条垃圾指令，列表如下：</span></span><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"></span></p><table style="margin-left: 0.0;border: none;border-collapse: collapse;mso-table-layout-alt: fixed;mso-border-top-alt: solid #DEE0E3 0.25pt;mso-border-left-alt: solid #DEE0E3 0.25pt;mso-border-bottom-alt: solid #DEE0E3 0.25pt;mso-border-right-alt: solid #DEE0E3 0.25pt;mso-padding-alt: 0pt 5.4pt 0pt 5.4pt;width: 100%;"><tbody><tr><td data-colwidth="552" width="552" valign="top" style="background: rgb(245, 246, 247);border-width: 1pt;border-style: solid;border-color: rgb(222, 224, 227);padding: 3pt 6pt 1.5pt;"><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;color:#646A73;"><span leaf="">Assembly language                  </span><span leaf=""><br/></span></span><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;"><span leaf="">mov rxx,rxx                  </span><span leaf=""><br/></span><span leaf="">mov rxx, value                  </span><span leaf=""><br/></span><span leaf="">movsx xx, xl/xh                  </span><span leaf=""><br/></span><span leaf="">movsx exx,xx                  </span><span leaf=""><br/></span><span leaf="">movsx rxx, xx                  </span><span leaf=""><br/></span><span leaf="">movsxd rxx, exx                  </span><span leaf=""><br/></span><span leaf="">movzx</span><span leaf="">xx, xl/xh                  </span><span leaf=""><br/></span><span leaf="">movzx</span><span leaf="">exx, xx                  </span><span leaf=""><br/></span><span leaf="">movzx</span><span leaf="">rxx, xx                  </span><span leaf=""><br/></span><span leaf="">not</span><span leaf="">rxx                  </span><span leaf=""><br/></span><span leaf="">neg</span><span leaf="">rxx                  </span><span leaf=""><br/></span><span leaf="">inc</span><span leaf="">rxx                  </span><span leaf=""><br/></span><span leaf="">dec</span><span leaf="">rxx                  </span><span leaf=""><br/></span><span leaf="">cmp</span><span leaf="">rxx, rxx                  </span><span leaf=""><br/></span><span leaf="">cmp</span><span leaf="">rxx, value                  </span><span leaf=""><br/></span><span leaf="">test rxx, rxx                  </span><span leaf=""><br/></span><span leaf="">test rxx, value                  </span><span leaf=""><br/></span><span leaf="">and</span><span leaf="">rxx, rxx                  </span><span leaf=""><br/></span><span leaf="">and</span><span leaf="">rxx, value                  </span><span leaf=""><br/></span><span leaf="">or</span><span style="mso-spacerun:yes;"><span leaf="">   </span></span><span leaf="">rxx, rxx                  </span><span leaf=""><br/></span><span leaf="">or</span><span style="mso-spacerun:yes;"><span leaf="">   </span></span><span leaf="">rxx, value                  </span><span leaf=""><br/></span><span leaf="">xor</span><span leaf="">rxx, rxx                  </span><span leaf=""><br/></span><span leaf="">xor</span><span leaf="">rxx, value                  </span><span leaf=""><br/></span><span leaf="">add</span><span leaf="">rxx, rxx                  </span><span leaf=""><br/></span><span leaf="">add</span><span leaf="">rxx, value                  </span><span leaf=""><br/></span><span leaf="">adc</span><span leaf="">rxx, rxx                  </span><span leaf=""><br/></span><span leaf="">adc</span><span leaf="">rxx, value                  </span><span leaf=""><br/></span><span leaf="">sub</span><span leaf="">rxx, rxx                  </span><span leaf=""><br/></span><span leaf="">sub</span><span leaf="">rxx, value                  </span><span leaf=""><br/></span><span leaf="">shl</span><span leaf="">rxx, cl                  </span><span leaf=""><br/></span><span leaf="">shl</span><span leaf="">rxx, byte of value                  </span><span leaf=""><br/></span><span leaf="">shr</span><span leaf="">rxx, cl                  </span><span leaf=""><br/></span><span leaf="">shr</span><span leaf="">rxx, byte of value                  </span><span leaf=""><br/></span><span leaf="">sal</span><span leaf="">rxx, cl                  </span><span leaf=""><br/></span><span leaf="">sal</span><span leaf="">rxx, byte of value                  </span><span leaf=""><br/></span><span leaf="">sar</span><span leaf="">rxx, cl                  </span><span leaf=""><br/></span><span leaf="">sar</span><span leaf="">rxx, byte of value                  </span><span leaf=""><br/></span><span leaf="">rol</span><span leaf="">rxx, cl                  </span><span leaf=""><br/></span><span leaf="">rol</span><span leaf="">rxx, byte of value                  </span><span leaf=""><br/></span><span leaf="">ror</span><span leaf="">rxx, cl                  </span><span leaf=""><br/></span><span leaf="">ror</span><span leaf="">rxx, byte of value                  </span><span leaf=""><br/></span><span leaf="">shrd</span><span leaf="">rxx, cl                  </span><span leaf=""><br/></span><span leaf="">shrd</span><span leaf="">rxx, byte of value                  </span><span leaf=""><br/></span><span leaf="">shld</span><span leaf="">rxx, cl                  </span><span leaf=""><br/></span><span leaf="">shld</span><span leaf="">rxx, byte of value                  </span><span leaf=""><br/></span><span leaf="">bt</span><span leaf="">rxx, rxx                  </span><span leaf=""><br/></span><span leaf="">bt</span><span leaf="">rxx, byte of value                  </span><span leaf=""><br/></span><span leaf="">btc</span><span leaf="">rxx, rxx                  </span><span leaf=""><br/></span><span leaf="">btc</span><span leaf="">rxx, byte of value                  </span><span leaf=""><br/></span><span leaf="">btr</span><span leaf="">rxx, rxx                  </span><span leaf=""><br/></span><span leaf="">btr</span><span leaf="">rxx, byte of value                  </span><span leaf=""><br/></span><span leaf="">bts</span><span leaf="">rxx, rxx                  </span><span leaf=""><br/></span><span leaf="">bts</span><span leaf="">rxx, rxx                  </span><span leaf=""><br/></span><span leaf="">setz/seto/setc/...                  </span><span leaf=""><br/></span><span leaf="">cmovc/cmova/cmovo/...                  </span><span leaf=""><br/></span><span leaf="">clc                  </span><span leaf=""><br/></span><span leaf="">stc                  </span><span leaf=""><br/></span><span leaf="">cmc                  </span><span leaf=""><br/></span><span leaf="">cbw                  </span><span leaf=""><br/></span><span leaf="">cwde                  </span><span leaf=""><br/></span><span leaf="">cwd                  </span><span leaf=""><br/></span><span leaf="">cdq                  </span><span leaf=""><br/></span><span leaf="">cdqe                  </span><span leaf=""><br/></span><span leaf="">cqo                  </span><span leaf=""><br/></span><span leaf="">lahf                  </span><span leaf=""><br/></span><span leaf="">bswap rxx                  </span><span leaf=""><br/></span><span leaf="">xchg</span><span leaf="">rxx, rxx                  </span><span leaf=""><br/></span><span leaf="">xadd</span><span leaf="">rxx, rxx                  </span><span leaf=""><br/></span><span leaf="">jmp</span><span style="mso-spacerun:yes;"><span leaf="">   </span></span><span leaf="">value                  </span><span leaf=""><br/></span><span leaf="">; 后面的指令是当for_virtualization == false（非虚拟化选项）的时候才会存在                  </span><span leaf=""><br/></span><span leaf="">sbb rxx, rxx                  </span><span leaf=""><br/></span><span leaf="">sbb rxx, value                  </span><span leaf=""><br/></span><span leaf="">rcl rxx, cl                  </span><span leaf=""><br/></span><span leaf="">rcl rxx, byte                  </span><span leaf=""><br/></span><span leaf="">rcr rxx, cl                  </span><span leaf=""><br/></span><span leaf="">rcr rxx, byte                  </span><span leaf=""><br/></span><span leaf="">bsr rxx, rxx                  </span><span leaf=""><br/></span><span leaf="">bsf rxx, rxx                  </span><span leaf=""><br/></span><span leaf="">rdtsc</span></span><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"></span><o:page></o:page></p></td></tr></tbody></table><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;text-indent:21.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">上面的垃圾指令列表中包含了所有的垃圾指令，但没有体现出具体的随机长度，若有具体分析的必要，可以参考一下源码</span></span><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;"><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"><o:p><span leaf=""> </span></o:p></span></p><p style="margin-top:19.0pt;margin-bottom:7.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:1;"><span style="mso-bookmark:heading_4;"><span style="font-size:18.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">指令的处理：</span></span></span><span style="mso-bookmark:heading_4;"></span><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;text-indent:21.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">初始化完成垃圾代码列表后，变异逻辑将对汇编指令进行了逐条处理，我们先忽略掉“指令块”这些概念，只看指令的变异处理。实际上，所谓的变异功能，包含了以下几步逻辑处理，即：</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">指令信息获取</span></span><span style="font-size:11.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">→</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">获取空闲寄存器</span></span><span style="font-size:11.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">→</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">指令替换</span></span><span style="font-size:11.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">→</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">垃圾代码筛选</span></span><span style="font-size:11.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">→</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">垃圾代码填充</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">。我们分步来看一下：</span></span><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;"><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"><o:p><span leaf=""> </span></o:p></span></p><p style="margin-top:16.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:2;"><span style="mso-bookmark:heading_5;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;color:#3370FF;"><span leaf="">1. </span></span></span><span style="mso-bookmark:heading_5;"><span style="font-size:16.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">指令信息获取</span></span></span><span style="mso-bookmark:heading_5;"></span><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;text-indent:21.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">此步骤将会调用IntelCommand::GetCommandInfo指令获取当前指令的信息，当然，这个函数中没有任何的奇淫巧计，全部都是暴力硬编码，例如 rdtsc及lahf中，代码中的实现为：</span></span><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"></span></p><table style="margin-left: 0.0;border: none;border-collapse: collapse;mso-table-layout-alt: fixed;mso-border-top-alt: solid #DEE0E3 0.25pt;mso-border-left-alt: solid #DEE0E3 0.25pt;mso-border-bottom-alt: solid #DEE0E3 0.25pt;mso-border-right-alt: solid #DEE0E3 0.25pt;mso-padding-alt: 0pt 5.4pt 0pt 5.4pt;width: 100%;"><tbody><tr><td data-colwidth="552" width="552" valign="top" style="background: rgb(245, 246, 247);border-width: 1pt;border-style: solid;border-color: rgb(222, 224, 227);padding: 3pt 6pt 1.5pt;"><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;color:#646A73;"><span leaf="">C                  </span><span leaf=""><br/></span></span><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;"><span leaf="">case cmRdtsc:                  </span><span leaf=""><br/></span><span style="mso-spacerun:yes;"><span leaf="">     </span></span><span leaf="">command_info_list.Add(atWrite, regEAX, otRegistr, osDWord);                  </span><span leaf=""><br/></span><span style="mso-spacerun:yes;"><span leaf="">     </span></span><span leaf="">command_info_list.Add(atWrite, regEDX, otRegistr, osDWord);                  </span><span leaf=""><br/></span><span style="mso-spacerun:yes;"><span leaf="">     </span></span><span leaf="">break;                  </span><span leaf=""><br/></span><span leaf="">case cmLahf:                  </span><span leaf=""><br/></span><span style="mso-spacerun:yes;"><span leaf="">     </span></span><span leaf="">command_info_list.Add(atRead, regEFX, otRegistr, size_);                  </span><span leaf=""><br/></span><span style="mso-spacerun:yes;"><span leaf="">     </span></span><span leaf="">command_info_list.set_need_flags(fl_S | fl_Z | fl_A | fl_P | fl_C);                  </span><span leaf=""><br/></span><span style="mso-spacerun:yes;"><span leaf="">     </span></span><span leaf="">command_info_list.Add(atWrite, regEAX, otHiPartRegistr, osByte);                  </span><span leaf=""><br/></span><span style="mso-spacerun:yes;"><span leaf="">     </span></span><span leaf="">break;</span></span><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"></span></p></td></tr></tbody></table><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;text-indent:21.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">可以看到：</span></span><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;text-indent:21.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">①针对rdtsc指令，指令信息中指明了eax和edx将会被写入。</span></span><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;text-indent:21.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">②针对lahf指令，标志位将会被读取，同时指明了sf、zf、af、pf、cf将会被读取，最后ah将会被写入。</span></span><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;"><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"><o:p><span leaf=""> </span></o:p></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;text-indent:21.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">以此类推，这个函数中包含了大部分的指令，其余的指令则返回获取失败。</span></span><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;"><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"><o:p><span leaf=""> </span></o:p></span></p><p style="margin-top:16.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:2;"><span style="mso-bookmark:heading_6;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;color:#3370FF;"><span leaf="">2. </span></span></span><span style="mso-bookmark:heading_6;"><span style="font-size:16.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">获取空闲寄存器</span></span></span><span style="mso-bookmark:heading_6;"></span><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;text-indent:21.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">此步骤将会调用IntelFunction::GetFreeRegisters进行获取空闲寄存器，尽管代码量很少，但这块逻辑可能比较抽象，所以笔者结合流程图与简单的举个例子进行简单的分析，假设当前指令为如下:</span></span><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"></span></p><table style="margin-left: 0.0;border: none;border-collapse: collapse;mso-table-layout-alt: fixed;mso-border-top-alt: solid #DEE0E3 0.25pt;mso-border-left-alt: solid #DEE0E3 0.25pt;mso-border-bottom-alt: solid #DEE0E3 0.25pt;mso-border-right-alt: solid #DEE0E3 0.25pt;mso-padding-alt: 0pt 5.4pt 0pt 5.4pt;width: 100%;"><tbody><tr><td data-colwidth="552" width="552" valign="top" style="background: rgb(245, 246, 247);border-width: 1pt;border-style: solid;border-color: rgb(222, 224, 227);padding: 3pt 6pt 1.5pt;"><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;color:#646A73;"><span leaf="">C                  </span><span leaf=""><br/></span></span><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;"><span leaf="">sub rbx, rax                  </span><span leaf=""><br/></span><span leaf="">mov rax, rbx                  </span><span leaf=""><br/></span><span leaf="">cpuid                  </span><span leaf=""><br/></span><span leaf="">mov rdx, rcx                  </span><span leaf=""><br/></span><span leaf="">rdtsc                  </span><span leaf=""><br/></span><span leaf="">nop                  </span><span leaf=""><br/></span><span leaf="">jnz xxx</span></span><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"></span></p></td></tr></tbody></table><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;text-indent:21.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">假设目前要对第一行指令做处理，我们需要获取空闲寄存器，代码将从第二行指令开始扫描，扫描动作为：</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">获取指令信息</span></span><span style="font-size:11.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">→</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">判断是写入还是读取</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">。这个扫描动作直到遇到无法获取的指令信息或有修改RIP的指令为止（例如样例中的第7行）</span></span><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;"><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"><o:p><span leaf=""> </span></o:p></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;text-indent:21.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">先说结论</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">：</span></span><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"></span></p><p style="mso-list:l0 level1 lfo1;margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;text-indent:0.0pt;line-height:120%;"><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"><span leaf="">1</span><span style="font:7.0pt Times New Roman;"></span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">先写入的话，就代表是空闲寄存器，因为开始指令到当前扫描指令之间，这个寄存器无论如何更改，都会被后面的指令改写覆盖</span></span><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"></span></p><p style="mso-list:l1 level1 lfo1;margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;text-indent:0.0pt;line-height:120%;"><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"><span leaf="">1</span><span style="font:7.0pt Times New Roman;"></span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">先读取的话，就代表是使用中的寄存器</span></span><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;"><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"><o:p><span leaf=""> </span></o:p></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;text-indent:21.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">我们再来看一下扫描流程</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">：</span></span><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"></span></p><p style="mso-list:l2 level1 lfo1;margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;text-indent:0.0pt;line-height:120%;"><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"><span leaf="">1</span><span style="font:7.0pt Times New Roman;"></span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">当前扫描第2行，由于rbx被修改了，rax被读取了，所以当前扫描结果为，空闲寄存器: rbx， 已使用寄存器: rax</span></span><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"></span></p><p style="mso-list:l3 level1 lfo1;margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;text-indent:0.0pt;line-height:120%;"><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"><span leaf="">1</span><span style="font:7.0pt Times New Roman;"></span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">当前扫描第3行，rax尽管被修改了，但rax在已使用的寄存器中，所以不作为空闲寄存器，所以当前扫描结果为: 空闲寄存器 rbx、rcx、rdx，</span><span style="mso-spacerun:yes;"><span leaf="">  </span></span><span leaf="">已使用寄存器 rbx、rax</span></span><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"></span></p><p style="mso-list:l4 level1 lfo1;margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;text-indent:0.0pt;line-height:120%;"><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"><span leaf="">1</span><span style="font:7.0pt Times New Roman;"></span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">当前扫描第4行，当前扫描结果为 空闲寄存器 rbx、rcx、rdx，</span><span style="mso-spacerun:yes;"><span leaf="">  </span></span><span leaf="">已使用寄存器 rbx、rax、rcx</span></span><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"></span></p><p style="mso-list:l5 level1 lfo1;margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;text-indent:0.0pt;line-height:120%;"><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"><span leaf="">1</span><span style="font:7.0pt Times New Roman;"></span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">当前扫描第5行，当前扫描结果为 空闲寄存器 rbx、rcx、rdx，</span><span style="mso-spacerun:yes;"><span leaf="">  </span></span><span leaf="">已使用寄存器 rbx、rax、rcx</span></span><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"></span></p><p style="mso-list:l6 level1 lfo1;margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;text-indent:0.0pt;line-height:120%;"><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"><span leaf="">1</span><span style="font:7.0pt Times New Roman;"></span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">当前扫描第6行，由于没扫到任何的寄存器变动，所以当前扫描结果不变 空闲寄存器 rbx、rcx、rdx，</span><span style="mso-spacerun:yes;"><span leaf="">  </span></span><span leaf="">已使用寄存器 rbx、rax、rcx</span></span><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"></span></p><p style="mso-list:l7 level1 lfo1;margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;text-indent:0.0pt;line-height:120%;"><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"><span leaf="">1</span><span style="font:7.0pt Times New Roman;"></span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">当前扫描第7行，由于本行指令将改变RIP，所以直接退出扫描</span></span><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;"><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"><o:p><span leaf=""> </span></o:p></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;text-indent:21.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">针对以上，我们可以看到运行返回结果的空闲寄存器为：rbx rcx rdx，当然，空闲标志位也是通过上面的逻辑进行获取的，流程图如下，这里就不再展开了</span></span><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:center;margin-left:0.0pt;line-height:120%;"><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"><span leaf=""><img style="width:552.010009765625px;height:552.010009765625px;" class="rich_pages wxw-img" data-ratio="1" data-w="1280" src="https://wechat2rss.xlab.app/img-proxy/?k=6530951a&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FejibWMxI7nWLrnOqM6OfWzmvIXxc57vdH0PMg3hhxL464Mq0nN7Zqj24FSSW32qxq9y9tBceSVe3FPx35J2PSVQ%2F640%3Fwx_fmt%3Djpeg"/></span></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;"><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"><o:p><span leaf=""> </span></o:p></span></p><p style="margin-top:16.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:2;"><span style="mso-bookmark:heading_7;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;color:#3370FF;"><span leaf="">3. </span></span></span><span style="mso-bookmark:heading_7;"><span style="font-size:16.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">指令替换</span></span></span><span style="mso-bookmark:heading_7;"></span><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;text-indent:21.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">该步骤，将会对特定的指令规则进行平行替换结果不变，规则如下表展示：</span></span><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"></span></p><table style="margin-left: 0.0;border: none;border-collapse: collapse;mso-table-layout-alt: fixed;mso-border-top-alt: solid #DEE0E3 0.25pt;mso-border-left-alt: solid #DEE0E3 0.25pt;mso-border-bottom-alt: solid #DEE0E3 0.25pt;mso-border-right-alt: solid #DEE0E3 0.25pt;mso-padding-alt: 0pt 5.4pt 0pt 5.4pt;width: 100%;"><tbody><tr><td data-colwidth="552" width="552" valign="top" style="background: rgb(245, 246, 247);border-width: 1pt;border-style: solid;border-color: rgb(222, 224, 227);padding: 3pt 6pt 1.5pt;"><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;color:#646A73;"><span leaf="">C                  </span><span leaf=""><br/></span></span><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;"><span leaf="">xor rxx, rxx（rxx相同）</span><span style="mso-spacerun:yes;"><span leaf="">  </span></span><span leaf="">-&gt;</span><span style="mso-spacerun:yes;"><span leaf="">  </span></span><span leaf="">sub rxx,rxx                  </span><span leaf=""><br/></span><span leaf="">add rxx, rxx1</span><span style="mso-spacerun:yes;"><span leaf="">  </span></span><span leaf="">-&gt;</span><span style="mso-spacerun:yes;"><span leaf="">   </span></span><span leaf="">lea rxx, [rxx + reg1]                  </span><span leaf=""><br/></span><span leaf="">add rxx, value -&gt;</span><span style="mso-spacerun:yes;"><span leaf="">   </span></span><span leaf="">lea rxx, [rxx + value]                  </span><span leaf=""><br/></span><span leaf="">sub rxx, value -&gt;</span><span style="mso-spacerun:yes;"><span leaf="">   </span></span><span leaf="">lea rxx, [rxx - value]                  </span><span leaf=""><br/></span><span leaf="">jmp [value]</span><span style="mso-spacerun:yes;"><span leaf="">   </span></span><span leaf="">-&gt;</span><span style="mso-spacerun:yes;"><span leaf="">    </span></span><span leaf="">push [value]                  </span><span leaf=""><br/></span><span style="mso-spacerun:yes;"><span leaf="">                    </span></span><span leaf="">ret                  </span><span leaf=""><br/></span><span leaf="">jmp rxx</span><span style="mso-spacerun:yes;"><span leaf="">       </span></span><span leaf="">-&gt;</span><span style="mso-spacerun:yes;"><span leaf="">    </span></span><span leaf="">push rxx                  </span><span leaf=""><br/></span><span style="mso-spacerun:yes;"><span leaf="">                    </span></span><span leaf="">ret                  </span><span leaf=""><br/></span><span leaf="">jmp [rxx]</span><span style="mso-spacerun:yes;"><span leaf="">     </span></span><span leaf="">-&gt;</span><span style="mso-spacerun:yes;"><span leaf="">    </span></span><span leaf="">push [rxx]                  </span><span leaf=""><br/></span><span style="mso-spacerun:yes;"><span leaf="">                    </span></span><span leaf="">ret</span></span><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"></span></p></td></tr></tbody></table><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;text-indent:21.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">当然替换也并不是每次都会发生，仅会在</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">本条指令</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">处理时，</span></span><span style="font-size:11.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">(rand() &amp; 1)不为0</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">的情况下，才会匹配规则，并进行替换。</span></span><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;text-indent:21.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">且针对</span></span><span style="font-size:11.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">add</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">与</span></span><span style="font-size:11.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">sub</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">，会进行标志位逻辑判断，即：当前指令修改的标志位寄存器在空闲标志位寄存器中时（也就是说，当前更改的标志位不会影响后续代码执行结果），才会进行指令替换。</span></span><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;"><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"><o:p><span leaf=""> </span></o:p></span></p><p style="margin-top:16.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:2;"><span style="mso-bookmark:heading_8;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;color:#3370FF;"><span leaf="">4. </span></span></span><span style="mso-bookmark:heading_8;"><span style="font-size:16.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">垃圾代码筛选</span></span></span><span style="mso-bookmark:heading_8;"></span><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;text-indent:21.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">前面我们已经获取到了空闲寄存器（包含空闲标志位寄存器），也初始化垃圾指令的列表，本节中将会对已有的垃圾指令列表进行筛选。</span></span><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;text-indent:21.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">①获取当前指令信息，可以参考第1步骤，这里就直接跳过了。</span></span><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;text-indent:21.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">②循环判断操作数：</span></span><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:22.65pt;text-indent:21.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">1) 如果是读取则放过</span></span><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:22.65pt;text-indent:21.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">2) 如果是写入，则判断是否是立即数，如果是也放过</span></span><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:22.65pt;text-indent:21.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">3) 如果是寄存器或高位寄存器，则进一步判断寄存器类型</span></span><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:22.65pt;text-indent:21.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">4) 如果是需要空闲寄存器，则从空闲寄存器列表中找一个，如果空闲寄存器列表为空，则筛选掉当前垃圾指令，如果所有空闲寄存器的长度都小于需要的大小，也筛选掉垃圾指令。</span></span><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:22.65pt;text-indent:21.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">5) 如果是需要空闲标志位寄存器，则查看空闲标志寄存器，如果空闲标志位寄存器列表为空，则筛选掉当前垃圾指令。</span></span><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:22.65pt;text-indent:21.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">6) 如果是高位寄存器，则按照长度2倍对齐，例如 ah/al -&gt; ax</span></span><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:22.65pt;line-height:120%;"><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"><o:p><span leaf=""> </span></o:p></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;text-indent:21.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">针对4）、5）我们举个例子，例如 sub rax, rbx ，那么我们获取到的四条操作信息：标志位：OSZAPC -&gt; 更改、rbx -&gt; 读取、 rax -&gt; 读取、 rax -&gt; 更改。然后会判断所有的操作信息，由于rbx仅有读取，所以直接跳过。会判断一下空闲标志位寄存器中是否存在OSZAPC标志位，判断一下空闲寄存器是否存在rax，如果都符合要求，证明当前的垃圾指令符合要求，放入</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">筛选后的列表</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">中。</span></span><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;"><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"><o:p><span leaf=""> </span></o:p></span></p><p style="margin-top:16.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:2;"><span style="mso-bookmark:heading_9;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;color:#3370FF;"><span leaf="">5. </span></span></span><span style="mso-bookmark:heading_9;"><span style="font-size:16.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">垃圾代码填充</span></span></span><span style="mso-bookmark:heading_9;"></span><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;text-indent:21.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">经过上面的筛选及指令替换，我们到了最后一步，开始垃圾代码填充，可以放一首比较好听的bgm，完成最后的一部分，要想放的歌曲好听，好的手机必不可少，我新换的手机，旧的手机我放在...</span></span><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;text-indent:21.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">① 首先，代码中会随机添加的垃圾指令的数量 n ( 0~4)，然后开始指令预处理阶段</span></span><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"></span></p><table style="margin-left: 22.65pt;border: none;border-collapse: collapse;mso-table-layout-alt: fixed;mso-border-top-alt: solid #DEE0E3 0.25pt;mso-border-left-alt: solid #DEE0E3 0.25pt;mso-border-bottom-alt: solid #DEE0E3 0.25pt;mso-border-right-alt: solid #DEE0E3 0.25pt;mso-padding-alt: 0pt 5.4pt 0pt 5.4pt;width: 100%;"><tbody><tr><td data-colwidth="522" width="522" valign="top" style="background: rgb(245, 246, 247);border-width: 1pt;border-style: solid;border-color: rgb(222, 224, 227);padding: 3pt 6pt 1.5pt;"><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;color:#646A73;"><span leaf="">C                  </span><span leaf=""><br/></span></span><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;"><span leaf="">rand() % 4</span></span><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"></span></p></td></tr></tbody></table><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;text-indent:21.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">② 在</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">筛选后的列表</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">中随机一条指令，并将其从筛选后的列表中删掉，也就是针对一条指令的垃圾填充，不会重复使用相同的垃圾指令。</span></span><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;text-indent:21.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">③ 遍历选取的垃圾指令的操作数，如果是空闲寄存器，就随机一个寄存器（空闲寄存器可以重复使用）并获取当前随机出来的寄存器长度,如果当前记录的</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">最大长度</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">大于随机出来的长度，就把当前记录的</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">最大长度</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">改为随机出来的长度</span></span><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;text-indent:21.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">④ 记录所有操作数中</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">最大的寄存器序号</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">，这里如果当前操作数是指明了寄存器，且是rax，代码中会根据位数随机一个寄存器(rax ~ rbp 或 rax ~ r15)</span></span><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;text-indent:21.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">⑤ 如果当前是32位程序，且寄存器不是 rax rdx rcx rbx，并且最小长度小于2字节，则将最小长度置为2字节</span></span><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;text-indent:21.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">⑥ 如果最小长度大于最大长度，则执行失败，进行下一条垃圾指令填充，如果长度非随机，且当前垃圾指令长度小于最小长度或者当前指令长度大于最大长度，也算作执行失败</span></span><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span style="mso-spacerun:yes;"><span leaf="">      </span></span><span leaf="">⑦</span><span style="mso-spacerun:yes;"><span leaf=""> </span></span><span leaf="">上面预处理完成后，开始随机填入操作数的各种信息：</span></span><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:22.65pt;text-indent:21.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">1）如果长度需要随机，则根据</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">最大长度</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">、</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">最小长度</span></span><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">随机一个长度。</span></span><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:22.65pt;text-indent:21.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">2）如果操作数是寄存器，则填入上面随机出来的寄存器，且如果长度是1字节，垃圾指令的需求寄存器是空闲寄存器或者rax，最大长度大于1字节，且最大寄存器序号小于4（rax rdx rbx rcx)，且随机一个数为奇数，则使用高位寄存器代替</span><span style="mso-spacerun:yes;"><span leaf="">   </span></span><span leaf="">即 mov al, bl</span><span style="mso-spacerun:yes;"><span leaf="">  </span></span><span leaf="">-&gt; mov ah, bl</span></span><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:22.65pt;text-indent:21.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">3)</span><span style="mso-spacerun:yes;"><span leaf="">  </span></span><span leaf="">如果是立即数，则随机一个数即可</span></span><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:22.65pt;text-indent:21.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">4）如果是setx/cmovx 等指令，则随机一个标志位使用，随机一个数，如果是奇数，则取setnx/cmovnx指令。</span></span><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;text-indent:21.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">⑧ 循环下一条垃圾指令填充，垃圾指令填充完成后，循环下一条指令处理</span></span><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;"><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"><o:p><span leaf=""> </span></o:p></span></p><p style="margin-top:19.0pt;margin-bottom:7.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:1;"><span style="mso-bookmark:heading_10;"><span style="font-size:18.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">代码中的bug：</span></span></span><span style="mso-bookmark:heading_10;"></span><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"></span></p><p style="margin-top:16.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:2;"><span style="mso-bookmark:heading_11;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;color:#3370FF;"><span leaf="">1. </span></span></span><span style="mso-bookmark:heading_11;"><span style="font-size:16.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">垃圾指令的重复</span></span></span><span style="mso-bookmark:heading_11;"></span><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;text-indent:21.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">根据垃圾指令列表可以得知，52行和53行的垃圾指令是相同的，根据之前的代码推测，有一个应该是 </span></span><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"></span></p><table style="margin-left: 0.0;border: none;border-collapse: collapse;mso-table-layout-alt: fixed;mso-border-top-alt: solid #DEE0E3 0.25pt;mso-border-left-alt: solid #DEE0E3 0.25pt;mso-border-bottom-alt: solid #DEE0E3 0.25pt;mso-border-right-alt: solid #DEE0E3 0.25pt;mso-padding-alt: 0pt 5.4pt 0pt 5.4pt;width: 100%;"><tbody><tr><td data-colwidth="552" width="552" valign="top" style="background: rgb(245, 246, 247);border-width: 1pt;border-style: solid;border-color: rgb(222, 224, 227);padding: 3pt 6pt 1.5pt;"><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;color:#646A73;"><span leaf="">C                  </span><span leaf=""><br/></span></span><span style="font-size:11.0pt;line-height:120%;font-family:Consolas;mso-ascii-font-family:Consolas;mso-fareast-font-family:Consolas;mso-bidi-font-family:Consolas;font-variant:normal;text-transform:none;"><span leaf="">bts rxx, value</span></span><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"></span></p></td></tr></tbody></table><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;text-indent:21.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">笔者想了一下应该不会有什么坑，猜测应该是写错了</span></span><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"></span></p><p style="margin-top:16.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;line-height:120%;mso-outline-level:2;"><span style="mso-bookmark:heading_12;"><span style="font-size:16.0pt;line-height:120%;font-family:Arial;mso-ascii-font-family:Arial;mso-fareast-font-family:等线;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;color:#3370FF;"><span leaf="">2. </span></span></span><span style="mso-bookmark:heading_12;"><span style="font-size:16.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;font-weight:bold;"><span leaf="">获取空闲标志位错误</span></span></span><span style="mso-bookmark:heading_12;"></span><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"></span></p><p style="margin-top:6.0pt;margin-bottom:6.0pt;text-align:left;margin-left:0.0pt;text-indent:21.0pt;line-height:120%;"><span style="font-size:11.0pt;line-height:120%;font-family:等线;mso-ascii-font-family:Arial;mso-bidi-font-family:Arial;font-variant:normal;text-transform:none;"><span leaf="">根据流程图可以得知空闲标志位寄存器会在第一次获取成功后停止获取，也就是说，如果指令列表中，第一行指令改变了Z，第二行改变了C，理论上返回的空闲标志位为ZC，但由于获取成功一次后就停止获取了，所以实际返回的空闲指令寄存器是Z，也就是说有可能会影响部分垃圾指令的生成。</span></span><span style="font-family:Times New Roman;mso-ascii-font-family:Times New Roman;mso-fareast-font-family:等距更纱黑体 SC;font-variant:normal;text-transform:none;"></span></p><p style="display: none;"><mp-style-type data-value="3"></mp-style-type></p>



<p><a href="2247485288">阅读原文</a></p>
<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=b8c43784&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzkyOTc0NDY2Nw%3D%3D%26mid%3D2247485288%26idx%3D1%26sn%3D74c85fd0a3c61b7eb98415cb7128c40d">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Thu, 31 Jul 2025 10:01:00 +0800</pubDate>
    </item>
  </channel>
</rss>