<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Tsglz&apos;s blog</title><description>Rediscory the beauty of typography</description><link>https://astro-theme-typography.vercel.app/</link><item><title>阅读笔记（不定期更新中）</title><link>https://astro-theme-typography.vercel.app/posts/%E6%9D%82%E8%B0%88/%E9%98%85%E8%AF%BB%E7%AC%94%E8%AE%B0/</link><guid isPermaLink="true">https://astro-theme-typography.vercel.app/posts/%E6%9D%82%E8%B0%88/%E9%98%85%E8%AF%BB%E7%AC%94%E8%AE%B0/</guid><description>一些阅读的思考和个人视角下对他人思想的看法。</description><pubDate>Fri, 12 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;写一点平时读书的思考，以及对书或者作者的点评。&lt;/p&gt;
&lt;p&gt;小时候特别爱读心理学，一边和人接触，一边对人们的行为和动机不断解构，取其精华、去其糟粕，慢慢地构成了属于自己的人生观、价值观和世界观。&lt;/p&gt;
&lt;p&gt;再长大一些逐渐愿意接触更多的书，博览群书算不上，但大家的思想或是学说或多或少都了解一些。从心理学、社会学、经济学，过渡到哲学。真的很有意思，包括在查阅哲学资料的时候意外发现还有衍生的魔法一支。&lt;/p&gt;
&lt;p&gt;把我的一些微不足道的看法分享给大家，共勉。&lt;/p&gt;
&lt;p&gt;下面这张图是截取自我自己写的阅读偏好记录软件，有部分书是很久之前读的，不想补笔记所以没有写在下面的分类里。&lt;/p&gt;
&lt;p&gt;&amp;lt;img src =&quot;/reading-reflections/preference.png&quot;&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;/br&amp;gt;&lt;/p&gt;
&lt;h1&gt;自然科学&lt;/h1&gt;
&lt;p&gt;&amp;lt;/br&amp;gt;&lt;/p&gt;
&lt;h1&gt;人文学科&lt;/h1&gt;
&lt;h2&gt;哲学-哲学史&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;/posts/%E6%9D%82%E8%B0%88/%E5%93%B2%E5%AD%A6%E5%AE%B6%E4%BB%AC%E9%83%BD%E5%B9%B2%E4%BA%86%E4%BB%80%E4%B9%88/&quot;&gt;《哲学家们都干了什么》&lt;/a&gt;（已严肃品鉴）&lt;/p&gt;
&lt;p&gt;推荐指数：7.5/10。&lt;/p&gt;
&lt;p&gt;&amp;lt;/br&amp;gt;&lt;/p&gt;
&lt;h2&gt;哲学-哲学入门&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;/posts/%E6%9D%82%E8%B0%88/%E4%BD%A0%E7%9A%84%E7%AC%AC%E4%B8%80%E6%9C%AC%E5%93%B2%E5%AD%A6%E4%B9%A6/&quot;&gt;《你的第一本哲学书》&lt;/a&gt;（已严肃品鉴）&lt;/p&gt;
&lt;p&gt;推荐指数：6/10。&lt;/p&gt;
&lt;p&gt;&amp;lt;/br&amp;gt;&lt;/p&gt;
&lt;h1&gt;社会科学&lt;/h1&gt;
&lt;h2&gt;教育/个人成长&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;/posts/%E6%9D%82%E8%B0%88/%E6%88%90%E9%95%BF%E7%9A%84%E8%BE%B9%E7%95%8C/&quot;&gt;《成长的边界》&lt;/a&gt;（品鉴中）&lt;/p&gt;
&lt;p&gt;第一章提出了一个问题：专家们会因为有经验而变得更好吗？&lt;/p&gt;
&lt;p&gt;从而进一步引出了“友好型”学习环境（模式一再重复，反馈极其精确，而且速度够快，比如高尔夫、国际象棋领域）和“恶劣型”学习环境（竞赛规则通常不甚明晰，或者不够完整；重复的模式时有时无，或者不够清楚；而反馈常常滞后，或者不准确，或者两者兼有）。在最恶劣的学习环境下，经验往往会反复强化错误的教训。&lt;/p&gt;
&lt;p&gt;最后引申出观点：人类真正的优势不是战术积累，而是判断力，或者说战略。&lt;/p&gt;
&lt;p&gt;&amp;lt;/br&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/posts/%E6%9D%82%E8%B0%88/%E5%A6%82%E4%BD%95%E6%9C%89%E6%95%88%E9%98%85%E8%AF%BB%E4%B8%80%E6%9C%AC%E4%B9%A6%EF%BC%9A%E8%B6%85%E5%AE%9E%E7%94%A8%E7%AC%94%E8%AE%B0%E8%AF%BB%E4%B9%A6%E6%B3%95/&quot;&gt;《如何有效阅读一本书：超实用笔记读书法》&lt;/a&gt;（品鉴中）&lt;/p&gt;
&lt;p&gt;学习一下怎么阅读&lt;/p&gt;
&lt;p&gt;&amp;lt;/br&amp;gt;&lt;/p&gt;
&lt;h2&gt;心理学-司法心理学&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;/posts/%E6%9D%82%E8%B0%88/%E7%89%9B%E6%B4%A5%E9%80%9A%E8%AF%86%E8%AF%BB%E6%9C%AC%E5%8F%B8%E6%B3%95%E5%BF%83%E7%90%86%E5%AD%A6/&quot;&gt;《牛津通识读本：司法心理学》&lt;/a&gt;（已严肃品鉴）&lt;/p&gt;
&lt;p&gt;推荐指数：7.5/10。&lt;/p&gt;
&lt;p&gt;&amp;lt;/br&amp;gt;&lt;/p&gt;
&lt;h2&gt;社会学-人际关系&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;OS：我也不知道为什么会开这么一个分支，但是我的确对这个领域非常的好奇，不管是异性之间还是同性之间。我的第一本启蒙文学作品是《蒙马特遗书》，哈哈，对，是女同写的。看完感觉云里雾里，不甚明晰。不过我也不准备再读第二遍了，没必要。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;除了好奇，我读这类作品还有一个很重要的原因。我个人还是比较注重社会关系的处理的，虽然对待大部分人我都是不温不火的，但这并不意味着我不在意与人的链接，尤其是那些我欣赏的人。所以如何维护关系就显得格外重要，而这恰巧是我不太擅长的，不管是对恋人还是朋友。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;/posts/%E6%9D%82%E8%B0%88/%E6%81%8B%E7%88%B1%E5%BF%83%E6%B3%95/&quot;&gt;《恋爱心法》&lt;/a&gt;（品鉴中）&lt;/p&gt;
&lt;p&gt;&amp;lt;/br&amp;gt;&lt;/p&gt;
&lt;h2&gt;商业/管理/创业&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;/posts/%E6%9D%82%E8%B0%88/opb-book/&quot;&gt;《opb-book-2.1.v3》&lt;/a&gt;（品鉴中）&lt;/p&gt;
&lt;p&gt;学习一下程序员怎么创立一人公司。&lt;/p&gt;
&lt;p&gt;&amp;lt;/br&amp;gt;&lt;/p&gt;
&lt;h1&gt;文学艺术&lt;/h1&gt;
&lt;h2&gt;电影研究&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;/posts/%E6%9D%82%E8%B0%88/%E5%A6%82%E4%BD%95%E8%81%8A%E7%94%B5%E5%BD%B1/&quot;&gt;《如何聊电影》&lt;/a&gt;（品鉴中）&lt;/p&gt;
&lt;p&gt;讲述了如何对一部电影进行分析和评价，不管是一部佳作还是一部烂片。本书从剧本、表演、艺术设计、摄影、剪辑、声音与音乐、导演七个方面进行分析。&lt;/p&gt;
&lt;p&gt;首先是剧本部分。剧本需要回答的第一个问题是：电影制作者到底想做一部怎样的电影？&lt;/p&gt;
&lt;p&gt;&amp;lt;/br&amp;gt;&lt;/p&gt;
&lt;h1&gt;综合/跨学科&lt;/h1&gt;
&lt;h2&gt;神秘学&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;/posts/%E6%9D%82%E8%B0%88/%E7%A7%98%E8%8B%91%E7%8E%AB%E7%91%B0/&quot;&gt;《秘苑玫瑰》&lt;/a&gt;（品鉴中）&lt;/p&gt;
&lt;p&gt;简单了解一下神秘学。内容很浅显，感觉是科普性质的书，美中不足的是，在一些细节上讲的不是很清楚。&lt;/p&gt;
&lt;p&gt;暂时没看到实操相关的内容。&lt;/p&gt;
&lt;p&gt;&amp;lt;/br&amp;gt;&lt;/p&gt;
&lt;h2&gt;科学哲学/科学史&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;/posts/%E6%9D%82%E8%B0%88/%E4%B8%96%E7%95%8C%E8%A7%82%EF%BC%9A%E7%8E%B0%E4%BB%A3%E4%BA%BA%E5%BF%85%E9%A1%BB%E8%A6%81%E6%87%82%E7%9A%84%E7%A7%91%E5%AD%A6%E5%93%B2%E5%AD%A6%E5%92%8C%E7%A7%91%E5%AD%A6%E5%8F%B2/&quot;&gt;《世界观：现代人必须要懂的科学哲学和科学史》&lt;/a&gt;（品鉴中）&lt;/p&gt;
&lt;p&gt;&amp;lt;/br&amp;gt;&lt;/p&gt;
</content:encoded><category>杂谈</category><author>Tsglz</author></item><item><title>《牛津通识读本：司法心理学》读后感</title><link>https://astro-theme-typography.vercel.app/posts/%E6%9D%82%E8%B0%88/%E7%89%9B%E6%B4%A5%E9%80%9A%E8%AF%86%E8%AF%BB%E6%9C%AC%E5%8F%B8%E6%B3%95%E5%BF%83%E7%90%86%E5%AD%A6/</link><guid isPermaLink="true">https://astro-theme-typography.vercel.app/posts/%E6%9D%82%E8%B0%88/%E7%89%9B%E6%B4%A5%E9%80%9A%E8%AF%86%E8%AF%BB%E6%9C%AC%E5%8F%B8%E6%B3%95%E5%BF%83%E7%90%86%E5%AD%A6/</guid><description>《牛津通识读本：司法心理学》读后感</description><pubDate>Fri, 12 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;在读这本书之前，我一直在思考一个问题，为什么在这些刑事案件中，需要司法心理学家出现？&lt;/p&gt;
&lt;p&gt;在阅读这本书之后，我修正了之前的观点，但是我仍然认为，司法心理学的作用远没有那么重要。不过我认为可以给那些愿意并且主动寻求纠正自己行为的犯罪者一个改过自新的机会，这个时候司法心理学是最有用的。&lt;/p&gt;
&lt;p&gt;而对于那些已经定型了的恶劣罪犯，我认为完全没有必要浪费宝贵的社会资源来纠正他们的行为。他们最大的用处就是做成肥料或者其他产品，这样不仅可以减轻社会压力，减轻自然环境承载力的负担，还能够为社会做出贡献。比如，肥料可以促进作物生长，这样一些贫瘠地区的粮食产量就可以提高，饥饿问题也相应能够得到改善。&lt;/p&gt;
&lt;p&gt;但是后面我又产生了一些疑虑，比如，什么样的社会制度能够允许我这种惩戒措施的实施？此外，如果一个犯罪者同时具备不可纠正的特性，以及巨大的功劳或者潜在的作用，我是否应该对他们的行为进行惩戒？如果一个不可纠正的犯罪者与某些权力掌握者有密切关联或者利益纠葛，这种人该怎么处理，等等。&lt;/p&gt;
&lt;p&gt;嗯，这些都是我发散思维后未经合理验证的一些想法，而非真实案例。如果说要设计一个具体可行的完备系统，我可能需要更多的知识补充，以及对法律、制度等更深入的了解。&lt;/p&gt;
&lt;p&gt;这本书只是一本通识读本，而非专业书籍，书中仅仅包含了少量案例，并且这些案例也只有寥寥几句话描述带过。这本书更多的讲述了司法心理学中的一些概念，但是这本书将我引向了一个此前很少接触的新领域——司法心理学。给了我很多灵感，让我能够进一步补全对这个世界的认知拼图。&lt;/p&gt;
&lt;p&gt;&amp;lt;/br&amp;gt;&lt;/p&gt;
&lt;p&gt;话归正题，下面是我画的一张简图（画的有点乱糟糟的，但是内容应该是比较全的）：&lt;/p&gt;
&lt;p&gt;&amp;lt;img src =&quot;/reading-reflections/牛津通识读本：司法心理学/lead-to-crime.png&quot;&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;/br&amp;gt;&lt;/p&gt;
&lt;p&gt;在阅读过程中，我提出了一些问题，我将在下面一一枚举，并给出我查阅资料后思考的结果。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q1：在家暴事件中，为什么家暴者选择了暴力沟通？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;我认为这是一种多个因素混合的产物。&lt;/p&gt;
&lt;p&gt;首先是社会环境，一些人在年幼时遭受过或目睹过家庭暴力，可能在塑造观念的关键时期带来了错误的引导，此外，社会上（包括现在仍然存在）的重男轻女的思想，也在潜移默化地影响着人们的想法和行为。&lt;/p&gt;
&lt;p&gt;更糟糕的是，在某些问题上，性别不平等，也导致了一些人选择了暴力沟通。比如说，当女性的经济地位低于男性时，男性更可能产生一种优越感，在我看来这也算一种隐形的暴力。（当然，被家暴的并非全部都是女性，但是女性经济地位低于男性比较普遍，故举此例）&lt;/p&gt;
&lt;p&gt;另一方面，法律的不完善，或者是法律的执行不严格，也助长了暴力沟通的出现。同时，这样的不平等会让受害者失去对法律的信任，可能在受到伤害后选择忍受而非寻求法律保护。（如果法律对受害者保护力度不够，加害者可能会变本加厉）&lt;/p&gt;
&lt;p&gt;当受害者的经济地位处于劣势，法律保护又不足时，很可能会形成一个糟糕的正反馈，陷入绝望的境地，心理上认为被伤害是正常的现象，又助长了施暴者的嚣张气焰。&lt;/p&gt;
&lt;p&gt;&amp;lt;/br&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q2：现在的司法制度合理吗？如果不合理，我有能力提出更好的吗？如果我没有这个能力，我是否有能力在现有基础上修正？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;不知道这个算不算不能播的...&lt;/p&gt;
&lt;p&gt;其实我心里已经有答案了。但是我允许这个答案不断变化。或许之后我学到了更多相关的知识之后会有不一样的看法呢？&lt;/p&gt;
&lt;p&gt;&amp;lt;/br&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q3：犯罪地图画像系统中有应用到圆周假设，在后续的演进中更是发展出了植入决策支持系统构图软件的概率运算。这些技术是否能类比应用到其他领域（我更关注安全领域）？目前这方面最前沿的技术是什么样的？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;查了一些资料，圆周假设的应用领域还是比较广的。&lt;/p&gt;
&lt;p&gt;简单讲一讲圆周假设是什么：事件发生地围绕一个中心点（通常是主体的居住地或活动基地）呈概率分布，距离越远，发生概率越低。这本质上是一种空间衰减模型。基于此的概率运算，如核密度估计（KDE）和贝叶斯概率模型，可以被迁移至以下领域：&lt;/p&gt;
&lt;p&gt;疾病集群源头追踪、动物巢穴或活动核心区推断、事故源头定位、城市规划/选址的需求热点分析、网络空间安全中攻击源地理定位（这一条我有一点点存疑，因为要考虑VPN等因素）、考古中对古代定居点或活动中心的推断等等。&lt;/p&gt;
&lt;p&gt;另一个问题，当前比较前沿的技术组合与计算机方法，首先就是热点机器学习与深度学习，可解释人工智能（XAI）这些，这个我就不细说了，各个领域都大差不差的，反正 ai 赋能都这么回事。&lt;/p&gt;
&lt;p&gt;我要稍微提一提没见过的，比如多源异构数据融合（社交媒体与文本数据、移动通信与位置服务数据、交通与物联网数据、环境与基础设施数据等），这个方法感觉对我的社会工程学研究很有帮助，很有启发意义。&lt;/p&gt;
&lt;p&gt;还有实时流处理（实时接收并分析犯罪报告、紧急呼叫、社交媒体帖子的流处理管道），这个国外好像有类似的软件，我之前有看到过，感觉还是挺有意思的。（大概就是把经常发生暴力事件、或者帮派活动的地方作为热点标注，提醒人们不要靠近，大概是这样，很久之前看到的了，记得不是特别清楚）&lt;/p&gt;
&lt;p&gt;其实做网络地理画像和我做社会工程学感觉差不多，都是收集信息、分析信息，最后把人扒干净，哈哈。&lt;/p&gt;
&lt;p&gt;&amp;lt;/br&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q4：案件取证的时候会包括对犯罪者的行为描述，如果是证人口述，怎么判断是否真实？取证过程中证据可能包含物证、行为描述、案发地点等等，怎么将这些证据串联成为一个最具说服力的定罪证据？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;查阅了一些资料：&lt;/p&gt;
&lt;p&gt;根据我国刑事诉讼法及相关司法解释，对证人证言真实性的审查主要从以下方面进行：感知能力审查（证人状态）、利害关系审查、程序合法性审查（是不是被暴力威胁了）、印证性审查（与其他证据有无矛盾）&lt;/p&gt;
&lt;p&gt;顺便讲一讲陈述有效性评估（SVA）：&lt;/p&gt;
&lt;p&gt;因为我对这方面比较感兴趣，所以多了解了一些。&lt;/p&gt;
&lt;p&gt;陈述有效性评估是一种用于评估陈述真实性的心理学技术，核心是标准基础内容分析（CBCA）。CBCA基于一个核心理论假设：来自真实经验记忆的陈述与基于创造或幻想的陈述，在内容和质量上是不同的。&lt;/p&gt;
&lt;p&gt;SVA中的13个标准可以在CBCA中找到对应：逻辑一致性（对应CBCA“逻辑结构”）、非结构化产出（对应CBCA“无组织的叙述”）、细节的数量（对应CBCA“细节的质量”）、语境嵌套性（对应CBCA“语境铺垫”）、对互动的描述（对应CBCA“对交互行为的描述”）、对话重构（对应CBCA“话语复述”）、预测外的难题（对应CBCA“事件中料想不到的复杂化”）、不寻常的细节（对应CBCA“异常的细节”）、冗余的细节（对应CBCA“多余的细节”）、受询者心理状态归因研究（对应CBCA“犯罪者的心理状态归因”）、自发的修正（对应CBCA“自发改正”）、承认缺失部分记忆（对应CBCA“承认记忆的缺乏”）、提出怀疑（对应CBCA“对自己证言有怀疑”）。&lt;/p&gt;
&lt;p&gt;有几条名称不太好懂的我单独拎出来讲一下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;非结构化产出：真实经历者在回忆时可能先讲核心再补充细节或者其他片段，而说谎者倾向按时间顺序编造。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;语境嵌套性：事件能否与陈述者日常行为和习惯联系起来。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;对话重构：陈述中是否以初始形式复述对话，能区分出不同的说话者。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;冗余的细节：与核心指控无关但与事件相关的额外细节。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;然后是怎么构建证据链：比较常见的是时间线重建，将整个事件还原出来，结合物证、行为描述、案发地点，重建空间移动轨迹，放入到动机-手段-机会（MMO）框架中，同时，证据之间可以相互印证，来排查是否存在矛盾点或者异常点，从而进一步完善证据链。&lt;/p&gt;
&lt;p&gt;——————————————————————————————————————————————————————————————————————&lt;/p&gt;
&lt;p&gt;此外，作者在书的结尾部分还提到了侦察心理学，并给出了下面几个问题：&lt;/p&gt;
&lt;p&gt;&amp;lt;/br&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;为什么人们明明知道某人是罪犯还要为其做伪证？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;我个人的观点：伪证者可能受到了威胁或是害怕被报复；如果有利害关系的话，伪证者可能出于对自己利益的维护，选择做伪证；如果目击者和被指认方存在亲缘关系，伪证者更有可能对被指认者袒护。&lt;/p&gt;
&lt;p&gt;此外，当一些证人的文化素质和法制意识不强，无法充分认识伪证行为的严重性和违法性时，更可能产生做伪证的行为。&lt;/p&gt;
&lt;p&gt;在查找资料的过程中，我还看到了另一种阐释：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;从社会学和传播学角度，我们可以引入“叙事权力”的概念。法庭审判不仅是事实的认定，更是叙事的竞争。作伪证者，有时是在试图构建一个对自己或所支持之人更有利的“故事版本”。他们可能认为，自己所支持的那个“叙事”（例如，一个关于家庭、友谊或反抗不公的叙事）比冰冷的“法律事实”更接近他们所理解的“正义”或“真相”。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;lt;/br&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;罪犯愿意通过什么程序进行虚假申诉，请求帮助寻找失踪的但是事实上是被他们自己杀害的爱人？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这个问题让我想到了《消失的她》哈哈。&lt;/p&gt;
&lt;p&gt;虚假申诉的主要程序：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;向警方正式报案。罪犯通常会表现出焦虑、悲伤甚至崩溃，以博取警方同情。但细致的观察可能发现其情感反应与情境不协调（如眼神飘忽、细节描述过于流畅）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;利用媒体和社交平台造势。罪犯选择扩大事件影响力，将自己塑造成“焦急的伴侣”，从而转移公众怀疑，同时制造情感绑架，让周围人更难质疑其行为。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;联系民间搜救组织。罪犯借助第三方力量增加搜寻的“真实性”，并利用搜救过程进一步观察调查方向，及时调整自己的谎言。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;推动法律程序。罪犯在适当时机（通常是数周或数月后）向法院申请宣告失踪或死亡，以便处理财产、保险理赔等事务。同时，可能咨询律师，了解如何规避法律风险。除了经济利益，这也是对“失踪”状态的正式确认，有助于罪犯心理上“结案”。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;持续的情感操纵。罪犯在家人、朋友面前持续扮演悲痛角色，可能写悼念日记、保留爱人的物品，甚至创建纪念网站。通过重复表演来强化自我欺骗，减轻认知失调（即“我杀了爱人，但我仍在寻找她”）。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;怎么从侦察心理学的视角识别虚假申诉？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;报案时机异常：要么过早（爱人刚“失踪”就急于报案），要么过晚（故意拖延以制造更可信的失踪证据）。&lt;/li&gt;
&lt;li&gt;细节描述矛盾：对失踪前后的细节描述过于完美，或在多次询问中出现不一致。&lt;/li&gt;
&lt;li&gt;情感反应不协调：缺乏真实的悲伤生理反应（如哭泣时无眼泪），或情绪切换生硬（如从“悲痛”迅速转为“理性”讨论财产）。&lt;/li&gt;
&lt;li&gt;行为模式反常：过早询问遗产继承、保险理赔等事宜，或对调查进展表现出不应有的“了解”（如提及未公开的线索）。&lt;/li&gt;
&lt;li&gt;社会关系异常：与爱人的亲友关系突然变得疏远或过度亲密，以控制信息传播。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;lt;/br&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;管理愤怒的人群的最有效方式是什么？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;OS：最有效的方法其实是赶紧把导致愤怒的问题解决，而不是把愤怒的人解决。&lt;/p&gt;
&lt;p&gt;就像治水一样，堵不如疏。愤怒往往来源于未被倾听的诉求。倾听愤怒的人群提出的诉求，给予他们尊重，这是管理的第一步。然后要精确地找到人群中的情绪领袖或煽动者，对他们进行相应的干预。这样可以很好地分化愤怒的人群。最后，对闹事者给予应有的惩戒，但不能过度惩戒，避免激化矛盾。&lt;/p&gt;
&lt;p&gt;&amp;lt;/br&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;是什么样的心理过程导致人们诉诸恐怖主义？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;依旧分内因和外因来阐述。&lt;/p&gt;
&lt;p&gt;内因主要是身份认同需求。极权主义群体提供简单的善恶二元叙事、清晰的身份标签和强烈的归属感，这对处于身份危机中的个体尤其有吸引力。此外，具有自恋倾向、外化倾向、边缘人格特征的人更可能参与恐怖主义。巨大的心理创伤也可能导致人们诉诸恐怖主义。&lt;/p&gt;
&lt;p&gt;外因主要是社会心理环境因素。社会不平等与边缘化、社会冲突与分裂、政治压迫与不公、媒体影响与意识形态传播为恐怖主义提供了滋生的土壤。&lt;/p&gt;
&lt;p&gt;&amp;lt;/br&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;推荐指数：7.5/10&lt;/strong&gt;&lt;/p&gt;
</content:encoded><category>杂谈</category><author>Tsglz</author></item><item><title>低价值资产不等于只需要简单防护</title><link>https://astro-theme-typography.vercel.app/posts/red-team/%E4%BD%8E%E4%BB%B7%E5%80%BC%E8%B5%84%E4%BA%A7%E4%B8%8D%E7%AD%89%E4%BA%8E%E5%8F%AA%E9%9C%80%E8%A6%81%E7%AE%80%E5%8D%95%E9%98%B2%E6%8A%A4/</link><guid isPermaLink="true">https://astro-theme-typography.vercel.app/posts/red-team/%E4%BD%8E%E4%BB%B7%E5%80%BC%E8%B5%84%E4%BA%A7%E4%B8%8D%E7%AD%89%E4%BA%8E%E5%8F%AA%E9%9C%80%E8%A6%81%E7%AE%80%E5%8D%95%E9%98%B2%E6%8A%A4/</guid><description>低价值资产若防护不当，可能被攻击者用作攻击高价值资产的跳板。攻击者常从外围突破，利用访客WiFi、未打补丁的电脑等作为初始入侵点，进而内网侦察、横向移动以窃取高价值资产的访问权限。因此，安全体系需综合考虑资产价值及其与高价值资产的关联性，并使用零信任架构。对低价值资产，应预测攻击者可能如何利用它们以减少损失。</description><pubDate>Thu, 11 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;昨天晚上看到一位安全工作者发的公众号，里面提到说，真正重要的资产未必获得了匹配等级的保护。攻击者永远优先寻找最有价值、最关键、最容易获得收益的地方。防御也应该优先保护这些资产。&lt;/p&gt;
&lt;p&gt;我认为这么说还是相对片面了。&lt;/p&gt;
&lt;p&gt;低价值资产，是指那些在安全领域中，其价值相对较低的资产。这些资产通常被忽略，因为它们的保护成本较高，而其收益较低。&lt;/p&gt;
&lt;p&gt;但是有一点不能忽略。一些的低价值资产，如果不合理地防护，其实更有可能作为攻击者的目标，然后作为跳板攻击高价值资产。&lt;/p&gt;
&lt;p&gt;这就涉及到了资产配置的优先级。由于企业资产优先，无法对所有资产采取同等强度的防护力度。那么，该怎么合理配置资产的防护级？&lt;/p&gt;
&lt;p&gt;让我们首先思考一下攻击者的攻击路径。攻击者的经典攻击路径往往不是直接攻击堡垒，而是“从外围突破，逐步横移”。一个看似低价值的资产（如一台访客WiFi、一个废弃的测试服务器、一台未打补丁的办公电脑）可能因为防护薄弱而成为初始入侵点。一旦控制了这些资产，攻击者就可以：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;进行内网侦察，绘制网络拓扑，发现高价值资产的位置。&lt;/li&gt;
&lt;li&gt;利用信任关系，如域环境、跳板机、共享凭据，横向移动到核心网络。&lt;/li&gt;
&lt;li&gt;窃取低级别凭据，再通过密码复用或权限提升，获取高价值资产的访问权限。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以我想一个健壮的安全体系应该是&lt;strong&gt;综合考虑&lt;/strong&gt;资产的价值以及与高价值资产的关联性，同时严格使用零信任架构，对资产间的访问进行监督和限制。&lt;/p&gt;
&lt;p&gt;对低价值资产，我们不仅要合理防护，更要考虑到如果它被攻陷，攻击者会利用它做什么？攻击者能利用它做什么？如果能未雨绸缪，提前做好预案，那么即使受到攻击，损失也可以大幅度减少。&lt;/p&gt;
&lt;p&gt;同理，做样本分析也是这个思路。每拿到一个新样本，需要思考的不仅仅是它做了什么，更要思考它为什么这么做，它为什么可以这么做。因为最近我有参与设计一套自动化样本分析框架，我对样本分析的一整套流程有了更深刻的见解。&lt;/p&gt;
&lt;p&gt;一个样本，一种技术，一套流程，在这些不断迭代的表象下面，我们需要看到的是攻击者与防御者之间的对抗。&lt;/p&gt;
&lt;p&gt;碎碎念就到这里了。后续可能会讲一讲那个自动化样本分析框架在实际搭建的过程中的一些思考。共勉。&lt;/p&gt;
</content:encoded><category>Red Team</category><author>Tsglz</author></item><item><title>《你的第一本哲学书》读后感</title><link>https://astro-theme-typography.vercel.app/posts/%E6%9D%82%E8%B0%88/%E4%BD%A0%E7%9A%84%E7%AC%AC%E4%B8%80%E6%9C%AC%E5%93%B2%E5%AD%A6%E4%B9%A6/</link><guid isPermaLink="true">https://astro-theme-typography.vercel.app/posts/%E6%9D%82%E8%B0%88/%E4%BD%A0%E7%9A%84%E7%AC%AC%E4%B8%80%E6%9C%AC%E5%93%B2%E5%AD%A6%E4%B9%A6/</guid><description>《你的第一本哲学书》读后感</description><pubDate>Thu, 21 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;这本书带给我的阅读体验并不是很好。或者更贴切的说，如果你在阅读前就对问题有相关的思考，这本书可以带来较好的印证，或是一些新的思路或启发；如果你只是想走马观花地了解一下，可能看了一遍之后还是云里雾里。&lt;/p&gt;
&lt;p&gt;这本书主要围绕9个问题展开，分别是“外部世界是否存在”，“他人的意识”，“身——心问题”，“词语的意义”，“自由意志”，“对与错”，“正义”，“死亡”，“人生的意义”。&lt;/p&gt;
&lt;p&gt;其他的我也不太会总结，但是显而易见，这本书只能给你提供启发，没有任何一本哲学书能让你无视一切偏听偏信，你应该有自己的思考。（这本书的作者在一些方面确实不是很懂行，也可能是科技发展太快了，让当时很多不可能变成了可能）。&lt;/p&gt;
&lt;p&gt;在前面的几个章节，作者除了啰嗦且晦涩，也还能看。但是最后几个章节，我还是有一些不满的。比如说，我不认可作者在道德方面的相关论述，而且他的观点在我看来不够完善，在逻辑上也不够有说服力，不过无伤大雅，每个人都可以有自己的哲学观点，我选择理解，但不尊重。此外，在正义的章节，我认为作者的引入就有所偏颇。后续作者修正了自己的观点，让我感觉比较满意。&lt;/p&gt;
&lt;p&gt;不过要是有谁真把这本书作为第一本哲学书，那可真是完蛋了。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;推荐指数：6/10&lt;/strong&gt;&lt;/p&gt;
</content:encoded><category>杂谈</category><author>Tsglz</author></item><item><title>《哲学家们都干了什么》读后感</title><link>https://astro-theme-typography.vercel.app/posts/%E6%9D%82%E8%B0%88/%E5%93%B2%E5%AD%A6%E5%AE%B6%E4%BB%AC%E9%83%BD%E5%B9%B2%E4%BA%86%E4%BB%80%E4%B9%88/</link><guid isPermaLink="true">https://astro-theme-typography.vercel.app/posts/%E6%9D%82%E8%B0%88/%E5%93%B2%E5%AD%A6%E5%AE%B6%E4%BB%AC%E9%83%BD%E5%B9%B2%E4%BA%86%E4%BB%80%E4%B9%88/</guid><description>《哲学家们都干了什么》读后感</description><pubDate>Thu, 07 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;这本书是我决定系统学习哲学知识之后阅读的第一本书。个人觉得这本书看起来非常舒适，很适合给完全不了解哲学，想要入门的学者扫盲。&lt;/p&gt;
&lt;p&gt;但是有一点需要注意，这本书更偏向于按照时间顺序将古往今来西方比较有名的哲学家和他们的思想引出来，按照发展顺序连成较为线性的叙事结构。这就导致了不少的哲学家在书中只是几笔带过，甚至没有提及。&lt;/p&gt;
&lt;p&gt;不过书中提到的哲学家，他们的著作想要拜读一遍，已经有相当的工作量了，如果后续还有余力，可以进一步发散研究。&lt;/p&gt;
&lt;p&gt;这本书非常有意思的一点，里面提到了不少哲学家们的八卦，我常常和朋友们分享他们的恶心事迹，真是大开眼界。看来哲学家只是一份事业，而非一种人生态度。（对我就是在骂叔本华这样的人）&lt;/p&gt;
&lt;p&gt;其他就没什么了。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;推荐指数：7.5/10&lt;/strong&gt;&lt;/p&gt;
</content:encoded><category>杂谈</category><author>Tsglz</author></item><item><title>使用 yt-dlp 从 Youtube 下载音频记录</title><link>https://astro-theme-typography.vercel.app/posts/tools/%E4%BD%BF%E7%94%A8-yt-dlp-%E4%BB%8E-youtube-%E4%B8%8B%E8%BD%BD%E9%9F%B3%E9%A2%91%E8%AE%B0%E5%BD%95/</link><guid isPermaLink="true">https://astro-theme-typography.vercel.app/posts/tools/%E4%BD%BF%E7%94%A8-yt-dlp-%E4%BB%8E-youtube-%E4%B8%8B%E8%BD%BD%E9%9F%B3%E9%A2%91%E8%AE%B0%E5%BD%95/</guid><description>通过 yt-dlp 以及插件 Get cookies.txt Clean 从 Chrome 浏览器上下载 Youtube 视频的实践。</description><pubDate>Sat, 18 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;今天突然想从 Youtube 上下载一些国内被 ban 掉的歌，但是发现需要充钱。于是笔者转头开始扒有没有小工具，还真找到一个：https://github.com/yt-dlp/yt-dlp&lt;/p&gt;
&lt;p&gt;&amp;lt;img src =&quot;/Tools/yt-dlp/install.png&quot;&amp;gt;&lt;/p&gt;
&lt;p&gt;把它下载下来：https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp.exe&lt;/p&gt;
&lt;p&gt;首先测试了使用 edge 浏览器对 Youtube 内容进行爬取，命令如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;yt-dlp --cookies-from-browser edge &quot;https://www.youtube.com/watch?v=arGVWzrCnvM&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后报错了，这个工具拿不到 edge 的 cookie：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Extracting cookies from edge ERROR: Could not copy Chrome cookie database. See https://github.com/yt-dlp/yt-dlp/issues/7271 for more info ERROR: Could not copy Chrome cookie database. See https://github.com/yt-dlp/yt-dlp/issues/7271 for more info
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;后面我查到一种方法，可以直接把浏览器的 cookie 保存下来供 yt-dlp 使用：即使用一个叫 get cookies txt 的插件（edge上叫这个）。但是实际测试结果不佳，这个插件获得不了 Youtube 页面的 cookie，如下图所示：&lt;/p&gt;
&lt;p&gt;&amp;lt;img src =&quot;/Tools/yt-dlp/error.png&quot;&amp;gt;&lt;/p&gt;
&lt;p&gt;后续因为 edge 上开的页面太多了不方便测试排查失败原因，我直接转到 Chrome 浏览器。这里使用了一个叫 Get cookies.txt Clean 1.0 的插件，如下图所示：&lt;/p&gt;
&lt;p&gt;&amp;lt;img src =&quot;/Tools/yt-dlp/Get-cookies.png&quot;&amp;gt;&lt;/p&gt;
&lt;p&gt;使用方法：打开 chrome 浏览器，点开 Youtube 界面，使用插件将 cookies 导出到 txt：&lt;/p&gt;
&lt;p&gt;&amp;lt;img src =&quot;/Tools/yt-dlp/get-youtube-cookies.png&quot;&amp;gt;&lt;/p&gt;
&lt;p&gt;然后就可以使用 yt-dlp 和 youtube.com_cookies.txt 来拉取想要的 mp3 文件。注意这里还有一个关键点：yt-dlp 在解析 Youtube 时需要执行 Youtube 的解密逻辑（Youtube 现在的视频流是被 signatureCipher 保护的，需要 js 解密参数）。所以 yt-dlp 必须下载 player JS，执行解密函数来还原真实 URL。&lt;/p&gt;
&lt;p&gt;因为我的电脑上已经有 node.js，所以这里不过多讲解环境配置问题，而是分享工具使用的过程。&lt;/p&gt;
&lt;p&gt;使用命令如下，即可得到想要的音频：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;yt-dlp --cookies youtube.com_cookies.txt --js-runtimes node -f bestaudio --extract-audio --audio-format mp3 &quot;https://www.youtube.com/watch?v=arGVWzrCnvM&quot;
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><category>Tools</category><author>Tsglz</author></item><item><title>博客后续更新说明</title><link>https://astro-theme-typography.vercel.app/posts/%E6%9D%82%E8%B0%88/%E5%8D%9A%E5%AE%A2%E5%90%8E%E7%BB%AD%E6%9B%B4%E6%96%B0%E8%AF%B4%E6%98%8E/</link><guid isPermaLink="true">https://astro-theme-typography.vercel.app/posts/%E6%9D%82%E8%B0%88/%E5%8D%9A%E5%AE%A2%E5%90%8E%E7%BB%AD%E6%9B%B4%E6%96%B0%E8%AF%B4%E6%98%8E/</guid><description>致歉，填旧坑，并且开新坑。</description><pubDate>Sun, 12 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;前段时间一直沉迷收集一些书籍，有些书几乎绝版了不太好找，或者没有中文版本的书籍，所以精力大部分耗费在这件事上。&lt;/p&gt;
&lt;p&gt;在对技术这方面的研究搁置了，博客更新也暂停了一段时间。后续会继续更新。&lt;/p&gt;
&lt;p&gt;除了对技术的研究，我还会更新一些在其他领域的思考，看这篇博客的分类就知道了哈哈，主要是对哲学、心理学，还有一些神秘学的思考。因为我是实践派，所以更多地会结合与实操相关的知识，或者将理论与现实生活联系起来。&lt;/p&gt;
&lt;p&gt;除此之外，我还是会继续更新[逆向分析]、[模型辅助视频内容概览]这两个开过的坑的内容，会更新的，我保证QAQ。&lt;/p&gt;
</content:encoded><category>杂谈</category><author>Tsglz</author></item><item><title>XMRig系列挖矿木马分析与yara检测（一）</title><link>https://astro-theme-typography.vercel.app/posts/%E6%A0%B7%E6%9C%AC%E5%88%86%E6%9E%90/xmrig%E7%B3%BB%E5%88%97%E6%8C%96%E7%9F%BF%E6%9C%A8%E9%A9%AC%E5%88%86%E6%9E%90%E4%B8%8Eyara%E6%A3%80%E6%B5%8B%E4%B8%80/</link><guid isPermaLink="true">https://astro-theme-typography.vercel.app/posts/%E6%A0%B7%E6%9C%AC%E5%88%86%E6%9E%90/xmrig%E7%B3%BB%E5%88%97%E6%8C%96%E7%9F%BF%E6%9C%A8%E9%A9%AC%E5%88%86%E6%9E%90%E4%B8%8Eyara%E6%A3%80%E6%B5%8B%E4%B8%80/</guid><description>XMRig是专为门罗币设计的高性能CPU挖矿软件，可高效利用资源，优化容器环境使用，支持参数调整。本文将从开源代码和样本库分析XMRig系列挖矿木马，找出通用检测规则。首个样本xmrig.exe实为启动器而非矿工程序，它构造命令行参数，包含关键IOC&quot;xmrigMiner.exe&quot;和后台运行参数&quot;- -daemonized&quot;。作者已编写简单匹配规则检测此类投递型Miner Wrapper。</description><pubDate>Mon, 26 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;XMRig 是一款专为门罗币（XMR）设计的高性能 CPU 挖矿软件，可以高效利用 CPU 资源，确保在不影响系统正常运行的前提下最大化挖矿效率。此外，该软件优化了在容器环境中的使用，便于在服务器等场景下部署和完成挖矿任务，且支持调整参数，实现个性化配置。&lt;/p&gt;
&lt;p&gt;该软件可以在 github 上下载：https://github.com/xmrig/xmrig&lt;/p&gt;
&lt;p&gt;&amp;lt;img src =&quot;/XMRig/1.xmrig-github.png&quot;&amp;gt;&lt;/p&gt;
&lt;p&gt;接下来笔者会从 xmrig 原作者的开源代码和样本库中已经确认的 xmrig 系列挖矿木马两方面进行分析，从而找出该系列木马的通用检测规则。&lt;/p&gt;
&lt;p&gt;首先开始对第一个样本的分析，对该系列样本有一个初步了解：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;样本名：xmrig.exe&lt;/p&gt;
&lt;p&gt;sha1:e502523c46e12da3006d86442a7d65aa46e490aa&lt;/p&gt;
&lt;p&gt;sha256:0336e377528646d711dba3d88782426de25a8c5b4be587707d43ac7afe18f090&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;使用 DIE 对样本简单查看，发现该样本里附加了一个 ADL 音频文件：&lt;/p&gt;
&lt;p&gt;&amp;lt;img src =&quot;/XMRig/1.xmrig.exe-die.png.png&quot;&amp;gt;&lt;/p&gt;
&lt;p&gt;对节进行查看，并没有发现非常明显的挖矿木马特征：&lt;/p&gt;
&lt;p&gt;&amp;lt;img src =&quot;/XMRig/1.xmrig.exe-exeinfo.png&quot;&amp;gt;&lt;/p&gt;
&lt;p&gt;接下来使用 IDA 查看样本的运行逻辑：&lt;/p&gt;
&lt;p&gt;整体看下来，很明显，这是一个 xmrig.exe 的启动器。首先样本获取自身路径：&lt;/p&gt;
&lt;p&gt;&amp;lt;img src =&quot;/XMRig/1.xmrig.exe-IDA1.png&quot;&amp;gt;&lt;/p&gt;
&lt;p&gt;然后创建字符串用于构造命令，这里能找到一个关键 IOC：&quot;xmrigMiner.exe&quot;&lt;/p&gt;
&lt;p&gt;&amp;lt;img src =&quot;/XMRig/1.xmrig-IOC1.png&quot;&amp;gt;&lt;/p&gt;
&lt;p&gt;后续是参数的拼接，最后跟随了一个重要参数：“ - -daemonized&quot;，代表脱离控制台，在后台静默挖矿。&lt;/p&gt;
&lt;p&gt;&amp;lt;img src =&quot;/XMRig/1.xmrig-IOC2.png&quot;&amp;gt;&lt;/p&gt;
&lt;p&gt;构造结构如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&quot;xmrigMiner.exe&quot; [argv[1] argv[2] ... argv[n]] &quot; --daemonized&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;经过逆向分析，该样本只是一个 投递型 Miner Wrapper，而非实际挖矿的矿工程序，所以这里写了一个简单的匹配规则，如下所示：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import &quot;pe&quot;
rule pe_xmrig_coinminer_match
{
    meta:
        author = &quot;tsglz&quot;
        description = &quot;投递型 Miner Wrapper&quot;
    strings:
        $s1 = &quot;xmrigMiner.exe&quot; nocase
        $s2 = &quot;--daemonized&quot;
    condition:
        pe.is_pe and $s1 and $s2
}
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><category>样本分析</category><category>Yara</category><author>Tsglz</author></item><item><title>VirusTotal-yara 规则学习（一）</title><link>https://astro-theme-typography.vercel.app/posts/yara/virustotal-yara-%E8%A7%84%E5%88%99%E5%AD%A6%E4%B9%A0%E4%B8%80/</link><guid isPermaLink="true">https://astro-theme-typography.vercel.app/posts/yara/virustotal-yara-%E8%A7%84%E5%88%99%E5%AD%A6%E4%B9%A0%E4%B8%80/</guid><description>VirusTotal支持两种yara规则使用方式：上传到Livehunt匹配未来样本，或用Retrohunt对历史样本批量匹配。yara规则由字符串定义和条件组成，字符串类型包括十六进制、文本和正则表达式，各有多种修饰符增强匹配能力。实际应用中需平衡严格性与准确性，避免误报漏报，且规则需持续更新以应对攻防对抗。</description><pubDate>Thu, 18 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;VirusTotal 支持使用 yara 规则筛选样本，共有两种方式：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;写 yara 上传到 Livehunt，匹配未来上传的样本&lt;/li&gt;
&lt;li&gt;使用 Retrohunt 对 VT 历史样本进行离线批量匹配&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;在 VT 中使用 yara 的步骤：&lt;/p&gt;
&lt;p&gt;点开侧边栏，在 IoC Investigation 中，下图黄框按需要点击即可：&lt;/p&gt;
&lt;p&gt;&amp;lt;img src =&quot;/vt-yara/1.IoC Investigation.png&quot;&amp;gt;&lt;/p&gt;
&lt;p&gt;Yara 基本规则：https://yara.readthedocs.io/en/stable/writingrules.html&lt;/p&gt;
&lt;p&gt;这里为了更好地测试代码，我使用了 vscode+YARA(插件)+yara64.exe(和yara文件放在同一目录)+rule.yara 的配置，可以快速在本地对目标样本进行测试。&lt;/p&gt;
&lt;p&gt;yara64.exe 可以从 https://github.com/VirusTotal/yara 下载。&lt;/p&gt;
&lt;p&gt;这里先讲一讲一些比较常用的内容：&lt;/p&gt;
&lt;p&gt;第一个是 yara 中常见的关键字：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;all&lt;/th&gt;
&lt;th&gt;and&lt;/th&gt;
&lt;th&gt;any&lt;/th&gt;
&lt;th&gt;ascii&lt;/th&gt;
&lt;th&gt;at&lt;/th&gt;
&lt;th&gt;base64&lt;/th&gt;
&lt;th&gt;base64wide&lt;/th&gt;
&lt;th&gt;condition&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;contains&lt;/td&gt;
&lt;td&gt;endswith&lt;/td&gt;
&lt;td&gt;entrypoint&lt;/td&gt;
&lt;td&gt;false&lt;/td&gt;
&lt;td&gt;filesize&lt;/td&gt;
&lt;td&gt;for&lt;/td&gt;
&lt;td&gt;fullword&lt;/td&gt;
&lt;td&gt;global&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;import&lt;/td&gt;
&lt;td&gt;icontains&lt;/td&gt;
&lt;td&gt;iendswith&lt;/td&gt;
&lt;td&gt;iequals&lt;/td&gt;
&lt;td&gt;in&lt;/td&gt;
&lt;td&gt;include&lt;/td&gt;
&lt;td&gt;int16&lt;/td&gt;
&lt;td&gt;int16be&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;int32&lt;/td&gt;
&lt;td&gt;int32be&lt;/td&gt;
&lt;td&gt;int8&lt;/td&gt;
&lt;td&gt;int8be&lt;/td&gt;
&lt;td&gt;istartswith&lt;/td&gt;
&lt;td&gt;matches&lt;/td&gt;
&lt;td&gt;meta&lt;/td&gt;
&lt;td&gt;nocase&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;td&gt;not&lt;/td&gt;
&lt;td&gt;of&lt;/td&gt;
&lt;td&gt;or&lt;/td&gt;
&lt;td&gt;private&lt;/td&gt;
&lt;td&gt;rule&lt;/td&gt;
&lt;td&gt;startswith&lt;/td&gt;
&lt;td&gt;strings&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;them&lt;/td&gt;
&lt;td&gt;true&lt;/td&gt;
&lt;td&gt;uint16&lt;/td&gt;
&lt;td&gt;uint16be&lt;/td&gt;
&lt;td&gt;uint32&lt;/td&gt;
&lt;td&gt;uint32be&lt;/td&gt;
&lt;td&gt;uint8&lt;/td&gt;
&lt;td&gt;uint8be&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;wide&lt;/td&gt;
&lt;td&gt;xor&lt;/td&gt;
&lt;td&gt;defined&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;yara 规则通常由两部分组成：字符串定义（strings）和条件（condition）。字符串有三种类型，十六进制，文本和正则表达式。&lt;/p&gt;
&lt;p&gt;所以第二个讲一下 yara 中的字符串，yara 中的字符串有三种类型：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;十六进制字符串&lt;/li&gt;
&lt;li&gt;文本字符串&lt;/li&gt;
&lt;li&gt;正则表达式&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;十六进制字符串最基本的写法如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;rule test
{
    meta:
        author = &quot;tsglz&quot;
    strings:
        $hex = { 4D 5A 90 00 }
    condition:
        $hex
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这段规则会在样本中查找 $hex 匹配的 16 进制字符串。&lt;/p&gt;
&lt;p&gt;除此之外，十六进制字符串有 4 种特殊结构：通配符，非运算符，跳转和替代。&lt;/p&gt;
&lt;p&gt;通配符可以占位，表示某个位置的字节位置，但是存在，可以匹配任何内容，用法如下所示：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;rule test
{
    meta:
        author = &quot;tsglz&quot;
    strings:
        $a = { 4D 5A ?? ?? }    // MZ 头
    condition:
        $a
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样写相较于前一种能够更好地匹配 MZ 头，避免遗漏。另外，通配符是按半字节定义的，所以可以只定义字节的一半，而另一半设置为未知。&lt;/p&gt;
&lt;p&gt;从 4.3.0 版本开始，可以使用非运算符，指定某个字节不是特定值。原文档中有如下用法：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;rule test
{
    strings:
        $hex_string = { F4 23 ~00 62 B4 }
        $hex_string2 = { F4 23 ~?0 62 B4 }
    condition:
        $hex_string and $hex_string2
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;当出现可变长度时，需要使用跳转运算符，如下所示：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;rule test
{
    strings:
        $hex_string = { F4 23 [4-6] 62 B4 }

    condition:
        $hex_string
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;其中 [4-6] 表示 4 到 6 字节的任意序列都可以占据这个位置。但是注意，下限不能大于上限。&lt;/p&gt;
&lt;p&gt;有时，可能需要为某个片段提供不同的替代方案，文档中举例如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;rule test
{
    strings:
        $hex_string = { F4 23 ( 62 B4 | 56 ) 45 }

    condition:
        $hex_string
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后是文本字符串，最基本的用法如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;rule test
{
    strings:
        $text_string = &quot;shellcode&quot;

    condition:
        $text_string
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;文本字符串支持如下转义字符：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;code&gt;\&quot;&lt;/code&gt;&lt;/th&gt;
&lt;th&gt;Double quote 双引号&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;\\&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Backslash 反斜杠&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;\r&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Carriage return 回车&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;\t&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Horizontal tab 水平标签&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;\n&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;New line 换行符&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;\xdd&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Any byte in hexadecimal notation 十六进制表示法中的任何字节&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;code&gt;nocase&lt;/code&gt; 修饰符可以将字符串转换为不区分大小写模式，此修饰符可以与除 &lt;code&gt;base64&lt;/code&gt; 、 &lt;code&gt;base64wide&lt;/code&gt; 和 &lt;code&gt;xor&lt;/code&gt; 之外的任何修饰符一起使用。用法如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;rule test
{
    meta:
        author = &quot;tsglz&quot;
    strings:
        $a = &quot;Nocase&quot; nocase
    condition:
        $a
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;宽字符字符串可用于搜索每个字符使用两个字节编码的字符串，例如，如果字符串“Borland”以每个字符两个字节（即 &lt;code&gt;B\x00o\x00r\x00l\x00a\x00n\x00d\x00&lt;/code&gt; ）的形式编码，则以下规则将匹配：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;rule test
{
    strings:
        $wide_string = &quot;Borland&quot; wide

    condition:
        $wide_string
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;注：这里的修饰符只是将字符串中字符的 ASCII 码与零交错排列，它并不支持包含非英文字符的真正 UTF-16 字符串。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;xor&lt;/code&gt; 修饰符可用于搜索应用了单字节 &lt;code&gt;xor&lt;/code&gt; 运算的字符串。也就是说，但你怀疑某段文本在样本中存在异或版本，可以使用这个修饰符，用法如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;rule test
{
    strings:
        $xor_string = &quot;This program cannot&quot; xor

    condition:
        $xor_string
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;一旦使用了 &lt;code&gt;xor&lt;/code&gt; 修饰符，该文本会被尝试从 0x00 ~ 0xFF 的密钥进行异或，有一个命中即判定为命中。&lt;/p&gt;
&lt;p&gt;文档中提到将 &lt;code&gt;xor&lt;/code&gt; 修饰符 与 &lt;code&gt;wide&lt;/code&gt; 和 &lt;code&gt;ascii&lt;/code&gt; 结合使用。&lt;code&gt;xor&lt;/code&gt; 修饰符会应用在所有其他修饰符之后。这意味着同时使用 &lt;code&gt;xor&lt;/code&gt; 和 &lt;code&gt;wide (WIDE)&lt;/code&gt; 会导致异或运算应用于交错的零字节。&lt;/p&gt;
&lt;p&gt;此外，yara 3.11 起，可以对 &lt;code&gt;xor&lt;/code&gt; 的字节范围进行限定，写法如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;rule test
{
    strings:
        $xor_string = &quot;This program cannot&quot; xor(0x01-0xaa)
    condition:
        $xor_string
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;base64&lt;/code&gt; 可用于搜索经过 base64 编码的字符串，&lt;code&gt;base64wide&lt;/code&gt; 则是先将原始字符转换为两个字节的形式，再做 base64 进行匹配。&lt;code&gt;base64&lt;/code&gt; 和 &lt;code&gt;base64wide&lt;/code&gt; 修饰符仅支持文本字符串。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;rule test {
    strings:
        $a = &quot;This program cannot&quot; base64
        $b = &quot;This program cannot&quot; base64wide
    condition:
        $a and $b
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;值得一提的是，&lt;code&gt;base64&lt;/code&gt; 和 &lt;code&gt;base64wide&lt;/code&gt; 支持自定义字母表，但是字母表长度必须为 64 字节。用例如下所示：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;rule test
{
    strings:
        $a = &quot;This program cannot&quot; base64(&quot;!@#$%^&amp;amp;*(){}[].,|ABCDEFGHIJ\x09LMNOPQRSTUVWXYZabcdefghijklmnopqrstu&quot;)
    condition:
        $a
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;yara 在 base64 编码后会去除开头和结尾的字符，这是为了更好地命中样本，减少漏报。但因此需要注意，使用 &lt;code&gt;base64&lt;/code&gt; 相关的匹配时，尽量不要使用过短的字符串进行匹配，以避免大量误报的可能。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;fullword&lt;/code&gt; 可以对字符串进行一个更严格的限制，保证字符串仅在文件中以非字母，数字字符分隔时才会匹配。例如，如果将字符串 domain 定义为 fullword ，则它不会匹配 www.mydomain.com ，但会匹配其他内容。 www.my-domain.com 和 www.domain.com 。&lt;/p&gt;
&lt;p&gt;最后是正则表达式：&lt;/p&gt;
&lt;p&gt;这个不多赘述了，需要什么规则和 ai 说让它写就完了，示例如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;rule test
{
    strings:
        $re1 = /md5: [0-9a-fA-F]{32}/
        $re2 = /state: (on|off)/
    condition:
        $re1 and $re2
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;正则表达式也可以像文本字符串一样，后跟 nocase 、 ascii 、 wide 和 fullword 修饰符。此外，可以使用修饰符 i 来忽略大小写，在要匹配的内容中加 . 来匹配任意字符（默认不匹配换行符），但是可以使用 修饰符 s 来匹配换行符。示例如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;rule test
{
    strings:
        $re1 = /foo/i    // 大小写不敏感
        $re2 = /bar./s   // bar后可跟任意一个字符，包括换行符
        $re3 = /baz./is  // 同上，且不区分大小写
    condition:
        any of them
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;此外，有一个比较好用的修饰词 private，可以让规则正常匹配，但不会在命中输出中显示，这样既可以避免检测点暴露，又可以减少输出过程中的噪声。示例如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;rule test
{
    strings:
        private $helper1 = &quot;cmd.exe&quot;
        private $helper2 = &quot;powershell&quot;
        $core = &quot;Invoke-Mimikatz&quot;

    condition:
        ($helper1 or $helper2) and $core
}
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Keyword 关键词&lt;/th&gt;
&lt;th&gt;String Types 字符串类型&lt;/th&gt;
&lt;th&gt;Summary 概括&lt;/th&gt;
&lt;th&gt;Restrictions 限制&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;nocase&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;文本，正则表达式&lt;/td&gt;
&lt;td&gt;忽略大小写&lt;/td&gt;
&lt;td&gt;不能与 &lt;code&gt;xor&lt;/code&gt; 、 &lt;code&gt;base64&lt;/code&gt; 或 &lt;code&gt;base64wide&lt;/code&gt; 一起使用。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;wide&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;文本，正则表达式&lt;/td&gt;
&lt;td&gt;通过穿插空字符 (0x00) 来模拟 UTF-16 编码&lt;/td&gt;
&lt;td&gt;无&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ascii&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;文本，正则表达式&lt;/td&gt;
&lt;td&gt;同时匹配 ASCII 字符，仅当使用 &lt;code&gt;wide&lt;/code&gt; 集时才需要。&lt;/td&gt;
&lt;td&gt;无&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;xor&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;文本&lt;/td&gt;
&lt;td&gt;与单字节键进行文本字符串异或运算&lt;/td&gt;
&lt;td&gt;不能与 &lt;code&gt;nocase&lt;/code&gt; 、 &lt;code&gt;base64&lt;/code&gt; 或 &lt;code&gt;base64wide&lt;/code&gt; 一起使用。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;`base64&lt;/td&gt;
&lt;td&gt;文本&lt;/td&gt;
&lt;td&gt;转换为 3 种 base64 编码字符串&lt;/td&gt;
&lt;td&gt;不能与 &lt;code&gt;nocase&lt;/code&gt; 、 &lt;code&gt;xor&lt;/code&gt; 或 &lt;code&gt;fullword&lt;/code&gt; 一起使用。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;`base64wide&lt;/td&gt;
&lt;td&gt;文本&lt;/td&gt;
&lt;td&gt;转换为 3 种 base64 编码字符串，然后像 &lt;code&gt;wide&lt;/code&gt; 一样交错插入空字符。&lt;/td&gt;
&lt;td&gt;不能与 &lt;code&gt;nocase&lt;/code&gt; 、 &lt;code&gt;xor&lt;/code&gt; 或 &lt;code&gt;fullword&lt;/code&gt; 一起使用。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;fullword&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;文本，正则表达式&lt;/td&gt;
&lt;td&gt;匹配项前后没有字母，数字，字符&lt;/td&gt;
&lt;td&gt;不能与 &lt;code&gt;base64&lt;/code&gt; 或 &lt;code&gt;base64wide&lt;/code&gt; 一起使用。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;private&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;十六进制、文本、正则表达式&lt;/td&gt;
&lt;td&gt;结果不包含在输出中&lt;/td&gt;
&lt;td&gt;无&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;这里笔者尝试写了一个通用样本的匹配规则，通过 Retrohunt 来查找符合条件的样本：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import &quot;pe&quot;

rule test_match
{
    meta:
        author = &quot;tsglz&quot;
    strings:
        $a = &quot;Software\\Microsoft\\Windows\\CurrentVersion\\Run&quot; //持久化
        $b = { 4D 5A ?? ?? }    // MZ 头
        $rwx = {41b940000000 41b8 [4 - 24] ff15}    //申请RWX内存
    condition:
        $a and $b and $rwx
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这段规则匹配了三部分内容，首先是 $a 检测常见的注册表持久化路径；然后通过 $b 检测 PE 文件头 MZ；最后通过 $rwx 十六进制匹配典型的 mov rax, ...; mov r8, ...; call [func] 形式，尝试匹配 RWX 分配。&lt;/p&gt;
&lt;p&gt;这段规则需要三点均满足才匹配（PE 恶意样本 + 持久化 + RWX），限制较为严格，容易产生误报和漏报：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;首先是注册表路径，可能出现在一些合法启动的程序中，造成误报；&lt;/li&gt;
&lt;li&gt;其次，RWX 内存申请 通配符可能过于严格，造成漏报，可以针对性地放宽部分条件。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在下一篇中笔者将讲一讲 yara 中的条件，同时讲一讲怎么提高匹配的针对性。此外，之后会对单一系列的样本进行高准确度的匹配，这需要对相关样本进行分析。&lt;/p&gt;
&lt;p&gt;需要注意的是，规则的构建并不是一劳永逸的，而是伴随着攻防双方的不断对抗，技术的不断迭代，需要不断更新的长期工作。&lt;/p&gt;
</content:encoded><category>Yara</category><author>Tsglz</author></item><item><title>大模型辅助 Bilibili 视频内容概览（二）</title><link>https://astro-theme-typography.vercel.app/posts/ai_summary_skills/%E5%A4%A7%E6%A8%A1%E5%9E%8B%E8%BE%85%E5%8A%A9-bilibili-%E8%A7%86%E9%A2%91%E5%86%85%E5%AE%B9%E6%A6%82%E8%A7%88%E4%BA%8C/</link><guid isPermaLink="true">https://astro-theme-typography.vercel.app/posts/ai_summary_skills/%E5%A4%A7%E6%A8%A1%E5%9E%8B%E8%BE%85%E5%8A%A9-bilibili-%E8%A7%86%E9%A2%91%E5%86%85%E5%AE%B9%E6%A6%82%E8%A7%88%E4%BA%8C/</guid><description>本文解决了Bilibili视频内容概览中手动操作繁琐的问题，通过脚本分文件处理和添加自动爬取模块，实现了自动提取BV号并解析获取字幕的功能。下一步计划完善批量总结、OCR文字识别、视频内容修复、信息提纯和内容预处理等功能，并解决整合过程中的问题。</description><pubDate>Tue, 02 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;在上一篇大模型辅助总结的文章中，笔者提出两个问题：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;手动操作过于麻烦，希望能够添加爬虫实现一键拉取功能&lt;/li&gt;
&lt;li&gt;部分 B 站视频没有相应的字幕，或者音频模糊，导致文本出现偏差的问题。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;今天笔者对问题一实现了脚本修正：&lt;/p&gt;
&lt;p&gt;首先为了模块清晰，笔者对之前的脚本进行了分文件处理，同时添加了自动爬取的模块，现在的代码架构如下：&lt;/p&gt;
&lt;p&gt;&amp;lt;img src =&quot;/llm-BiliBili/structure2.png&quot;&amp;gt;&lt;/p&gt;
&lt;p&gt;原来的一个文件被分为了四个：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[Bili_ai_fast_get]
    deepseek_llm.py
    get_subtitle.py
    main.py
    zhipu_llm.py
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里简化了手动从网页中拉取 json 的步骤，转为直接通过输入的链接自动提取 BV 号并解析，获取字幕接口并将提取到的字幕保存到本地文件中。&lt;/p&gt;
&lt;p&gt;关键代码如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import json
import requests
import re

def fetch_and_save_subtitles(bvnane: str, file_name: str = &quot;content.txt&quot;):
    # 目标网址和请求头
    headers = {
        &quot;Cookie&quot;: &quot;&quot;,   # 填自己的
        &quot;Origin&quot;: &quot;https://www.bilibili.com&quot;,
        &quot;User-Agent&quot;: &quot;&quot;    # 填自己的
    }

    # 视频的 URL
    pp = &quot;0&quot;
    url = f&quot;https://www.bilibili.com/video/{bvnane}/?spm_id_from=333.1007.tianma.1-2-2.click&amp;amp;vd_source=efbc10526f5fa5642530923cf09ce506&amp;amp;p={pp}&quot;

    # 发送HTTP请求获取页面
    response = requests.get(url, headers=headers)

    # 提取 aid 和 cid
    aid_match = re.findall(r&apos;.*,&quot;aid&quot;:(\d+),&apos;, response.text)
    cids_match = re.findall(rf&apos;&quot;{bvnane}&quot;,&quot;cid&quot;:(\d+),&apos;, response.text)

    if aid_match and cids_match:
        aid = aid_match[0]
        cid = cids_match[0]
        print(f&quot;aid: {aid}, cid: {cid}&quot;)

        # 获取字幕接口 URL
        hturl = f&quot;https://api.bilibili.com/x/player/wbi/v2?aid={aid}&amp;amp;cid={cid}&quot;
        print(f&quot;[+]请求字幕接口: {hturl}&quot;)

        # 发送第二次请求
        response2 = requests.get(hturl, headers=headers)

        # 提取字幕url
        pattern = r&apos;&quot;subtitle_url&quot;:&quot;(.*?)&quot;,&quot;subtitle_url_v2&quot;&apos;
        match = re.search(pattern, response2.text)

        if match:
            subtitle_url = match.group(1)
            print(f&quot;[+]字幕 URL: https:{subtitle_url}&quot;)

            # 请求字幕文件
            uul = f&quot;https:{subtitle_url}&quot;
            responses1 = requests.get(uul, headers=headers)

            # 解析字幕文件数据
            data = json.loads(responses1.text)

            # 提取 content 内容
            contents = [item[&apos;content&apos;] for item in data[&apos;body&apos;]]

            # 将每一句话写入到文本文件
            with open(file_name, &quot;w&quot;, encoding=&quot;utf-8&quot;) as file:
                for line in contents:
                    file.write(f&quot;{line}\n&quot;)
            print(f&quot;[+]已将字幕内容保存到 {file_name} 文件。&quot;)
            return file_name
        else:
            print(&quot;[!]未找到字幕 URL&quot;)
            return &quot;&quot;
    else:
        print(&quot;[!]未能提取到 aid 或 cid&quot;)
        return &quot;&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;目前需要完善的部分如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;实现批量总结。&lt;/li&gt;
&lt;li&gt;对音频模糊但是有字幕的视频实现OCR文字识别。&lt;/li&gt;
&lt;li&gt;对音频模糊且难以提取字幕的视频尝试修复。&lt;/li&gt;
&lt;li&gt;对论文导读类视频的拆解，只提取笔者感兴趣的部分，其他全部丢弃，对接收信息进行提纯。&lt;/li&gt;
&lt;li&gt;对过长的内容可能需要进行预处理，节省token的同时，提高大模型提炼的准确度。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;下一次讲讲简单的 OCR 功能实现，以及整合过程中的一些问题（等我把问题解决完先）&lt;/p&gt;
</content:encoded><category>Ai_summary_skills</category><author>Tsglz</author></item><item><title>大模型辅助 Bilibili 视频内容概览（一）</title><link>https://astro-theme-typography.vercel.app/posts/ai_summary_skills/%E5%A4%A7%E6%A8%A1%E5%9E%8B%E8%BE%85%E5%8A%A9-bilibili-%E8%A7%86%E9%A2%91%E5%86%85%E5%AE%B9%E6%A6%82%E8%A7%88%E4%B8%80/</link><guid isPermaLink="true">https://astro-theme-typography.vercel.app/posts/ai_summary_skills/%E5%A4%A7%E6%A8%A1%E5%9E%8B%E8%BE%85%E5%8A%A9-bilibili-%E8%A7%86%E9%A2%91%E5%86%85%E5%AE%B9%E6%A6%82%E8%A7%88%E4%B8%80/</guid><description>作者开发了使用大模型辅助Bilibili视频内容概览的工具，目前自动化程度不高，工作流程包括从json提取文本、保存到文件并调用glm-4.5-flash模型进行总结。该模型免费且准确度与付费模型相当。当前存在手动操作繁琐和部分视频无字幕或音频模糊导致文本偏差的问题，后续将重点解决这两个方向。</description><pubDate>Mon, 17 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;因为事务繁忙，最近我对 ai 智能总结产生了兴趣，做了几次总结之后发现效果还不错，这里做一个初版的记录，之后会逐步完善整个工作流。&lt;/p&gt;
&lt;p&gt;目前的 demo 自动化的程度并不高，目前的工作流程如下：&lt;/p&gt;
&lt;p&gt;&amp;lt;img src =&quot;/llm-BiliBili/structure.png&quot;&amp;gt;&lt;/p&gt;
&lt;p&gt;首先设计一个从 json 文件中提取目标文本的函数，在提取之前，我们要先观察一下 json 的格式：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;font_size&quot;: 0.4,
  &quot;font_color&quot;: &quot;#FFFFFF&quot;,
  &quot;background_alpha&quot;: 0.5,
  &quot;background_color&quot;: &quot;#9C27B0&quot;,
  &quot;Stroke&quot;: &quot;none&quot;,
  &quot;type&quot;: &quot;AIsubtitle&quot;,
  &quot;lang&quot;: &quot;zh&quot;,
  &quot;version&quot;: &quot;v1.7.0.4&quot;,
  &quot;body&quot;: [
    {
      &quot;from&quot;: 0.0,
      &quot;to&quot;: 0.24,
      &quot;sid&quot;: 1,
      &quot;location&quot;: 2,
      &quot;content&quot;: &quot;Hello&quot;,
      &quot;music&quot;: 0.0
    },
    {
      &quot;from&quot;: 0.24,
      &quot;to&quot;: 0.64,
      &quot;sid&quot;: 2,
      &quot;location&quot;: 2,
      &quot;content&quot;: &quot;大家好&quot;,
      &quot;music&quot;: 0.0
    },
    {
      &quot;from&quot;: 509.08,
      &quot;to&quot;: 509.5,
      &quot;sid&quot;: 201,
      &quot;location&quot;: 2,
      &quot;content&quot;: &quot;拜拜&quot;,
      &quot;music&quot;: 0.0
    }
  ]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;于是设计提取函数如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;def extract_subtitles(json_path: str, output_path: str = None):
    json_file = Path(json_path)
    if not json_file.exists():
        print(f&quot;[!] 文件不存在: {json_file}&quot;)
        return None
    with open(json_file, &quot;r&quot;, encoding=&quot;utf-8&quot;) as f:
        data = json.load(f)
    body = data.get(&quot;body&quot;, None)
    if not body:
        print(&quot;[!] JSON中未找到 &apos;body&apos; 字段，可能不是字幕文件格式。&quot;)
        return None
    subtitles = [entry.get(&quot;content&quot;, &quot;&quot;).strip() for entry in body if &quot;content&quot; in entry]
    text = &quot;\n&quot;.join(subtitles)
    if not output_path:
        output_path = json_file.with_suffix(&quot;.txt&quot;)
    with open(output_path, &quot;w&quot;, encoding=&quot;utf-8&quot;) as f:
        f.write(text)
    print(f&quot;[+] 提取完成：{output_path}&quot;)
    return output_path
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;将提取到的内容单行保存在 content.txt 中，然后调用 deepseek-chat，glm-4.5-flash 模型二选一进行总结，前者需要付费，后者在一定额度内免费使用。经过测试，两者的准确度相差不打大，所以默认使用后者进行总结。&lt;/p&gt;
&lt;p&gt;提示词使用如下，因为我会挑选一部分写入博客，所以预留了一个标题的位置：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;messages=[
    {
        &quot;role&quot;: &quot;system&quot;,
        &quot;content&quot;: (
        &quot;你是一个有用的AI助手，现在请你对如下文本进行总结，要求语言精炼并保持原意。\n\n&quot;
        &quot;【输出格式要求】\n&quot;
        &quot;- 使用 Markdown 形式输出\n&quot;
        &quot;- 顶层标题统一使用“##”\n&quot;
        &quot;- 二级标题统一使用“###”\n&quot;
          &quot;- 不得修改原文本含义，仅优化结构与表达&quot;
          ),
     },
]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;前两次 ai 总结内容同样在博客里，这里给出链接：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/posts/ai_summary/20251110-ai%E6%80%BB%E7%BB%93/&quot;&gt;2025.11.10-ai总结&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/posts/ai_summary/20251116-ai%E6%80%BB%E7%BB%93/&quot;&gt;2025.11.16-ai总结&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;在实际使用的过程中感官还算可以，但是手动操作过于麻烦；而且部分 B 站视频没有相应的字幕，或者音频模糊，导致文本出现偏差的问题，后续将从这两个方向继续完善。&lt;/p&gt;
</content:encoded><category>Ai_summary_skills</category><author>Tsglz</author></item><item><title>2025.11.16-ai总结</title><link>https://astro-theme-typography.vercel.app/posts/ai_summary/20251116-ai%E6%80%BB%E7%BB%93/</link><guid isPermaLink="true">https://astro-theme-typography.vercel.app/posts/ai_summary/20251116-ai%E6%80%BB%E7%BB%93/</guid><description>美股市场出现&quot;加密金库&quot;热潮，小型公司通过转型加密资产托管实现估值飙升，如Sharp Link Gaming市值从200万美元暴涨至25亿美元。核心机制是美股对加密资产存在估值溢价(1美元可定价2-6美元)，但面临流动性差、变现困难等问题。同时，DeFi行业因SEC政策转向迎来发展机遇，总锁仓价值突破900亿美元，借贷和DEX为主流板块，面临技术挑战和监管风险，未来发展需技术创新、风险管理和监管协同。</description><pubDate>Sun, 16 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;美股加密金库热潮分析&lt;/h2&gt;
&lt;h3&gt;现象概述&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;美股市场上出现&quot;加密金库&quot;热潮，指一些小型边缘上市公司通过转型加密资产托管实现估值飙升&lt;/li&gt;
&lt;li&gt;这些公司通常市值极低(如Sharp Link Gaming最初仅200万美元)，通过宣布加密资产战略获得巨额估值增长&lt;/li&gt;
&lt;li&gt;Sharp Link Gaming案例：市值从200万美元暴涨至25亿美元，估值比资产溢价488%&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;套利机制&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;核心逻辑：美股市场对加密资产存在估值溢价(1美元加密资产可定价为2-6美元)&lt;/li&gt;
&lt;li&gt;操作流程：
&lt;ol&gt;
&lt;li&gt;小型私募融资(如Sharp Link募资4.25亿美元)&lt;/li&gt;
&lt;li&gt;用资金购买加密货币(如以太坊)&lt;/li&gt;
&lt;li&gt;保留原业务维持上市地位&lt;/li&gt;
&lt;li&gt;利用高估值卖给二级市场投资者&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;内在矛盾&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;传统金融规则与加密世界估值逻辑冲突&lt;/li&gt;
&lt;li&gt;部分公司复制模式但无实质业务，估值与基本面脱节&lt;/li&gt;
&lt;li&gt;实业公司(如苹果)拒绝参与，而加密基金若不参与被视为管理不善&lt;/li&gt;
&lt;li&gt;监管滞后，可能存在内幕交易问题&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;变现困境&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;股份流动性差：Sharp Link 97%股份被私募锁定，按日均成交量需3年才能完全退出&lt;/li&gt;
&lt;li&gt;变现尝试：
&lt;ul&gt;
&lt;li&gt;增发新股购买更多加密资产(相当于吹大泡沫)&lt;/li&gt;
&lt;li&gt;高管通过薪酬方式套现(金额与原始资本规模不匹配)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;加密资产波动性和股票流动性风险使账面利润难以落袋为安&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;法律争议案例&lt;/h3&gt;
&lt;h4&gt;Mango Markets套现事件&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;交易员利用去中心化交易所漏洞，操纵MNGO代币价格暴涨1300%&lt;/li&gt;
&lt;li&gt;以虚高市值作抵押，借出价值超1亿美元加密货币&lt;/li&gt;
&lt;li&gt;法律复杂性：
&lt;ul&gt;
&lt;li&gt;&quot;代码即法律&quot;原则被挑战：法官指出规则不明确&lt;/li&gt;
&lt;li&gt;用户无法证明理解并同意还款承诺&lt;/li&gt;
&lt;li&gt;司法管辖权争议：事件发生在波多黎各，服务器在巴哈马和罗马尼亚，案件提交纽约法院&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;FTX崩塌与魔法豆陷阱&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;魔法豆陷阱：纸面财富与真实价值脱节现象&lt;/li&gt;
&lt;li&gt;FTX案例：估值最高达320亿美元，核心资产仅为自发行FTT代币，无外部资产支撑&lt;/li&gt;
&lt;li&gt;市场信任崩塌后无法应对用户挤兑，48小时内因用户提币超60亿美元导致破产&lt;/li&gt;
&lt;li&gt;影响：投资者损失惨重，动摇加密市场信用根基&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;投资者建议&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;认识到市场对创新事物可能过度热情&lt;/li&gt;
&lt;li&gt;警惕估值逻辑矛盾、账面利润难以变现等风险&lt;/li&gt;
&lt;li&gt;投资者应保持冷静，不被热潮冲昏头脑&lt;/li&gt;
&lt;li&gt;机会与风险同在，需全面评估后谨慎参与&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;DeFi行业SEC政策转变与未来发展趋势分析&lt;/h2&gt;
&lt;h3&gt;SEC政策转向的影响&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;为DeFi打开更广阔大门，明确矿工和验证者豁免证券法监管&lt;/li&gt;
&lt;li&gt;PoW和PoS网络法律风险基本解除，缓解行业担忧&lt;/li&gt;
&lt;li&gt;支持自我托管和创新豁免机制，使行业更接近主流&lt;/li&gt;
&lt;li&gt;释放约900亿美元TVL市场潜力，借贷DEX和稳定币占市场78%&lt;/li&gt;
&lt;li&gt;行业合规成本下降40%&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;DeFi的独特优势&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;基于区块链的开放金融架构，核心为智能合约&lt;/li&gt;
&lt;li&gt;自动执行交易，无需传统金融机构作为中介&lt;/li&gt;
&lt;li&gt;无需复杂KYC，可覆盖17亿无银行账户人群&lt;/li&gt;
&lt;li&gt;开源代码不可篡改，交易透明度高&lt;/li&gt;
&lt;li&gt;协议间可组合性创造创新金融产品(如闪电贷)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;DeFi行业规模与结构&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;总锁仓价值突破900亿美元&lt;/li&gt;
&lt;li&gt;借贷和DEX为最大板块，年复合增长率62%&lt;/li&gt;
&lt;li&gt;借贷协议占41%市场份额，主导项目为Aave和Compound&lt;/li&gt;
&lt;li&gt;DEX交易量占整个加密市场38%，做市商机制降低滑点&lt;/li&gt;
&lt;li&gt;稳定币日均结算量达680亿美元，超过Visa网络&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;技术演进中的挑战&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;以太坊拥堵问题通过多链生态和Layer2方案改善&lt;/li&gt;
&lt;li&gt;跨链桥安全事故每年造成近13亿美元损失&lt;/li&gt;
&lt;li&gt;MEV问题严重，年抽成达8亿美元&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;机遇与风险&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;机遇：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;机构资金入场，合规DeFi资产管理规模突破400亿美元&lt;/li&gt;
&lt;li&gt;RWA tokenization打开万亿美元市场可能&lt;/li&gt;
&lt;li&gt;嵌入式金融降低用户使用门槛，减少60%中间成本&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;风险：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2023年因智能合约漏洞损失23亿美元&lt;/li&gt;
&lt;li&gt;稳定币脱钩事件导致单日TVL撤出27%&lt;/li&gt;
&lt;li&gt;全球监管差异增加200%合规成本&lt;/li&gt;
&lt;li&gt;MEV抽成每年8亿美元限制行业发展&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;竞争格局与未来趋势&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;头部项目形成：Aave V3支持七条链，市占率51%；Uniswap V4 hooks机制增强定制化&lt;/li&gt;
&lt;li&gt;未来趋势：账户抽象、零知识证明、监管科技成为发展关键&lt;/li&gt;
&lt;li&gt;DeFi保险协议年增长率达300%&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;健康发展所需机制&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;技术创新：开发形式化验证工具减少智能合约漏洞&lt;/li&gt;
&lt;li&gt;风险管理：建立跨链流动性储备应对市场波动&lt;/li&gt;
&lt;li&gt;监管协同：参与国际组织推动监管标准统一、与传统金融机构合作开发混合型产品&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>ai_summary</category><author>Tsglz</author></item><item><title>2025.11.10-ai总结</title><link>https://astro-theme-typography.vercel.app/posts/ai_summary/20251110-ai%E6%80%BB%E7%BB%93/</link><guid isPermaLink="true">https://astro-theme-typography.vercel.app/posts/ai_summary/20251110-ai%E6%80%BB%E7%BB%93/</guid><description>全球市场风险导致港股可能下跌，AI产业链存在泡沫风险。技术分析方法需根据市场结构选择，REITs存在收益陷阱。投资应注重分散化和高股息率，避免牛市加杠杆，熊市谨慎。关注低估值高分红资产，量子科技机会渺茫，光伏板块趋势看好。操作需控制仓位，关注5日线支撑，严格执行止损。</description><pubDate>Mon, 10 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;2025.11.9 19点场分析总结&lt;/h2&gt;
&lt;h3&gt;一、全球市场风险与港股影响&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;外围市场压力&lt;/strong&gt;：日韩、美股市场出现风险信号，如大幅回调、阴线扩大，可能引发连锁反应。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;港股弱势&lt;/strong&gt;：因海外投资者占比高，受外围市场低开影响显著，恒生指数易跟随下跌。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI产业链风险&lt;/strong&gt;：美股头部AI公司（如OpenAI、英伟达）存在螺旋式上升的牛市泡沫，一旦下滑可能导致大幅回撤。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;二、技术分析流派与应用&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;均线流派&lt;/strong&gt;：适合趋势性行情，但在震荡市中易频繁报错（金叉死叉反复），导致高买低卖。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;裸K流派&lt;/strong&gt;：关注价格点位和箱体结构，适用于横盘震荡行情，需等待突破上沿并放量信号。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;核心观点&lt;/strong&gt;：技术流派需根据市场结构（趋势性或震荡性）选择适用方法，避免方法论错误。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;三、REITs（房地产投资信托基金）分析与风险&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;基本概念&lt;/strong&gt;：将实物资产（如高速公路、产业园）证券化，份额公开交易，规定90%以上可分配金额必须分红。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;收益陷阱&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;使用权型REITs&lt;/strong&gt;（如高速公路）：需扣除折旧（1/收费年限），例如20年期收费权扣除5%，若股息率4%，实际收益为负。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;产权型REITs&lt;/strong&gt;（如保障房）：扣除1.5%折旧，实际收益需调整。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;风险提示&lt;/strong&gt;：部分REITs通过会计手段（如汇兑损失）降低分红，投资者需仔细甄别底层资产和收费年限。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;四、公司特定分析&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;HH国际控股&lt;/strong&gt;：&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;优势：收购海外品牌（如斯维斯、宠物品牌）在国内生产，利用品牌溢价。&lt;/li&gt;
&lt;li&gt;风险：高负债并购，财务压力大，债务率超60%，建议轻仓操作。&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;比亚迪&lt;/strong&gt;：&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;看好其产业地位，但认为当前估值过高，需下跌30%-40%才考虑入场。&lt;/li&gt;
&lt;li&gt;商业模式属重资产制造业，竞争激烈。&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;白酒行业&lt;/strong&gt;：&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;消费场景稳固（如商务宴请），茅台等高端酒具备周期性调整而非长期衰退。&lt;/li&gt;
&lt;li&gt;强调消费股的复购性优势（如牛奶），优于制造业（如家电）。&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;&lt;em&gt;泡泡玛特&lt;/em&gt;：&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;利润依赖盲盒销量增长，非二级市场炒作。&lt;/li&gt;
&lt;li&gt;风险：产能扩大可能抑制炒作价格，存世量增加或导致过剩。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;五、投资哲学与建议&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;逆周期投资&lt;/strong&gt;：&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;分散化：避免单压一家公司，选择多行业头部企业。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;兜底要求：目标4%以上股息率，确保现金流覆盖时间成本。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;头部公司优先：如蒙牛、海底捞，基本面强且易受资金关注。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;风险警示&lt;/strong&gt;：&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;避免在牛市盲目自信加杠杆，熊市谨慎投资更安全。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;低利率环境下，上市公司债务多数只增不减，需警惕财务风险。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;学习与实证&lt;/strong&gt;：&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;推荐经典书籍（如费雪《如何选择成长股》、格雷厄姆《证券分析》）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;强调学以致用，通过计算和实践验证理论。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;六、市场制度批评&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;A股上市问题&lt;/strong&gt;：优质消费股（如蜜雪冰城、泡泡玛特）多赴港股上市，A股充斥高融资低分红企业，导致市场抽血效应。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;建议&lt;/strong&gt;：鼓励盈利企业回A股，将PPT概念股移至海外，改善投资者回报。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;七、其他话题&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;保险公司与证券公司&lt;/strong&gt;：利润波动大因投资业务影响，分红与现金流关联弱，需穿透看实际可分配利润。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;港口与航运&lt;/strong&gt;：推荐躺着收钱模式（如天津港、中国船舶租赁），规避周期性强的远洋航运。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;总结：用户强调理性投资、方法论适配市场环境，并警示当前外围风险与高估值陷阱。建议投资者聚焦低估值、高分红资产，避免盲目跟风，并通过持续学习提升认知。&lt;/p&gt;
&lt;h2&gt;擒龙先生-11.9-下周动向&lt;/h2&gt;
&lt;h3&gt;一、投资要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;量子科技&lt;/strong&gt;：机会渺茫(概率≈0)，可考虑回落后小仓位低吸，如持续上涨应离场&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;光伏板块&lt;/strong&gt;：趋势看好，可关注低位机会，核心是阳光电源，需注意其承接情况&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;芯片股&lt;/strong&gt;：关注寒武纪、中际旭创，但受资金虹吸效应和投机市场压制&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;商业航天&lt;/strong&gt;：新方向商业航天，关注中国卫星、航天智装，航天科技，沿趋势低吸，避免梭哈&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;二、投机风向&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;风向标：平潭、合富、海马，下周地位排序可能为合富&amp;gt;平潭&amp;gt;海马&lt;/li&gt;
&lt;li&gt;需密切关注平潭和合富表现，若无大幅负反馈，可继续关注板块&lt;/li&gt;
&lt;li&gt;重点关注海马汽车(海马)、福龙马(福马)、神马电力等&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;三、操作建议&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;趋势股操作：关注5日线支撑，如立达信、云铝股份、振德医疗、振华科技&lt;/li&gt;
&lt;li&gt;破位止损：跌破5日线需观察尾盘能否收回或分时是否有承接&lt;/li&gt;
&lt;li&gt;风险控制：判断不会100%正确，严格控制仓位，不要一次性梭哈&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>ai_summary</category><author>Tsglz</author></item><item><title>Kill Chain 模型</title><link>https://astro-theme-typography.vercel.app/posts/red-team/kill-chain-%E6%A8%A1%E5%9E%8B/</link><guid isPermaLink="true">https://astro-theme-typography.vercel.app/posts/red-team/kill-chain-%E6%A8%A1%E5%9E%8B/</guid><description>Kill Chain模型介绍。</description><pubDate>Fri, 03 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Kill Chain 模型是网络安全和军事领域中用于描述攻击过程的一个经典框架，最初由美国空军在 20 世纪 90 年代提出，用于描述军事打击的流程，后被借鉴应用于网络空间安全领域，成为网络攻击分析、防御规划和威胁检测的重要工具。&lt;/p&gt;
&lt;p&gt;Kill Chain 总共分为七个阶段：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Reconnaissance：侦查阶段，主要是收集情报，包括目标的网络信息、系统信息、人员信息、敌人的信息等。&lt;/li&gt;
&lt;li&gt;Weaponization：武器化阶段，主要是根据收集到的信息制作针对性的恶意载荷。&lt;/li&gt;
&lt;li&gt;Delivery：投递阶段，主要是将恶意载荷投递到目标系统。&lt;/li&gt;
&lt;li&gt;Exploitation：利用阶段，主要是利用目标系统的漏洞进行攻击。此时恶意载荷已经在目标机器上执行。&lt;/li&gt;
&lt;li&gt;Installation：安装阶段，植入持久化后门，比如将恶意载荷植入系统的启动项中或计划任务中。&lt;/li&gt;
&lt;li&gt;Command and Control：命令控制阶段，主要是控制目标系统的执行，包括控制目标机器的操作系统、网络、数据等。&lt;/li&gt;
&lt;li&gt;Actions on Objectives：行动阶段，主要是执行攻击者的最终目标，比如窃取数据、破坏系统、控制网络等。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;由于 Kill Chain 模型已经较为久远，在实践过程中已经衍生出了更多新的操作分支，比如：对攻击痕迹进行清理；横向渗透......等等。&lt;/p&gt;
&lt;p&gt;在命令控制阶段和行动阶段之间可以插入更多的操作，来达成隐藏或者进一步攻击的目的。&lt;/p&gt;
</content:encoded><category>Red Team</category><author>Tsglz</author></item><item><title>对TEMPEST代码的研究（一）</title><link>https://astro-theme-typography.vercel.app/posts/c2/%E5%AF%B9tempest%E4%BB%A3%E7%A0%81%E7%9A%84%E7%A0%94%E7%A9%B6%E4%B8%80/</link><guid isPermaLink="true">https://astro-theme-typography.vercel.app/posts/c2/%E5%AF%B9tempest%E4%BB%A3%E7%A0%81%E7%9A%84%E7%A0%94%E7%A9%B6%E4%B8%80/</guid><description>TEMPEST是用Rust编写的研究性C2框架，包含Anvil服务器、Conduit客户端和IMPS植入物三部分。Anvil提供带API的服务器和SQLite数据库，Conduct是跨平台终端客户端，IMPS支持TLS加密通信、远程进程注入和Bof等功能。服务器使用config.toml配置，需要TLS证书；植入物使用函数地址查找和TEB-&gt;PEB遍历技术。项目精简设计，支持生成exe和dll，注重OPSEC，暂不支持shellcode。</description><pubDate>Mon, 24 Mar 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;项目地址：&lt;a href=&quot;https://github.com/Teach2Breach/Tempest&quot;&gt;Teach2Breach/Tempest: A command and control framework written in rust.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Tempest 是一个完全由 rust 编写的研究性 C2，作者在项目介绍中提到，该项目并未借鉴其它框架，是以该项目生成的 shellcode 或许可以与 cobalt strike 生成的 shellcode 进行对比学习&lt;/p&gt;
&lt;p&gt;Tempest 的组件分为如下三部分：服务器，客户端，代理/植入物
顺便一提，由于笔者对于 linux 以及 mac 不甚精通，目前的研究仅限于 Windows 部分的分析&lt;/p&gt;
&lt;h2&gt;基础架构&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Anvil&lt;/strong&gt; - 服务器&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2 个带有 API 的服务器。所有 API 都经过身份验证，并且不支持 unauth-discovery。&lt;/li&gt;
&lt;li&gt;SQLite 本地数据库&lt;/li&gt;
&lt;li&gt;内部功能（构建 IMPS、生成 shellCode 等）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Conduit&lt;/strong&gt; - 黑客客户端&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;终端用户界面 （TUI）&lt;/li&gt;
&lt;li&gt;“实时”仪表板显示&lt;/li&gt;
&lt;li&gt;便携，完全在终端中运行&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;IMPS&lt;/strong&gt; - 信标/代理/植入物
Windows 功能：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;通过 TLS 的 AES 加密通信&lt;/li&gt;
&lt;li&gt;专注于 OPSEC，功能丰富（无膨胀）&lt;/li&gt;
&lt;li&gt;远程进程注入&lt;/li&gt;
&lt;li&gt;Bof 支持&lt;/li&gt;
&lt;li&gt;.DOTNET 可执行文件支持&lt;/li&gt;
&lt;li&gt;WMI&lt;/li&gt;
&lt;li&gt;TEB 步行 “noldr”&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;服务器-anvil&lt;/h2&gt;
&lt;p&gt;当前配置为 2 个不同端口（443，8443），在 &lt;code&gt;config.toml&lt;/code&gt; 中进行配置，443 被用于植入物，目前不支持关闭侦听器，处于默认打开状态。此外，初始访问使用的是 HTTPS 协议，其它协议有待拓展&lt;/p&gt;
&lt;p&gt;anvil 服务器使用 config.toml 进行配置，用户可在其中定义自己的用户名和密码进行验证或其它操作（如 LITCRYPT 密钥）。服务器还需要本地存储的 TLS 证书才能通过 HTTPS 提供内容&lt;/p&gt;
&lt;p&gt;&lt;code&gt;config.toml&lt;/code&gt; 文件示例&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[[users]]
username = &quot;forge&quot;
password = &quot;forge&quot;

[[users]]
username = &quot;adversary&quot;
password = &quot;pwd1&quot;

[cert]
private_key = &quot;/home/adversary/Tempest/Anvil/cert/key.pem&quot;
certificate = &quot;/home/adversary/Tempest/Anvil/cert/cert.pem&quot;

[crypt]
LITCRYPT_ENCRYPT_KEY = &quot;......&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;填写完配置文件，即可使用如下命令进行构建&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cargo build --release
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;客户端-conduit&lt;/h2&gt;
&lt;p&gt;跨平台的与 c2 交互的客户端，完全在终端运行，编译后可以移植&lt;/p&gt;
&lt;p&gt;其中坏死植入物用红色表示，管理员用橙色表示，存活植入物用白色表示&lt;/p&gt;
&lt;h2&gt;植入物&lt;/h2&gt;
&lt;p&gt;Windows 植入程序使用 &lt;code&gt;LdrGetDllHandle&lt;/code&gt; 和 &lt;code&gt;LdrGetProcedureAddress&lt;/code&gt; 来查找程序中调用的几乎所有其他 API 的函数地址。&lt;/p&gt;
&lt;p&gt;而 Windows_noldr 变体使用 TEB-&amp;gt;PEB 遍历，首先读取 CPU 寄存器以查找 TEB（基于 &lt;code&gt;NTCurrentTeb&lt;/code&gt;），然后定位 PEB 并遍历 PEB 以查找 ntdll.dll 或 kernel32.dll 等 dll。这允许植入体查找 API 调用的函数地址，而无需调用 &lt;code&gt;LdrGetDllHandle&lt;/code&gt; 和 &lt;code&gt;LdrGetProcedureAddress&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;socks 代理，该模块目前为单个植入物设计。出于安全考虑，作者将代理设置为仅在 c2 服务器上本地可用。这意味着为了使用代理，操作者必须通过 ssh 进入运行 anvil c2 服务器的机器，命令如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ssh -L 1080：localhost：1080 username@anvilserver
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;differences&lt;/h2&gt;
&lt;p&gt;在作者的描述中，目前该项目可以生成 exe 和 dll 文件，但由于时间有限，并不支持生成 shellcode&lt;/p&gt;
&lt;p&gt;此外，作者采用精简化处理框架，删去了大量冗余功能，加入了 bof 支持、有效的远程进程注入和 WMI 支持，编写了 whoami、ipconfig 和其他更基本的模块（如 ps），通过实际深入研究 Windows 内部，并调用与 Task Manager 等相同的函数，以与 Task Manager 相同的方式检索进程列表，但使用隐蔽的动态定位函数地址&lt;/p&gt;
&lt;p&gt;具体如何实现还需要进一步对项目进行分析&lt;/p&gt;
</content:encoded><category>C2</category><author>Tsglz</author></item><item><title>ppid 伪造(一)</title><link>https://astro-theme-typography.vercel.app/posts/red-team/ppid%E4%BC%AA%E9%80%A0%E4%B8%80/</link><guid isPermaLink="true">https://astro-theme-typography.vercel.app/posts/red-team/ppid%E4%BC%AA%E9%80%A0%E4%B8%80/</guid><description>PPID伪造技术使恶意程序看起来由其他进程产生，主要用于逃避基于父子进程关系的检测。Windows无法直接修改PPID，只能在创建新进程时指定父进程句柄。通常用于加载器或payload中。伪造方法包括构造检索目标父进程PID的函数，测试显示可成功弹出记事本。但存在权限限制，当目标父进程完整性级别超过标准用户时无法访问。伪造的PPID可被检测工具识别，但父进程欺骗可绕过父子进程关系检测，减少被发现可能。</description><pubDate>Mon, 10 Mar 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;让恶意的程序看起来是由另一个进程产生的，主要用于逃避基于父子进程关系的检测&lt;/p&gt;
&lt;p&gt;Windows 不能直接修改 ppid，只能在创建新进程时指定父进程句柄&lt;/p&gt;
&lt;h2&gt;使用环节&lt;/h2&gt;
&lt;p&gt;通常使用在加载器中，也可以存在 payload 中或者将加载器和 payload 一同送进目标主机&lt;/p&gt;
&lt;h2&gt;伪造方法&lt;/h2&gt;
&lt;p&gt;首先构造一个能够检索目标父进程的 pid 的函数，这样可以减少手动操作的不便&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// 检索目标父进程的pid
DWORD getPPID(LPCWSTR processName)
{
    HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    PROCESSENTRY32 process = { 0 };
    process.dwSize = sizeof(process);
    if (Process32First(snapshot, &amp;amp;process))
    {
        do
        {
            if (!wcscmp(process.szExeFile, processName))
                break;
        } while (Process32Next(snapshot, &amp;amp;process));
    }
    CloseHandle(snapshot);
    return process.th32ProcessID;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;主函数中进行调用&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;windows.h&amp;gt;
#include &amp;lt;tlHelp32.h&amp;gt;

int main()
{
    STARTUPINFOEX si = { sizeof(STARTUPINFOEX) };
    PROCESS_INFORMATION pi;
    SIZE_T attributeSize;
    ZeroMemory(&amp;amp;si, sizeof(STARTUPINFOEXA));

    // 通过函数 getPPID 获取目标父进程的 pid
    // 输入目标进程的名称
    LPCWSTR parentProcess = L&quot;explorer.exe&quot;;
    DWORD parentPID = getPPID(parentProcess);
    printf(&quot;[+] Spoofing %ws (PID: %u) as the parent process.\n&quot;, parentProcess, parentPID);

    // 这里末尾的数字是目标父进程的 pid，可以自定义函数获取
    HANDLE expProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, parentPID);
    InitializeProcThreadAttributeList(NULL, 1, 0, &amp;amp;attributeSize);
    si.lpAttributeList = (LPPROC_THREAD_ATTRIBUTE_LIST)HeapAlloc(GetProcessHeap(), 0, attributeSize);
    InitializeProcThreadAttributeList(si.lpAttributeList, 1, 0, &amp;amp;attributeSize);
    UpdateProcThreadAttribute(si.lpAttributeList, 0, PROC_THREAD_ATTRIBUTE_PARENT_PROCESS, &amp;amp;expProcess, sizeof(expProcess), NULL, NULL);
    si.StartupInfo.cb = sizeof(STARTUPINFOEXA);
    // 这里添加目标子进程的路径或者启动命令
    LPCWSTR spawnProcess = L&quot;C:\\Windows\\System32\\notepad.exe&quot;;
    CreateProcess(spawnProcess, NULL, NULL, NULL, TRUE, EXTENDED_STARTUPINFO_PRESENT, NULL, NULL, (STARTUPINFO*)&amp;amp;si, &amp;amp;pi);
    printf(&quot;[+] Spawning %ws (PID: %u)\n&quot;, spawnProcess, pi.dwProcessId);
    return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;测试结果&lt;/h3&gt;
&lt;p&gt;可以看到伪造成功了，弹出了记事本&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[+] Spoofing explorer.exe (PID: 12048) as the parent process.
[+] Spawning C:\Windows\System32\notepad.exe (PID: 32968)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;权限问题&lt;/h2&gt;
&lt;p&gt;如果目标父进程的完整性级别超过了标准用户，我们就无权访问这样的进程。&lt;/p&gt;
&lt;p&gt;此时，我们就希望能有一个函数能够帮助我们检查进程的完整性级别，这个操作使用的函数为 GetTokenInformation，它能够检索与进程关联的访问令牌的信息&lt;/p&gt;
&lt;p&gt;修改后的代码如下&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;lt;windows.h&amp;gt;
#include &amp;lt;TlHelp32.h&amp;gt;
#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;string&amp;gt;
#include &amp;lt;iostream&amp;gt;
#include &amp;lt;atlconv.h&amp;gt;
using namespace std;

// 异常处理
string get_last_error(DWORD errCode)
{
	string err(&quot;&quot;);
	if (errCode == 0) errCode = GetLastError();
	LPTSTR lpBuffer = NULL;
	if (0 == FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, //标志位，决定如何说明lpSource参数，
																					// dwFlags的低位指定如何处理换行功能在输出缓冲区，也决定最大宽度的格式化输出行,可选参数
		NULL,	// 根据dwFlags标志而定
		errCode,	// 请求的消息的标识符
					// 当dwFlags标志为FORMAT_MESSAGE_FROM_STRING时会被忽略
		MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),	//请求的消息的语言标识符
		(LPTSTR)&amp;amp;lpBuffer,	//接收错误信息描述的缓冲区指针
		0,	//如果FORMAT_MESSAGE_ALLOCATE_BUFFER标志没有被指定，这个参数必须指定为输出缓冲区的大小，如果指定值为0，这个参数指定为分配给输出缓冲区的最小数
		NULL	//保存格式化信息中的插入值的一个数组
	))
	{//失败
		char tmp[100] = { 0 };
		sprintf_s(tmp, &quot;{未定义错误描述(%d)}&quot;, errCode);
		err = tmp;
	}
	else    //成功
	{
		USES_CONVERSION;
		err = W2A(lpBuffer);
		LocalFree(lpBuffer);
	}
	return err;
}

// 检查进程的完整性级别
LPCWSTR getProcessIntegrityLevel(HANDLE hProcess, PDWORD pdwIntegrityLevel)
{
	DWORD dwError = ERROR_SUCCESS;
	HANDLE hToken = NULL;
	DWORD cbTokenIL = 0;
	PTOKEN_MANDATORY_LABEL pTokenIL = NULL;
	if (pdwIntegrityLevel == NULL)
	{
		dwError = ERROR_INVALID_PARAMETER;
		goto Cleanup;
	}
	// 以TOKEN_QUERY开启此线程的主访问令牌。
	if (!OpenProcessToken(hProcess, TOKEN_QUERY, &amp;amp;hToken))
	{
		cout &amp;lt;&amp;lt; &quot;[!] OpenProcessToken error!&quot; &amp;lt;&amp;lt; endl;
		dwError = GetLastError();
		goto Cleanup;
	}
	// 查询令牌完整性级别信息的大小。注意：我们预期得到一个FALSE结果及错误
	// ERROR_INSUFFICIENT_BUFFER， 这是由于我们在GetTokenInformation输入一个
	// 空缓冲。同时，在cbTokenIL中我们会得知完整性级别信息的大小。
	if (!GetTokenInformation(hToken, TokenIntegrityLevel, NULL, 0, &amp;amp;cbTokenIL))
	{
		if (ERROR_INSUFFICIENT_BUFFER != GetLastError())
		{
			// 当进程运行于Windows Vista之前的系统中，GetTokenInformation返回
			// FALSE和错误码ERROR_INVALID_PARAMETER。这是由于这些操作系统不支
			// 持TokenElevation。
			cout &amp;lt;&amp;lt; &quot;[!] GetTokenInformation no support !&quot; &amp;lt;&amp;lt; endl;
			dwError = GetLastError();
			goto Cleanup;
		}
	}
	// 现在我们为完整性级别信息分配一个缓存。
	pTokenIL = (TOKEN_MANDATORY_LABEL*)LocalAlloc(LPTR, cbTokenIL);
	if (pTokenIL == NULL)
	{
		cout &amp;lt;&amp;lt; &quot;[!] pTokenIL is null&quot; &amp;lt;&amp;lt; endl;
		dwError = GetLastError();
		goto Cleanup;
	}
	// 获得令牌完整性级别信息。
	if (!GetTokenInformation(hToken, TokenIntegrityLevel, pTokenIL,
		cbTokenIL, &amp;amp;cbTokenIL))
	{
		cout &amp;lt;&amp;lt; &quot;[!] GetTokenInformation error !&quot; &amp;lt;&amp;lt; endl;
		dwError = GetLastError();
		goto Cleanup;
	}
	// 完整性级别SID为S-1-16-0xXXXX形式。（例如：S-1-16-0x1000表示为低完整性
	// 级别的SID）。而且有且仅有一个次级授权信息。
	*pdwIntegrityLevel = *GetSidSubAuthority(pTokenIL-&amp;gt;Label.Sid, 0);
Cleanup:
	// 集中清理所有已分配的内存资源
	if (hToken)
	{
		CloseHandle(hToken);
		hToken = NULL;
	}
	if (pTokenIL)
	{
		LocalFree(pTokenIL);
		pTokenIL = NULL;
		cbTokenIL = 0;
	}
	if (ERROR_SUCCESS != dwError)
	{
		// 失败时确保此能够获取此错误代码
		SetLastError(dwError);
		return L&quot;ERROR&quot;;
	}
	else
	{
		if (*pdwIntegrityLevel == SECURITY_MANDATORY_LOW_RID) {
			return L&quot;LOW&quot;;
		}
		else if (*pdwIntegrityLevel &amp;gt;= SECURITY_MANDATORY_MEDIUM_RID &amp;amp;&amp;amp; *pdwIntegrityLevel &amp;lt; SECURITY_MANDATORY_HIGH_RID) {
			return L&quot;MEDIUM&quot;;
		}
		else if (*pdwIntegrityLevel &amp;gt;= SECURITY_MANDATORY_HIGH_RID) {
			return L&quot;HIGH&quot;;
		}
		else if (*pdwIntegrityLevel &amp;gt;= SECURITY_MANDATORY_SYSTEM_RID) {
			return L&quot;SYSTEM&quot;;
		}
	}
}
DWORD getPPID(LPCWSTR processName) {
	HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
	PROCESSENTRY32 process = { 0 };
	process.dwSize = sizeof(process);
	bool flag = false;
	if (Process32First(snapshot, &amp;amp;process)) {
		do {
			if (!wcscmp(process.szExeFile, processName)) {
				HANDLE hProcess = OpenProcess(MAXIMUM_ALLOWED, FALSE, process.th32ProcessID);
				if (hProcess) {
					LPCWSTR integrityLevel = NULL;
					DWORD dwIntegrityLevel;
					integrityLevel = getProcessIntegrityLevel(hProcess, &amp;amp;dwIntegrityLevel);
					if (!wcscmp(integrityLevel, L&quot;ERROR&quot;)) {
						cout &amp;lt;&amp;lt; &quot;[!] PID = &quot; &amp;lt;&amp;lt; process.th32ProcessID &amp;lt;&amp;lt; &quot; GetProcessIntegrityLevel failed, Error: &quot; &amp;lt;&amp;lt; get_last_error(GetLastError()) &amp;lt;&amp;lt; endl;
						continue;
					}
					if (!wcscmp(integrityLevel, L&quot;MEDIUM&quot;)) {
						flag = true;
						break;
					}
				}
			}
		} while (Process32Next(snapshot, &amp;amp;process));
	}
	CloseHandle(snapshot);
	// 没有找到 MEDIUM 权限的进程
	if (!flag) {
		cout &amp;lt;&amp;lt; processName &amp;lt;&amp;lt; &quot; does have medium integrity level!!&quot; &amp;lt;&amp;lt; endl;
		exit(-1);
	}
	return process.th32ProcessID;
}
int main() {
	STARTUPINFOEXA si;
	PROCESS_INFORMATION pi;
	SIZE_T attributeSize;
	ZeroMemory(&amp;amp;si, sizeof(STARTUPINFOEXA));

	// 通过函数 getPPID 获取目标父进程的 pid
	// 输入目标进程的名称
	LPCWSTR parentProcess = L&quot;svchost.exe&quot;;
	DWORD parentPID = getPPID(parentProcess);
	printf(&quot;[+] Spoofing %ws (PID: %u) as the parent process.\n&quot;, parentProcess, parentPID);

	// 这里末尾的数字是目标父进程的 pid，可以自定义函数获取
	HANDLE parentProcessHandle = OpenProcess(MAXIMUM_ALLOWED, false, parentPID);
	InitializeProcThreadAttributeList(NULL, 1, 0, &amp;amp;attributeSize);
	si.lpAttributeList = (LPPROC_THREAD_ATTRIBUTE_LIST)HeapAlloc(GetProcessHeap(), 0, attributeSize);
	InitializeProcThreadAttributeList(si.lpAttributeList, 1, 0, &amp;amp;attributeSize);
	UpdateProcThreadAttribute(si.lpAttributeList, 0, PROC_THREAD_ATTRIBUTE_PARENT_PROCESS, &amp;amp;parentProcessHandle, sizeof(HANDLE), NULL, NULL);
	si.StartupInfo.cb = sizeof(STARTUPINFOEXA);

	// 这里添加目标子进程的路径或者启动命令
	LPCWSTR spawnProcess = L&quot;C:\\Windows\\System32\\notepad.exe&quot;;
	CreateProcess(spawnProcess, NULL, NULL, NULL, TRUE, EXTENDED_STARTUPINFO_PRESENT, NULL, NULL, (STARTUPINFO*)&amp;amp;si, &amp;amp;pi);
	printf(&quot;[+] Spawning %ws (PID: %u)\n&quot;, spawnProcess, pi.dwProcessId);
	return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;对抗检测&lt;/h2&gt;
&lt;p&gt;用这种方法伪造的 ppid 是能够被检测到的&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/countercept/ppid-spoofing/blob/master/detect-ppid-spoof.py&quot;&gt;https://github.com/countercept/ppid-spoofing/blob/master/detect-ppid-spoof.py&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;父进程欺骗绕过可以绕过脚本对于父子原进程关系的检测，减少被发现的可能，这个过几天写&lt;/p&gt;
</content:encoded><category>Red Team</category><author>Tsglz</author></item><item><title>Part_Two_A_Minimal_Rust_Kernel</title><link>https://astro-theme-typography.vercel.app/posts/rustos/part_two_a_minimal_rust_kernel/</link><guid isPermaLink="true">https://astro-theme-typography.vercel.app/posts/rustos/part_two_a_minimal_rust_kernel/</guid><description>本文介绍使用Rust构建最小内核的过程，重点是通过build-std特性重编译core等标准crate，该特性仅在Nightly环境下可用。需下载源码并配置build-std-features启用内存函数，设置特定编译目标。通过写入特定缓冲区实现屏幕字符打印，创建引导映像并组合内核与引导程序，使用llvm-tools-preview和QEMU运行，也可写入U盘启动但可能不支持UEFI。</description><pubDate>Tue, 05 Nov 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;目的&lt;/h2&gt;
&lt;p&gt;编译为一个特定的目标系统&lt;/p&gt;
&lt;h2&gt;新增 &lt;code&gt;FlowOS.json&lt;/code&gt;&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;llvm-target&quot;: &quot;x86_64-unknown-none&quot;,
  &quot;data-layout&quot;: &quot;e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128&quot;,
  &quot;arch&quot;: &quot;x86_64&quot;,
  &quot;target-endian&quot;: &quot;little&quot;,
  &quot;target-pointer-width&quot;: &quot;64&quot;,
  &quot;target-c-int-width&quot;: &quot;32&quot;,
  &quot;os&quot;: &quot;none&quot;,
  &quot;executables&quot;: true,
  &quot;linker-flavor&quot;: &quot;ld.lld&quot;,
  &quot;linker&quot;: &quot;rust-lld&quot;,
  &quot;panic-strategy&quot;: &quot;abort&quot;,
  &quot;disable-redzone&quot;: true,
  &quot;features&quot;: &quot;-mmx,-sse,+soft-float&quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;&lt;em&gt;build-std&lt;/em&gt; 特性&lt;/h2&gt;
&lt;p&gt;允许按照自己的需要重编译 core 等标准 crate，而不需要使用 Rust 安装程序内置的预编译版本&lt;/p&gt;
&lt;p&gt;但是该特性是全新的功能，到目前为止尚未完全完成，所以它被标记为 “unstable” 且仅被允许在 &lt;em&gt;Nightly&lt;/em&gt; 环境下调用&lt;/p&gt;
&lt;p&gt;要启用该特性，在 &lt;code&gt;.cargo/config.toml&lt;/code&gt; 写入以下语句：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[unstable]
build-std = [
  &quot;core&quot;,
  &quot;compiler_builtins&quot;
]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;该配置会告知cargo需要重新编译 &lt;code&gt;core&lt;/code&gt; 和 &lt;code&gt;compiler_builtins&lt;/code&gt; 这两个crate，其中 &lt;code&gt;compiler_builtins&lt;/code&gt; 是 &lt;code&gt;core&lt;/code&gt; 的必要依赖&lt;/p&gt;
&lt;p&gt;重编译需要提供源码，使用如下命令来下载它们&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;rustup component add rust-src
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;编译命令&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cargo build --target .\src\FlowOS.json
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;&lt;em&gt;build-std-features&lt;/em&gt;&lt;/h2&gt;
&lt;p&gt;为了使用内存相关函数，在 &lt;code&gt;.cargo/config.toml&lt;/code&gt; 的 [&lt;code&gt;unstable&lt;/code&gt;] 写入以下语句：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;build-std-features = [ &quot;compiler-builtins-mem&quot; ]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;设置编译目标：在 &lt;code&gt;.cargo/config.toml&lt;/code&gt; 加入如下选项，接下来，==使用 cargo build 即可进行编译==&lt;/p&gt;
&lt;p&gt;这里因为一些原因，我使用了绝对路径&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[build]
target = &quot;F:\\vscode_repo\\Rust\\FlowOS\\src\\FlowOS.json&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;向屏幕打印字符&lt;/h2&gt;
&lt;p&gt;写入 &lt;code&gt;VGA 字符缓冲区&lt;/code&gt;，这段缓冲区的地址是 &lt;code&gt;0xb8000&lt;/code&gt;，且每个字符单元包含一个 ASCII 码字节和一个颜色字节&lt;/p&gt;
&lt;p&gt;代码修改&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;static HELLO: &amp;amp;[u8] = b&quot;Hello World!&quot;;

#[no_mangle]
pub extern &quot;C&quot; fn _start() -&amp;gt; ! {
    let vga_buffer = 0xb8000 as *mut u8;

    for (i, &amp;amp;byte) in HELLO.iter().enumerate() {
        unsafe {
            *vga_buffer.offset(i as isize * 2) = byte;
            *vga_buffer.offset(i as isize * 2 + 1) = 0xb;
        }
    }

    loop {}
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;启动内核&lt;/h2&gt;
&lt;h3&gt;创建引导映像&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;cargo add bootloader
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我这里使用的是&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;bootloader = &quot;0.9&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;将内核和引导程序组合&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;cargo install bootimage
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;安装 llvm-tools-preview&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;rustup component add llvm-tools-preview
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;创建一个可引导的磁盘映像&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;cargo bootimage
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;编译好后能在文件夹中找到 &lt;code&gt;bootimage-FlowOS.bin&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;运行&lt;/h2&gt;
&lt;p&gt;在 QEMU 中输入如下命令运行&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;qemu-system-x86_64 -drive format=raw,file=target\FlowOS\debug\bootimage-FlowOS.bin
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;也可以使用 dd 工具把内核写入 U 盘，以便在真机上启动，这里不多赘述&lt;/p&gt;
&lt;p&gt;原代码作者补注：&lt;code&gt;bootloader&lt;/code&gt; 包暂时不支持 UEFI，所以不能在 UEFI 机器上启动（现在不知道，没试）&lt;/p&gt;
&lt;h3&gt;使用 &lt;code&gt;cargo run&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;在 &lt;code&gt;.cargo/config.toml&lt;/code&gt; 中设置 &lt;code&gt;runner&lt;/code&gt; 配置项：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[target.&apos;cfg(target_os = &quot;none&quot;)&apos;]
runner = &quot;bootimage runner&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样，就可以直接使用 &lt;code&gt;cargo run&lt;/code&gt; 直接运行&lt;/p&gt;
</content:encoded><category>RustOS</category><author>Tsglz</author></item><item><title>Part_One_First_Sight</title><link>https://astro-theme-typography.vercel.app/posts/rustos/part_one_first_sight/</link><guid isPermaLink="true">https://astro-theme-typography.vercel.app/posts/rustos/part_one_first_sight/</guid><description>本文介绍了如何创建独立式可执行程序，参考了Writing an OS in Rust资源。内容包括样例代码、cargo.toml配置，以及Windows平台的不同编译命令。可在rust目录下创建config文件进行配置，但注意config和config.toml不能同时存在。之后编译采用裸机方式，并建议使用nightly版本。</description><pubDate>Tue, 05 Nov 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;参考：&lt;a href=&quot;https://os.phil-opp.com/zh-CN/freestanding-rust-binary/&quot;&gt;独立式可执行程序 | Writing an OS in Rust&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;样例代码&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#![no_std] // 不链接 Rust 标准库
#![no_main] // 禁用所有 Rust 层级的入口点

use core::panic::PanicInfo;

/// 这个函数将在 panic 时被调用
#[panic_handler]
fn panic(_info: &amp;amp;PanicInfo) -&amp;gt; ! {
    loop {}
}

#[no_mangle] // 不重整函数名
pub extern &quot;C&quot; fn _start() -&amp;gt; ! {
    // 因为链接器会寻找一个名为 `_start` 的函数，所以这个函数就是入口点
    // 默认命名为 `_start`
    loop {}
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;cargo.toml&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[package]
name = &quot;FlowOS&quot;
version = &quot;0.1.0&quot;
edition = &quot;2021&quot;

[dependencies]

[profile.dev]
panic = &quot;abort&quot;

[profile.release]
panic = &quot;abort&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Windows 平台使用的编译命令不同&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cargo rustc -- -C link-args=&quot;/ENTRY:_start /SUBSYSTEM:console&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;也可以在 rust 目录下的 &lt;code&gt;.cargo&lt;/code&gt; 文件夹下创建 &lt;code&gt;config.toml&lt;/code&gt; 文件，输入&lt;/p&gt;
&lt;p&gt;==注意；如果同时包含 config 和 config.toml 请二选一，如果同时存在，无后缀的会被加载==&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[target.&apos;cfg(target_os = &quot;linux&quot;)&apos;]
rustflags = [
  &quot;-C&quot;,
  &quot;link-arg=-nostartfiles&quot;
]

[target.&apos;cfg(target_os = &quot;windows&quot;)&apos;]
rustflags = [
  &quot;-C&quot;,
  &quot;link-args=/ENTRY:_start /SUBSYSTEM:console&quot;
]

[target.&apos;cfg(target_os = &quot;macos&quot;)&apos;]
rustflags = [
  &quot;-C&quot;,
  &quot;link-args=-e __start -static -nostartfiles&quot;
]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;上述只是拓展的方法，之后的编译都使用裸机，输入如下代码&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;rustup target add thumbv7em-none-eabihf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;编译命令&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cargo build --target thumbv7em-none-eabihf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;另附：使用 nightly 版本&lt;/p&gt;
</content:encoded><category>RustOS</category><author>Tsglz</author></item><item><title>Scripts</title><link>https://astro-theme-typography.vercel.app/posts/wp/scripts/</link><guid isPermaLink="true">https://astro-theme-typography.vercel.app/posts/wp/scripts/</guid><description>作者分享比赛中使用的多种模板化脚本，包括异或、大小写转化、RSA+MD5处理、z3求解、pwn计算、随机数处理、高低位组合、爆破程序及二次剩余+中国剩余定理等。这些脚本可节省大量时间，部分是从其他wp获取，需修改后使用。作者提到多解是正常的，需排除验证。</description><pubDate>Fri, 18 Oct 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;最近打比赛，发现有很多脚本能够实现模板化处理，能够节省大量时间&lt;/p&gt;
&lt;p&gt;下面将展示笔者收藏的一些常用脚本&lt;/p&gt;
&lt;h2&gt;简单异或&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

int main() {
    int string_length = ; // 字符串长度
    int key = ;           // 密钥(需要异或的内容)

    // 定义v5数组
    unsigned char v5[string_length] = {
        // 密文
    };

    // 定义解密后的flag数组
    char flag[string_length + 1]; // 长度 + &apos;\0&apos; 结束符

    // 解密过程
    for (int i = 0; i &amp;lt; string_length; ++i) {
        flag[i] = v5[i] ^ key; // xor，这里的 key 也可以根据需要进行修改
    }
    flag[string_length] = &apos;\0&apos;; // 结束符

    // 输出解密后的结果
    printf(&quot;Flag: %s\n&quot;, flag);
    return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;带密钥的异或&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# 密文
v6 = []

# 密钥
key = b&quot;&quot;
key_length = len(key)

# 逆向解密，得到 flag
flag = []
for i in range(len(v6)):
    for j in range(4):  # 每个 v6[i] 是 4 个字节
        flag_byte = (v6[i] &amp;gt;&amp;gt; (j * 8)) &amp;amp; 0xFF  # 提取 v6[i] 的每个字节
        key_byte = key[(i * 4 + j) % key_length]  # 密钥循环使用
        decrypted_byte = flag_byte ^ key_byte  # 逆向异或得到原始字节
        flag.append(decrypted_byte)

# 输出解密得到的 flag
print(bytes(flag).decode())
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;大小写转化&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;from base64 import b64encode
from os import urandom

def Decrypt(msg, key):
    Lenth = len(key)
    result = &apos;&apos;

    upper_base = ord(&apos;A&apos;)
    lower_base = ord(&apos;a&apos;)
    KEY = [ord(key.upper()[_]) - upper_base for _ in range(Lenth)]

    index = 0
    for m in msg:
        tmp_key = KEY[index % Lenth]
        if not m.isalpha():
            result += m
            continue

        if m.isupper():
            result += chr(upper_base + (ord(m) - upper_base - tmp_key) % 26)
        else:
            result += chr(lower_base + (ord(m) - lower_base - tmp_key) % 26)
        index += 1
    return result

# 用你知道的key
key = &quot;oWccl&quot;  # 你需要知道加密时生成的密钥
encrypted_msg = &quot;0lCcop{oyd94092-g8mq-4963-88b6-4helrxdhm6q7}&quot;

# 解密
decrypted_flag = Decrypt(encrypted_msg, key)
print(decrypted_flag)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;大小写转化+简单移位&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;from base64 import b64encode
from os import urandom

def Decrypt(msg, key):
    Lenth = len(key)
    result = &apos;&apos;

    upper_base = ord(&apos;A&apos;)
    lower_base = ord(&apos;a&apos;)
    KEY = [ord(key.upper()[_]) - upper_base for _ in range(Lenth)]

    index = 0
    for m in msg:
        tmp_key = KEY[index % Lenth]
        if not m.isalpha():
            result += m
            continue

        if m.isupper():
            result += chr(upper_base + (ord(m) - upper_base - tmp_key) % 26)
        else:
            result += chr(lower_base + (ord(m) - lower_base - tmp_key) % 26)
        index += 1
    return result

# 用你知道的key
key = &quot;&quot;  # 加密时生成的密钥（如果你知道部分信息，你可以逆推出来）
encrypted_msg = &quot;&quot;  # 移位的密文

# 解密
decrypted_flag = Decrypt(encrypted_msg, key)
print(decrypted_flag)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;简单的RSA+MD5处理flag&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;from Crypto.Util.number import getPrime
from gmpy2 import invert, gcd
import hashlib

# 已知的公钥
N =
e =
# 使用 N 来尝试分解成 p 和 q
p=
q=

# 计算 phi——逆元
phi = (p - 1) * (q - 1)

# 计算私钥 d
d = invert(e, phi)

# 已知的密文 c
c =

# 解密
m_decrypted = pow(c, d, N)

md5 = hashlib.md5()
md5.update(str(m_decrypted).encode(&apos;utf-8&apos;))

# 生成 flag
flag =md5.hexdigest()
print(flag)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;使用z3求解&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;from z3 import *

# 创建 Z3 Solver
solver = Solver()

# 创建变量，如果进行位操作的话，需要使用 BitVec 类型
v13 = BitVec(&apos;v13&apos;, 64)  # 64 位
v14 = BitVec(&apos;v14&apos;, 64)
v15 = BitVec(&apos;v15&apos;, 64)

# 添加条件
solver.add()
solver.add()
solver.add()

# 求解
if solver.check() == sat:
    model = solver.model()
    v13_val = model[v13].as_long()
    v14_val = model[v14].as_long()
    v15_val = model[v15].as_long()

    # 打印结果
    print(f&quot;Found values: v13 = {v13_val:#x}, v14 = {v14_val:#x}, v15 = {v15_val:#x}&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;pwn计算的小脚本&lt;/h2&gt;
&lt;p&gt;不知道怎么修改，之间照搬过来吧，跑完就可以直接读取 flag 了&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;from pwn import *
import string

context.log_level = &apos;debug&apos;

p = remote(&apos;47.97.58.52&apos;, 40010) #环境地址，端口

def send_after_clean(content: bytes = b&quot;&quot;, until: bytes = None,
                     timeout: float = 0.05, no_show: bool = True):
    if until is not None:
        p.recvuntil(flat(until))
    else:
        received = p.clean(timeout)
        if not no_show:
            print(f&quot;[$]received:\n{received.decode(&apos;UTF-8&apos;)}&quot;)
    p.send(flat(content))

def sendline_after_clean(content: bytes = b&quot;&quot;, until: bytes = None,
                         timeout: float = 0.05, no_show: bool = True):
    send_after_clean([content, p.newline], until, timeout, no_show)

def interactive_after_clean(timeout: int = 0.05, no_show: bool = True):
    received = p.clean(timeout)
    if not no_show:
        print(f&quot;[$]received:\n{received}&quot;)
    p.interactive()

def formula_compute(formula: bytes, precise: bool = False):
    if isinstance(formula, bytes):
        formula = formula.decode(&quot;UTF-8&quot;)
    formula = formula.strip()
    formula = formula.strip(&quot;\n&quot;)
    formula = formula.replace(&quot;x&quot;, &quot;*&quot;)
    formula = formula.replace(&quot;^&quot;, &quot;**&quot;)
    formula = formula.replace(&quot;÷&quot;, &quot;/&quot;)
    if not precise:
        formula = formula.replace(&quot;//&quot;, &quot;/&quot;)
        formula = formula.replace(&quot;/&quot;, &quot;//&quot;)
    return bytes(str(eval(formula)), encoding=&quot;UTF-8&quot;)

p.recvuntil(b&apos;Welcome to the calc game!\n&apos;)  #p.sendlineafter(some_string, payload) 接收到 some_string 后, 发送你的 payload，加个换行
for i in range(100):
	p.recvline(keepends=True)
	#p.recvuntil(b&apos; &apos;,drop=True) #p.recvuntil(some_string) 接收到 some_string 为止
	s=p.recvuntil(b&apos; =&apos;,drop=True)
	#p.recvall()
	print(s)
	res=str(eval(s)).encode()
	p.sendlineafter(b&quot; &quot;, res)
	p.recvline() #p.recvline() 接收一行输出

p.interactive() #交互模式
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;忘记哪个是真的能用的了，等下次跑出来再改吧&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 自动生成头部
from pwn import *
from pwn import p64, p32, u32, u64, p8, p16

if_32: bool = False
if_debug: bool = False
pg = p32 if if_32 else p64
ug = u32 if if_32 else u64
context(log_level=&quot;debug&quot;, arch=&quot;i386&quot; if if_32 else &quot;amd64&quot;, os=&quot;linux&quot;)
p=remote(&quot;47.97.58.52&quot;,40010)

# 下面是自定义的一些工具函数

def send_after_clean(content: bytes = b&quot;&quot;, until: bytes = None,
                     timeout: float = 0.05, no_show: bool = True):
    if until is not None:
        p.recvuntil(flat(until))
    else:
        received = p.clean(timeout)
        if not no_show:
            print(f&quot;[$]received:\n{received.decode(&apos;UTF-8&apos;)}&quot;)
    p.send(flat(content))

def sendline_after_clean(content: bytes = b&quot;&quot;, until: bytes = None,
                         timeout: float = 0.05, no_show: bool = True):
    send_after_clean([content, p.newline], until, timeout, no_show)

def interactive_after_clean(timeout: int = 0.05, no_show: bool = True):
    received = p.clean(timeout)
    if not no_show:
        print(f&quot;[$]received:\n{received}&quot;)
    p.interactive()

def formula_compute(formula: bytes, precise: bool = False):
    if isinstance(formula, bytes):
        formula = formula.decode(&quot;UTF-8&quot;)
    formula = formula.strip()
    formula = formula.strip(&quot;\n&quot;)
    formula = formula.replace(&quot;x&quot;, &quot;*&quot;)
    formula = formula.replace(&quot;^&quot;, &quot;**&quot;)
    formula = formula.replace(&quot;÷&quot;, &quot;/&quot;)
    if not precise:
        formula = formula.replace(&quot;//&quot;, &quot;/&quot;)
        formula = formula.replace(&quot;/&quot;, &quot;//&quot;)
    return bytes(str(eval(formula)), encoding=&quot;UTF-8&quot;)

for i in range(100):
    # 从标准输出流获取题目
    # 会一直读到b&quot;.&quot;为止
    question = p.recvuntil(b&quot;.&quot;)
    # 工具函数自动计算结果
    # 注意，输入的题目必须是有意义的算式，不能有等号
    # 比如可以是1+2, 1÷2
    # 如果需要小数，定义参数precise=True
    answer = formula_compute(question)
    # 在结尾加上回车发送answer
    # 直到读到&quot;answer:&quot;才开始发送
    # 也可以不定义until字符串，脚本会在程序没有输出的时候发送（但如果网络不好，脚本可能判断出错）
    sendline_after_clean(answer, &quot;answer:&quot;)

# 进入人机交互模式
interactive_after_clean()
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;随机数+奇偶分离&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;array&amp;gt;
#include &amp;lt;string&amp;gt;

int main() {
    // 加密后的数组，用逗号隔开
    std::array&amp;lt;uint64_t, 4&amp;gt; v13 = {
    };

    // 密钥
    uint8_t initialRandom = ;

    // 解密结果字符串
    std::string decrypted;

    // 解密过程
    for (size_t i = 0; i &amp;lt; 30; ++i) {
        uint8_t xorValue;

        // 奇偶选择XOR值
        if (i % 2 == 0) {
            xorValue = initialRandom + 3; // 偶数位置
        } else {
            xorValue = initialRandom; // 奇数位置
        }

        // 对应的加密值
        uint8_t encryptedChar = static_cast&amp;lt;uint8_t&amp;gt;(v13[i / 8] &amp;gt;&amp;gt; ((i % 8) * 8)); // 取得v13的当前字符

        // 解密字符
        uint8_t originalChar = encryptedChar ^ xorValue;

        // 将字符添加到解密字符串
        decrypted += static_cast&amp;lt;char&amp;gt;(originalChar);
    }

    // 输出解密结果
    std::cout &amp;lt;&amp;lt; decrypted &amp;lt;&amp;lt; std::endl;

    return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;高低位组合&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

void decode(unsigned char *encoded_str, int length) {
    for (int i = 0; i &amp;lt; length; i++) {
        unsigned char high = (encoded_str[i] &amp;amp; 0xF0) &amp;gt;&amp;gt; 4;  // 提取高4位
        unsigned char low = (encoded_str[i] &amp;amp; 0x0F) &amp;lt;&amp;lt; 4;   // 提取低4位
        encoded_str[i] = high | low;                        // 组合高位和低位
    }
}

int main() {
    // Encoded data
    unsigned char encdata[] = {

    };

    int length = sizeof(encdata) / sizeof(encdata[0]);

    // Decode the data
    decode(encdata, length);

    // Output the decoded string
    for (int i = 0; i &amp;lt; length; i++) {
        printf(&quot;%c&quot;, encdata[i]);
    }
    printf(&quot;\n&quot;);

    return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;爆破程序&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;import itertools
import string
import subprocess

# 定义可执行文件的路径
exe_path = &quot;&quot;  # 替换为你程序的路径

# 固定前缀和后缀
prefix = &quot;&quot;
suffix = &quot;&quot;

# 字符集为数字和小写字母
charset = string.ascii_lowercase + string.digits

# 生成自定义输入
def generate_inputs():
    for combo1 in itertools.product(charset, repeat=4):  # 第一个 4 字节部分
        for combo2 in itertools.product(charset, repeat=4):  # 第二个 4 字节部分
            for combo3 in itertools.product(charset, repeat=4):  # 第三个 4 字节部分
                middle = &apos;&apos;.join(combo1) + &apos;-&apos; + &apos;&apos;.join(combo2) + &apos;-&apos; + &apos;&apos;.join(combo3)  # 连接三个部分
                yield prefix + middle + suffix

# 运行程序并传递生成的输入
def run_program_with_input(input_str):
    try:
        process = subprocess.Popen([exe_path], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        output, error = process.communicate(input=input_str.encode())
        if &quot;Congratulations&quot; in output.decode() or &quot;Correct&quot; in output.decode():  # 替换为程序的正确输出标志
            return True, output.decode()
        return False, output.decode()
    except Exception as e:
        return False, str(e)

# 使用生成器进行爆破
for generated_input in generate_inputs():
    print(f&quot;Trying input: {generated_input}&quot;)
    success, result = run_program_with_input(generated_input)

    if success:
        print(f&quot;Success! The correct input is: {generated_input}&quot;)
        print(f&quot;Program output: {result}&quot;)
        break
    else:
        continue
        #print(f&quot;Failed attempt with input: {generated_input}&quot;)
        #print(f&quot;Program output: {result}&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;二次剩余+中国剩余定理&lt;/h2&gt;
&lt;p&gt;2024-0xGame-w1 的 wp 里偷的，以后有需要直接扒过来改改就能用~&lt;/p&gt;
&lt;p&gt;多解是正常的，跑久一点也能理解，四个解带进去排除一下就好了&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;from gmpy2 import invert, gcd, gcdext
Pub_Key = (1022053332886345327, 294200073186305890)
Encrypt_msg = 107033510346108389
m = 759871216848924391
N = Pub_Key[0]
e = Pub_Key[1]
c = Encrypt_msg

#import q、p form factordb
q = 970868179
p = 1052721013
phi = (q-1)*(p-1)

def crt(b,m):
    #判断是否互素
    for i in range(len(m)):
        for j in range(i+1,len(m)):
            if gcd(m[i],m[j]) != 1:
                print(&quot;m中含有不是互余的数&quot;)
                return -1

    #乘积
    M = 1
    for i in range(len(m)):
        M *= m[i]
    #求M/mi
    Mm = []
    for i in range(len(m)):
        Mm.append(M // m[i])
    #求Mm[i]的乘法逆元
    Mm_ = []
    for i in range(len(m)):
        _,a,_ = gcdext(Mm[i],m[i])
        Mm_.append(int(a % m[i]))
    #求MiM&apos;ibi的累加
    y = 0
    for i in range(len(m)):
        #print(Mm[i] * Mm_[i] * b[i])
        y += (Mm[i] * Mm_[i] * b[i])
    y = y % M
    return y

#直接在Zmod p、q下求m^2 ，也可以在Zmod N下求解m^2后，再⽤因⼦取余:
e0 = e//2
d1 = invert(e0,p-1)
m1 = pow(c,d1,p)
d2 = invert(e0,q-1)
m2 = pow(c,d2,q)

#直接⽤遍历开根：
def Gao(x,p):
    result = []
    for i in range(p):
        if pow(i,2,p) == x:
            result.append(i)
    return result

m1_ = Gao(m1,p)
m2_ = Gao(m2,q)

print(m1_,m2_)

from hashlib import md5
def MD5(m):return md5(str(m).encode()).hexdigest()

m1_ = [215896886, 836824127]
m2_ = [215973055, 754895124]

for m1 in m1_:
    for m2 in m2_:
        print(&apos;0xGame{&apos; + MD5(crt([m1,m2],[p,q])) + &apos;}&apos;)

&apos;&apos;&apos;
 0xGame{15820afdb9a129e89e40e57f40ff8de9}
 0xGame{f4107420d94cc7037114376d8566d4ef}
 0xGame{3932f6728585abbf751a212f69276d3e}
 0xGame{127016d0be858ef48a99723710ad4d49}
&apos;&apos;&apos;
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><category>Wp</category><author>Tsglz</author></item><item><title>2024_SACC_安全组招新</title><link>https://astro-theme-typography.vercel.app/posts/baby_wp/2024_sacc_%E5%AE%89%E5%85%A8%E7%BB%84%E6%8B%9B%E6%96%B0/</link><guid isPermaLink="true">https://astro-theme-typography.vercel.app/posts/baby_wp/2024_sacc_%E5%AE%89%E5%85%A8%E7%BB%84%E6%8B%9B%E6%96%B0/</guid><description>2024_SACC安全组招新题目链接：https://github.com/tsglz/tsglz.github.io/releases/download/2024-SACC/2024-SACC.rar，密码：2024-SACC。包含6道CTF题。</description><pubDate>Thu, 17 Oct 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;题目链接：https://github.com/tsglz/tsglz.github.io/releases/download/2024-SACC/2024-SACC.rar&lt;/p&gt;
&lt;p&gt;密码：2024-SACC&lt;/p&gt;
&lt;h2&gt;1_just_click&lt;/h2&gt;
&lt;p&gt;&amp;lt;img src=&quot;/2024-SACC/1_open.png&quot;&amp;gt;&lt;/p&gt;
&lt;p&gt;直接 IDA 打开，打开 &lt;code&gt;omg(0)&lt;/code&gt; 即为 flag&lt;/p&gt;
&lt;p&gt;&amp;lt;img src=&quot;/2024-SACC/1_main.png&quot;&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;img src=&quot;/2024-SACC/1_flag.png&quot;&amp;gt;&lt;/p&gt;
&lt;p&gt;如果你对 &lt;code&gt;xyz(p)&lt;/code&gt; 感到好奇点开看了下，你就会发现进行了一个 &lt;code&gt;异或0x55&lt;/code&gt; 的操作，但实际上它并没有实质性的影响&lt;/p&gt;
&lt;h2&gt;2_another_three_click&lt;/h2&gt;
&lt;p&gt;打开看一眼，看不懂，拖 IDA&lt;/p&gt;
&lt;p&gt;&amp;lt;img src=&quot;/2024-SACC/2_open.png&quot;&amp;gt;&lt;/p&gt;
&lt;p&gt;看到 3 个 &lt;code&gt;test_func&lt;/code&gt; 函数，合理推断 flag 是 三段式，点击进去看看&lt;/p&gt;
&lt;p&gt;&amp;lt;img src=&quot;/2024-SACC/2_main.png&quot;&amp;gt;&lt;/p&gt;
&lt;p&gt;进入汇编界面，很容易看到三段 flag，一、三两段是明文，第二段需要转换一下&lt;/p&gt;
&lt;p&gt;&amp;lt;img src=&quot;/2024-SACC/2_thr_sec.png&quot;&amp;gt;&lt;/p&gt;
&lt;p&gt;按a即可，将 flag 拼好即可提交&lt;/p&gt;
&lt;p&gt;&amp;lt;img src=&quot;/2024-SACC/2_to_str.png&quot;&amp;gt;&lt;/p&gt;
&lt;h2&gt;3_MaybeXorAndRot13&lt;/h2&gt;
&lt;p&gt;打开文件，输出的是数字&lt;/p&gt;
&lt;p&gt;&amp;lt;img src=&quot;/2024-SACC/3_open.png&quot;&amp;gt;&lt;/p&gt;
&lt;p&gt;然后打开 IDA 进行查看，同样是一串数字，可以看到进行了 &lt;code&gt;异或0x55&lt;/code&gt; 的操作，在刚进入 IDA 的时候，其实能直接看到异或之前的内容，如果不确定，可以写个脚本验证一下&lt;/p&gt;
&lt;p&gt;&amp;lt;img src=&quot;/2024-SACC/3_main.png&quot;&amp;gt;&lt;/p&gt;
&lt;p&gt;python：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;a=&quot;54 102 57 32 49 29 33 34 55 56 19 51 52 19 108 47 24 2 19 45 13 102 57 59 51 4 104 104&quot;
b=a.split()
c=list(map(int,b))

for i in range(len(c)):
    d = chr(c[i]^0x55)
    print(d,end=&quot;&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;c：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
int main()
{
    int a[28]= {54,102,57,32,49,29,33,34,55,56,19,51,52,19,108,47,24,2,19,45,13,102,57,59,51,4,104,104};
    for (int i = 0; i &amp;lt; 28; i++)
    {
        printf(&quot;%c&quot;, a[i]^0x55);
    }
    return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;解出来是一样的，熟练的一眼 base64&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;c3ludHtwbmFfaF9zMWFxX3lnfQ==
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;得到如下内容，很明显这还不是最终的 flag，根据提示，还用到了 Rot13&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;synt{pna_h_s1aq_yg}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;解密可得&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;flag{can_u_f1nd_lt}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;4_in_string&lt;/h2&gt;
&lt;p&gt;这道题特别 ez，一打开就能看到一个半成品的 flag，提示中给的 in_string 只是提供一个快速查找有用信息的方法&lt;/p&gt;
&lt;p&gt;string位置：View &amp;gt;&amp;gt; Open subviews &amp;gt;&amp;gt; string&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;flag{RighT t0 g3t f1Ag}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果直接提交 flag，会发现 flag 是错误的，&lt;/p&gt;
&lt;p&gt;打开 main 函数，刚才看到的 flag 就在 &lt;code&gt;text_57&lt;/code&gt; 里面&lt;/p&gt;
&lt;p&gt;&amp;lt;img src=&quot;/2024-SACC/4_main.png&quot;&amp;gt;&lt;/p&gt;
&lt;p&gt;接着在 &lt;code&gt;change&lt;/code&gt; 函数中会看到替换的步骤，32 &amp;gt;&amp;gt; 95，熟练的知道是 &apos;_&apos;替换了 &apos; &apos;&lt;/p&gt;
&lt;p&gt;&amp;lt;img src=&quot;/2024-SACC/4_replace.png&quot;&amp;gt;&lt;/p&gt;
&lt;p&gt;如果不清楚可以查 ascii 码表，在汇编中也能应证&lt;/p&gt;
&lt;p&gt;&amp;lt;img src=&quot;/2024-SACC/4_rep.png&quot;&amp;gt;&lt;/p&gt;
&lt;p&gt;给半成品 flag 补上下划线即可&lt;/p&gt;
&lt;h2&gt;5_oh_upx&lt;/h2&gt;
&lt;p&gt;不了解的可能会有点难受，upx 壳是常用压缩壳，这里使用的是未经魔改的版本，只需要去网上下一个就好&lt;/p&gt;
&lt;p&gt;如果不脱壳，IDA 看到的代码就是乱七八糟的一坨，但其实不影响运行&lt;/p&gt;
&lt;p&gt;首先进行脱壳 &lt;code&gt;upx -d&lt;/code&gt; 即可，不清楚使用方法可以浏览器查一下，非常清楚&lt;/p&gt;
&lt;p&gt;&amp;lt;img src=&quot;/2024-SACC/5_unpack.png&quot;&amp;gt;&lt;/p&gt;
&lt;p&gt;然后使用 IDA 打开，在下方直接能看到两段 flag ，根据提示，flag 一共有三段&lt;/p&gt;
&lt;p&gt;&amp;lt;img src=&quot;/2024-SACC/5_open.png&quot;&amp;gt;&lt;/p&gt;
&lt;p&gt;在 main 函数中直接能找到中间缺失的一段，拼起来即可&lt;/p&gt;
&lt;p&gt;&amp;lt;img src=&quot;/2024-SACC/5_main.png&quot;&amp;gt;&lt;/p&gt;
&lt;h2&gt;6_inline_assembly&lt;/h2&gt;
&lt;p&gt;这道题用到了内联汇编，这会一定程度上阻碍静态分析，但这里我并没有做过多的处理，所以可以直接在 String 里找到&lt;/p&gt;
&lt;p&gt;如果对 Windows 比较熟悉会知道，这段程序是 32 位的，不知道也没关系，DIE 可以进行分析&lt;/p&gt;
&lt;p&gt;&amp;lt;img src=&quot;/2024-SACC/6_die.png&quot;&amp;gt;&lt;/p&gt;
&lt;p&gt;用 32位 DIE 打开&lt;/p&gt;
&lt;p&gt;打开 String，直接能看到 flag &lt;code&gt;flag{May23_th1s_1s_the_flag}&lt;/code&gt;&lt;/p&gt;
</content:encoded><category>Baby_Wp</category><author>Tsglz</author></item><item><title>hexo博客搭建</title><link>https://astro-theme-typography.vercel.app/posts/environment/hexo%E5%8D%9A%E5%AE%A2%E6%90%AD%E5%BB%BA/</link><guid isPermaLink="true">https://astro-theme-typography.vercel.app/posts/environment/hexo%E5%8D%9A%E5%AE%A2%E6%90%AD%E5%BB%BA/</guid><description>使用Github+Hexo搭建个人博客，需准备Github账号、NodeJS和Git。创建Github仓库并配置Token，安装Hexo并初始化博客项目，推荐Fluid主题。配置LeanCloud实现浏览数统计和评论功能。掌握快速导航和多级分类等使用技巧，完善博客功能。</description><pubDate>Mon, 15 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;搭建个人博客使用：Github + Hexo&lt;/p&gt;
&lt;p&gt;如果有条件，可以部署在自己的服务器上，发布到自己服务器的话，Negix 代理&lt;/p&gt;
&lt;h2&gt;一、前置条件&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Github 账号
&lt;ul&gt;
&lt;li&gt;都能搭建个人博客了肯定会用 Github 吧~&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;NodeJS
&lt;ul&gt;
&lt;li&gt;nodejs 要好好配置哦，不然之后会很崩溃的，嘻&lt;/li&gt;
&lt;li&gt;可以参考下这个&lt;a href=&quot;https://blog.csdn.net/yaorongke/article/details/119084295&quot;&gt;NodeJS安装及配置(Windows)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Git，(理论上cmd也是可以的，我就是用的cmd)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;二、Github部分&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;新建一个仓库&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;lt;img src =&quot;/hexo/create_repo.png&quot;&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;按要求填写&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;lt;img src =&quot;/hexo/repo_fillin.png&quot;&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;测试一下是否能正常使用
&lt;ul&gt;
&lt;li&gt;在新仓库中添加 &lt;code&gt;index.html&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;保存&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!doctype html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot; /&amp;gt;
    &amp;lt;title&amp;gt;tsglz&amp;lt;/title&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;h1&amp;gt;This is tsglz&amp;lt;/h1&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;在 settings 的 page 中 可以访问到自己的网站
&lt;ul&gt;
&lt;li&gt;如果显示正常，即部署成功，可以进行下一步&lt;/li&gt;
&lt;li&gt;如果不成功，自查上面的步骤是否出现遗漏&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;lt;img src =&quot;/hexo/settings_deploy.png&quot;&amp;gt;&lt;/p&gt;
&lt;h3&gt;Token&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;除了一个仓库，你还需要一个 Token&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;lt;img src=&quot;/hexo/github_settings.png&quot;&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;注意使用 classic 哦~&lt;/li&gt;
&lt;li&gt;select 一个 repo 就能用了&lt;/li&gt;
&lt;li&gt;expiration 按照需要配置
&lt;ul&gt;
&lt;li&gt;并不建议一直用一个&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;lt;img src=&quot;/hexo/Token.png&quot;&amp;gt;&lt;/p&gt;
&lt;h2&gt;三、Hexo部分&lt;/h2&gt;
&lt;h3&gt;1.安装hexo&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;npm install -g hexo-cli
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;查看版本&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;hexo -v
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;出现版本号
&lt;ul&gt;
&lt;li&gt;有一大串是正常情况，请不要感到害怕&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;lt;img src=&quot;/hexo/version.png&quot;&amp;gt;&lt;/p&gt;
&lt;h3&gt;2.创建 hexo-blog&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;创建一个项目 &lt;code&gt;hexo-blog&lt;/code&gt; 并初始化&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;hexo init hexo-blog
cd hexo-blog
npm install
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;更换主题&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/fluid-dev/hexo-theme-fluid/releases/tag/v1.9.7&quot;&gt;Release 1.9.7 · fluid-dev/hexo-theme-fluid (github.com)&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;下载解压到 &lt;code&gt;themes&lt;/code&gt; 目录，并将解压出的文件夹重命名为 &lt;code&gt;fluid&lt;/code&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;注意，fluid目录下应该直接是多个文件&lt;/li&gt;
&lt;li&gt;如果存在多余的文件夹，请移出内部文件后删除它&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;修改根目录下的 &lt;code&gt;_config.yml&lt;/code&gt;：&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;lt;img src=&quot;/hexo/sets_1.png&quot;&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;img src=&quot;/hexo/sets_2.png&quot;&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;创建「关于页」&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;首次使用主题的「关于页」需要手动创建：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;hexo new page about
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;创建成功后，编辑博客目录下 &lt;code&gt;/source/about/index.md&lt;/code&gt;，添加 &lt;code&gt;layout&lt;/code&gt; 属性。&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;---
title: about
date: xxxxxx
layout: about
---
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;注意&lt;strong&gt;冒号&lt;/strong&gt;后面有空格，否则会报错&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;关于移动 hexo-blog 的补充说明&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;一般来说全局状态下的 hexo-blog 会出现在 &lt;code&gt;C:\Windows\System32&lt;/code&gt; 中&lt;/li&gt;
&lt;li&gt;但对于一些 C盘 看上去不太友好（快爆炸）的人来说（比如我），还是更希望把它移到别的地方去&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;C:\Windows\System32\hexo-blog&lt;/code&gt;找到那个文件夹&lt;/li&gt;
&lt;li&gt;把它剪切到你希望它出现的位置
&lt;ul&gt;
&lt;li&gt;这个时候使用 &lt;code&gt;cd hexo-blog&lt;/code&gt; 大概率是不成功的&lt;/li&gt;
&lt;li&gt;为了让我们更好的使用它，可以配置一下环境变量（如果你连环境变量在哪里或者是什么都不知道的话，问问万能的Google吧）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;把你的路径塞到 path 里&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;lt;img src=&quot;/hexo/path.png&quot;&amp;gt;&lt;/p&gt;
&lt;h3&gt;3.启动！&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;先在本地运行下&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;hexo g
hexo server
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;如果启动不了，请使用 &lt;code&gt;管理员模式&lt;/code&gt; 进行尝试&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4.创建文章&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;根目录下 &lt;code&gt;_config.yml&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;在生成文章的时候生成一个同名的资源目录用于存放图片文件&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;post_asset_folder: true
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;插入图片
&lt;ul&gt;
&lt;li&gt;这种方法在 md 编辑器里看不到图片，但在博客里是可以看到的&lt;/li&gt;
&lt;li&gt;更多方法参考官方文档（最下面会给的，别急）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;![图片引用方法二](test.png)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;想要使图片显示出来，需要装一个依赖
&lt;ul&gt;
&lt;li&gt;它可以帮你更好地对路径进行转换&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;npm install https://github.com/CodeFalling/hexo-asset-image --save
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;四、fluid 部分&lt;/h2&gt;
&lt;h3&gt;覆盖配置&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://hexo.fluid-dev.com/docs/guide/#%E8%A6%86%E7%9B%96%E9%85%8D%E7%BD%AE&quot;&gt;配置指南 | Hexo Fluid 用户手册 (fluid-dev.com)&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;好东西就要狠狠学习&lt;/li&gt;
&lt;li&gt;建议马上配置好&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;1.申请LeanCloud账号并创建应用&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://console.leancloud.cn/account/profile&quot;&gt;开发者信息 · 账号 · LeanCloud&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;注册一下
&lt;ul&gt;
&lt;li&gt;如果可以请使用国际版，不然你的浏览量是看不到的
&lt;ul&gt;
&lt;li&gt;国际版的使用可能需要一些&lt;strong&gt;特殊的小技巧&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;笔者在测试过程中发现评论功能国际版有些问题（笔者是不会承认自己是菜鸡的QAQ）
&lt;ul&gt;
&lt;li&gt;个人建议两个都注册下（以防万一）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;验证邮箱&lt;/li&gt;
&lt;li&gt;创建应用
&lt;ul&gt;
&lt;li&gt;开发版就够了&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;lt;img src=&quot;/hexo/create_application.png&quot;&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;设置-&amp;gt;应用凭证&lt;/code&gt;，找到 &lt;code&gt;AppID&lt;/code&gt; 和 &lt;code&gt;AppKey&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;留着等下用&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2. 来个记录浏览数的功能吧&lt;/h3&gt;
&lt;p&gt;&amp;lt;img src=&quot;/hexo/web_analytics.png&quot;&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;配置一下 &lt;code&gt;app_id&lt;/code&gt; 和 &lt;code&gt;app_key&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;顺手把底部的也解决一下吧&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;lt;img src=&quot;/hexo/bottom.png&quot;&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;img src=&quot;/hexo/set_id_key.png&quot;&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;打开计数功能，统计来源改为 &lt;code&gt;leancloud&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;lt;img src=&quot;/hexo/set_source.png&quot;&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;注：统计的功能或许也需要一些特殊的小技巧，当你看不到眼睛和浏览次数的时候，请不用太过着急&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;以下是示例&lt;/li&gt;
&lt;li&gt;如果你能看到它，恭喜你，你成功了~&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;lt;img src=&quot;/hexo/example_by_tsglz.png&quot;&amp;gt;&lt;/p&gt;
&lt;h3&gt;3.在来个评论的功能吧&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;先这样&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;lt;img src=&quot;/hexo/comment.png&quot;&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;再这样&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;lt;img src=&quot;/hexo/valine.png&quot;&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;评论的查看在 &lt;code&gt;leancloud&lt;/code&gt; 的 &lt;code&gt;数据存储 &amp;gt;&amp;gt; 结构化数据 &amp;gt;&amp;gt; Comment&lt;/code&gt; 里
&lt;ul&gt;
&lt;li&gt;删除也在这里，不要因为测试输入的乱码删不掉而苦恼 ：)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;五、一些使用技巧&lt;/h2&gt;
&lt;h3&gt;快速导航&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;- 清除缓存：hexo clean
- 生成：hexo g
- 部署到远端：hexo d
- 在自己的主机上部署：hexo s
- 创建文章：hexo new post $文章名$
- 图片插入方法一：{% asset_img test.png 图片引用方法一 %}
- 图片插入方法二：![图片引用方法二](test.png)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;关于多级分类&lt;/h3&gt;
&lt;h4&gt;父子分类&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;categories:
- 一级
- 二级
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;同级分类&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;categories:
- [一级,二级,二级中的1]
- [一级,二级,二级中的2]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;此时该文章同时处于 &lt;code&gt;一级-二级&lt;/code&gt; 下的 &lt;code&gt;1和2&lt;/code&gt; 中&lt;/p&gt;
&lt;h3&gt;参考文章&lt;/h3&gt;
&lt;h4&gt;hexo&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.csdn.net/yaorongke/article/details/119089190&quot;&gt;GitHub Pages + Hexo搭建个人博客网站，史上最全教程_hexo博客-CSDN博客&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;fluid&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;https://hexo.fluid-dev.com/docs/guide/&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://hexo.io/zh-cn/docs/front-matter&quot;&gt;Front-matter | Hexo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;valine&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;https://valine.js.org/quickstart.html&quot;&gt;快速开始 | Valine 一款快速、简洁且高效的无后端评论系统。&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;如有遗漏，欢迎补充 ：）&lt;/p&gt;
</content:encoded><category>Environment</category><author>Tsglz</author></item></channel></rss>