<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <id>https://nekoside.com/</id>
  <title type="text">nekoside</title>
  <subtitle type="text">nekoside&apos;s blog</subtitle>
  <updated>2026-09-26T00:00:00.000Z</updated>
  <author><name>nekoside</name></author>
  <link rel="alternate" href="https://nekoside.com/"/>
  <link rel="self" href="https://nekoside.com/atom.xml"/>
  <generator uri="https://github.com/CuteLeaf/Firefly">Firefly v6.16.8</generator>
    <entry>
      <id>https://nekoside.com/posts/blue-writeup/</id>
      <title type="text">Blue Walkthrough</title>
      <published>2026-09-24T00:00:00.000Z</published>
      <updated>2026-09-24T00:00:00.000Z</updated>
      <author><name>nekoside</name></author>
      <link rel="alternate" href="https://nekoside.com/posts/blue-writeup/"/>
      <summary type="text"></summary>
      <content type="html"><![CDATA[<div><div><div></div><div>Warning</div></div><div><p>仅供安全学习，环境均为本地虚拟机或 CTF 靶场。请<strong>勿</strong>用于未授权目标。</p></div></div>
<section><h1>介绍<a href="#介绍"><span>#</span></a></h1><ul>
<li><a href="https://app.hackthebox.com/machines/Blue" target="_blank">HTB</a></li>
<li>OS: Windows</li>
<li>难度：Easy</li>
<li>Writeup：已解锁</li>
</ul><p><code>/etc/host</code> 别名：<code>htb</code></p><p>由于 HTB 连接问题，需要将 <code>tun0</code> 的 MTU 降低到 1200：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>sudo</span><span> </span><span>ip</span><span> </span><span>link</span><span> </span><span>set</span><span> </span><span>dev</span><span> </span><span>tun0</span><span> </span><span>mtu</span><span> </span><span>1200</span></div></div></code></pre><div><div></div><div></div></div></figure></div><hr /><p>永恒之蓝（Eternal Blue）由 NSA 开发，利用 Windows 的 SMB（445/TCP）RCE 漏洞 <a href="https://nvd.nist.gov/vuln/detail/cve-2017-0144" target="_blank">CVE-2017-0144</a><sup><a href="#user-content-fn-wiki-eternalblue">1</a></sup>（MS17-010）。</p><p>后来的勒索软件 WannaCry 就是利用了永恒之蓝<sup><a href="#user-content-fn-wiki-zh-wannacry">2</a></sup>。</p><hr /></section>
<section><h1>分析<a href="#分析"><span>#</span></a></h1><section><h2>侦察（Recon）<a href="#侦察recon"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>nmap</span><span> </span><span>-n</span><span> </span><span>-Pn</span><span> </span><span>-T4</span><span> </span><span>-O</span><span> </span><span>htb</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><img alt="" loading="lazy" width="1863" height="1077" src="/_astro/Blue-nmap.Bzdhflvz_Z1aQcQF.webp" /></p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>smb</span><span> </span><span>-L</span><span> </span><span>htb</span><span> </span><span>-N</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><img alt="" loading="lazy" width="1645" height="585" src="/_astro/Blue-smb.CVzCZLxq_1OlrQq.webp" /></p><p><img alt="" loading="lazy" width="2554" height="983" src="/_astro/Blue-smb-version.C7T-p5Gd_ZWsYGs.webp" /></p><hr /></section><section><h2>User Flag<a href="#user-flag"><span>#</span></a></h2><p>使用 OpenVPN 连接 HTB 的话，LHOST 要设置为 <code>tun0</code>：</p><p><img alt="" loading="lazy" width="1721" height="897" src="/_astro/Blue-exp.BysvFCUJ_Z1SWNry.webp" /></p><p><img alt="" loading="lazy" width="1348" height="328" src="/_astro/Blue-shell.u7Ax-EyV_10odwe.webp" /></p><p>注意到 User Flag：</p><p><img alt="" loading="lazy" width="844" height="300" src="/_astro/Blue-user.C0CbA5fn_Z1oLog1.webp" /></p><hr /></section><section><h2>Root Flag<a href="#root-flag"><span>#</span></a></h2><p><img alt="" loading="lazy" width="948" height="173" src="/_astro/Blue-root.mman9Ps9_Z8fQrU.webp" /></p><hr /></section></section>
<section><h1>References<a href="#references"><span>#</span></a></h1></section>
<section><h2>Footnotes<a href="#footnote-label"><span>#</span></a></h2>
<ol>
<li>
<p><a href="https://en.wikipedia.org/wiki/EternalBlue" target="_blank">Wikipedia - EternalBlue</a> <a href="#user-content-fnref-wiki-eternalblue">↩</a></p>
</li>
<li>
<p><a href="https://zh.wikipedia.org/wiki/WannaCry" target="_blank">Wikipedia - WannaCry</a> <a href="#user-content-fnref-wiki-zh-wannacry">↩</a></p>
</li>
</ol>
</section>]]></content>
    </entry>
    <entry>
      <id>https://nekoside.com/posts/lame-writeup/</id>
      <title type="text">Lame Walkthrough</title>
      <published>2026-09-24T00:00:00.000Z</published>
      <updated>2026-09-24T00:00:00.000Z</updated>
      <author><name>nekoside</name></author>
      <link rel="alternate" href="https://nekoside.com/posts/lame-writeup/"/>
      <summary type="text"></summary>
      <content type="html"><![CDATA[<div><div><div></div><div>Warning</div></div><div><p>仅供安全学习，环境均为本地虚拟机或 CTF 靶场。请<strong>勿</strong>用于未授权目标。</p></div></div>
<section><h1>介绍<a href="#介绍"><span>#</span></a></h1><ul>
<li><a href="https://app.hackthebox.com/machines/Lame" target="_blank">HTB</a></li>
<li>难度：Easy</li>
<li>OS: Linux</li>
<li>writeup：已解锁</li>
</ul><blockquote><p>Lame is an easy Linux machine, requiring only one exploit to obtain root access.<sup><a href="#user-content-fn-htb-lame">1</a></sup></p></blockquote><hr /></section>
<section><h1>分析<a href="#分析"><span>#</span></a></h1><section><h2>侦察<a href="#侦察"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>nmap</span><span> </span><span>-A</span><span> </span><span>htb</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><img alt="" loading="lazy" width="1676" height="1176" src="/_astro/Lame-scan.B6ei3qsk_Z1snrGf.webp" /></p><ul>
<li>FTP: 21/TCP, vsftpd 2.3.4</li>
<li>SSH: 22/TCP, OpenSSH 4.7p1</li>
<li>OS: Linux</li>
<li>SMB: 445/TCP, Samba smbd 3.0.20-Debian</li>
</ul><p>注意到 vsftpd 2.3.4 存在后门：</p><blockquote><p>vsftpd 2.3.4 downloaded between 20110630 and 20110703 contains a backdoor which opens a shell on port 6200/tcp.<sup><a href="#user-content-fn-cve-2011-2523">2</a></sup></p></blockquote><p>Samba 3.0.20 存在 RCE 漏洞：</p><blockquote><p>The MS-RPC functionality in smbd in Samba 3.0.0 through 3.0.25rc3 allows remote attackers to execute arbitrary commands via shell metacharacters involving the (1) SamrChangePassword function, when the “username map script” smb.conf option is enabled, and allows remote authenticated users to execute commands via shell metacharacters involving other MS-RPC functions in the (2) remote printer and (3) file share management.<sup><a href="#user-content-fn-cve-2007-2447">3</a></sup></p></blockquote><hr /></section><section><h2>User Flag<a href="#user-flag"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>msfconsole</span><span> </span><span>-q</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>发现 vsftpd 的后门没法利用，试试 Samba 的 RCE：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>search</span><span> </span><span>samba</span><span> </span><span>3.0.20</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><img alt="" loading="lazy" width="2170" height="527" src="/_astro/Lame-root.5j-T7T4c_k6R4K.webp" /></p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>python</span><span> </span><span>-c</span><span> </span><span>"import pty; pty.spawn('/bin/bash')"</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>注意到 user flag：</p><p><img alt="" loading="lazy" width="723" height="287" src="/_astro/Lame-userflag.B9ZRB7KJ_ZMQKyb.webp" /></p><hr /></section><section><h2>Root Flag<a href="#root-flag"><span>#</span></a></h2><p>root flag：</p><p><img alt="" loading="lazy" width="878" height="291" src="/_astro/Lame-rootflag.Cj1stMO-_emCT6.webp" /></p><hr /></section><section><h2>后记<a href="#后记"><span>#</span></a></h2><p>虽然成功得到了两个 flag，但是最开始的 vsftpd 利用失败了。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>netstat</span><span> </span><span>-ntpl</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>注意到有很多端口监听 0.0.0.0，但是外部只扫描到 4 个端口：</p><p><img alt="" loading="lazy" width="2008" height="1160" src="/_astro/Lame-netstat.BHaK1_NZ_16K81G.webp" /></p><p>推测有防火墙，验证：</p><p><img alt="" loading="lazy" width="1367" height="470" src="/_astro/Lame-filtered.CQe1nWMN_25pB1K.webp" /></p><p>因此即便触发后门，6200 端口也无法连接。</p><hr /></section></section>
<section><h1>References<a href="#references"><span>#</span></a></h1><ul>
<li><a href="https://0xdf.gitlab.io/2020/04/07/htb-lame.html" target="_blank">0xdf - HTB: Lame</a></li>
</ul></section>
<section><h2>Footnotes<a href="#footnote-label"><span>#</span></a></h2>
<ol>
<li>
<p><a href="https://app.hackthebox.com/machines/Lame" target="_blank">HTB - Lame</a> <a href="#user-content-fnref-htb-lame">↩</a></p>
</li>
<li>
<p><a href="https://nvd.nist.gov/vuln/detail/cve-2011-2523" target="_blank">CVE-2011-2523</a> <a href="#user-content-fnref-cve-2011-2523">↩</a></p>
</li>
<li>
<p><a href="https://nvd.nist.gov/vuln/detail/cve-2007-2447" target="_blank">CVE-2007-2447</a> <a href="#user-content-fnref-cve-2007-2447">↩</a></p>
</li>
</ol>
</section>]]></content>
    </entry>
    <entry>
      <id>https://nekoside.com/posts/dc2/</id>
      <title type="text">DC-2 Writeup</title>
      <published>2026-09-23T00:00:00.000Z</published>
      <updated>2026-09-23T00:00:00.000Z</updated>
      <author><name>nekoside</name></author>
      <link rel="alternate" href="https://nekoside.com/posts/dc2/"/>
      <summary type="text">DC-2 靶场的复现与分析。</summary>
      <content type="html"><![CDATA[<div><div><div></div><div>Warning</div></div><div><p>仅供安全学习，环境均为本地虚拟机或 CTF 靶场。请<strong>勿</strong>用于未授权目标。</p></div></div>
<hr />
<section><h1>介绍<a href="#介绍"><span>#</span></a></h1><ul>
<li><a href="https://www.vulnhub.com/entry/dc-2,311/" target="_blank">Vulnhub</a></li>
<li><a href="https://www.vulnhub.com/author/dcau,610/" target="_blank">作者</a></li>
</ul><p>跟 <a href="/posts/dc1/">DC-1</a> 一样，DC-2 也有 5 个 flag<sup><a href="#user-content-fn-vulnhub">1</a></sup>。</p><p>注意到作者强调：</p><blockquote><p>Please note that you will need to set the hosts file on your pentesting device to something like:</p><p>192.168.0.145 dc-2</p><p>Obviously, replace 192.168.0.145 with the actual IP address of DC-2.</p><p>It will make life a whole lot simpler (and a certain CMS may not work without it).</p></blockquote><p>所以我们要先暂时修改 Kali 的 hosts：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>echo</span><span> </span><span>'192.168.78.143 dc-2'</span><span> | </span><span>sudo</span><span> </span><span>tee</span><span> </span><span>/etc/hosts</span></div></div></code></pre><div><div></div><div></div></div></figure></div><hr /></section>
<section><h1>分析<a href="#分析"><span>#</span></a></h1><section><h2>侦察<a href="#侦察"><span>#</span></a></h2><p>nmap 扫描得知：</p><ul>
<li>OS: Debian</li>
<li>Kernel: Linux 3.2 - 4.14</li>
<li>Web Server: Apache httpd 2.4.10</li>
<li>CMS: WordPress 4.7.10</li>
<li>开放端口：tcp 80, 7744 (SSH)</li>
</ul><p>看样子要先从 Web 服务下手。</p><hr /></section><section><h2>flag1<a href="#flag1"><span>#</span></a></h2><p>注意到这个网站使用的是 WordPress（只要你的视力没有问题）：</p><p><img alt="" loading="lazy" width="1029" height="502" src="/_astro/DC2-WordPress.-C3dbmUh_it6as.webp" /></p><p>第一个 flag 就在首页：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>Flag</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>Flag 1:</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>Your usual wordlists probably won’t work, so instead, maybe you just need to be cewl.</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>More passwords is always better, but sometimes you just can’t win them all.</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>Log in as one to see the next flag.</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>If you can’t find it, log in as another.</span></div></div></code></pre><div><div></div><div></div></div></figure></div><hr /></section><section><h2>flag2<a href="#flag2"><span>#</span></a></h2><p>注意到 flag1 提到了 <code>cewl</code>，也许你不认识这个单词，因为这不是个单词…（这里的 cewl 双关了 “cool”）</p><p>CeWL<sup><a href="https://www.kali.org/tools/cewl/" target="_blank">kali</a></sup> 是个自定义字典生成工具：</p><a href="https://github.com/digininja/CeWL" target="_blank"><div><div><div><div></div><div>digininja</div></div><div>/</div><div>CeWL</div></div><div></div></div><div>CeWL is a Custom Word List Generator</div><div><div>—</div><div>—</div><div>no-license</div><span>Ruby</span></div></a><p>这里明确说普通的字典不好使，所以要我们用 CeWL 制作一个字典来用。</p><hr /><p>注意到在这个页面上，我们没有找到任何登录入口。</p><p>目录扫描得到：</p><p><img alt="" loading="lazy" width="1861" height="541" src="/_astro/DC2-ffuf.C85IcsBc_Z1l3C1M.webp" /></p><p>发现了登录界面：</p><p><code>http://dc-2/wp-login.php</code></p><p>使用 WPScan<sup><a href="https://www.kali.org/tools/wpscan/" target="_blank">kali</a></sup> 扫描得到三个有效用户：</p><p><img alt="" loading="lazy" width="1608" height="538" src="/_astro/DC2-users.CwYFbvD1_aFJov.webp" /></p><p>接下来制作字典，</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>echo</span><span> </span><span>"admin</span></div></div><div><div><div>2</div></div><div><span>tom</span></div></div><div><div><div>3</div></div><div><span>jerry"</span><span> &gt; </span><span>user.txt</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>CeWL 可以根据网站内容制作对应的字典<sup><a href="#user-content-fn-github-cewl">2</a></sup>：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>cewl</span><span> </span><span>http://dc-2/</span><span> </span><span>-w</span><span> </span><span>password.txt</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>通过：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>wpscan</span><span> </span><span>--url</span><span> </span><span>http://dc-2/</span><span> </span><span>--usernames</span><span> </span><span>user.txt</span><span> </span><span>--passwords</span><span> </span><span>password.txt</span><span> </span><span>threads</span><span> </span><span>20</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>得到：</p><ul>
<li><code>tom</code> -&gt; <code>parturient</code></li>
<li><code>jerry</code> -&gt; <code>adipiscing</code></li>
</ul><p>登录后注意到 flag2：</p><p><img alt="" loading="lazy" width="1624" height="1006" src="/_astro/DC2-flag2.BgTehcL8_ZNJjyp.webp" /></p><hr /></section><section><h2>flag3<a href="#flag3"><span>#</span></a></h2><p>注意到我们可以用 <code>tom</code> - <code>parturient</code> 通过 7744 端口登录到其服务器：</p><p><img alt="" loading="lazy" width="805" height="474" src="/_astro/DC2-ssh.BEg7WRVi_Z1gsx15.webp" /></p><p>登录 shell 为 rbash，权限受限。且 <code>$PATH</code> 只有 <code>/home/tom/usr/bin</code>。</p><p>查看 <code>/home/tom/usr/bin</code> 得知可以使用：</p><ul>
<li><code>less</code></li>
<li><code>ls</code></li>
<li><code>scp</code></li>
<li><code>vi</code></li>
</ul><p>查看 <code>flag3.txt</code>：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>vi</span><span> </span><span>flag3.txt</span></div></div></code></pre><div><div></div><div></div></div></figure></div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>Poor old Tom is always running after Jerry. Perhaps he should su for all the stress he causes.</span></div></div><div><div><div>2</div></div><div><span>flag3.txt (END)</span></div></div></code></pre><div><div></div><div></div></div></figure></div><hr /></section><section><h2>flag4<a href="#flag4"><span>#</span></a></h2><p>根据 flag3，我们需要用 <code>su</code>。</p><p>配置别名：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>alias</span><span> </span><span>c</span><span>=</span><span>"printf '\e[H\e[2J\e[3J'"</span></div></div><div><div><div>2</div></div><div><span>alias</span><span> </span><span>l</span><span>=</span><span>'ls --color'</span></div></div><div><div><div>3</div></div><div><span>alias</span><span> </span><span>ll</span><span>=</span><span>'ls --color -lh'</span></div></div><div><div><div>4</div></div><div><span>alias</span><span> </span><span>la</span><span>=</span><span>'ls --color -A'</span></div></div><div><div><div>5</div></div><div><span>alias</span><span> </span><span>lla</span><span>=</span><span>'ls --color -lhA'</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>查看其他用户：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>less</span><span> </span><span>/etc/passwd</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><img alt="" loading="lazy" width="1163" height="170" src="/_astro/DC2-passwd.hnoTtmAL_1ySL7l.webp" /></p><p>通过 <code>vi</code> 逃逸 <code>rbash</code><sup><a href="#user-content-fn-gtfobins-vi">3</a></sup>：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>vi</span><span> </span><span>-c</span><span> </span><span>':set shell=/bin/bash | shell'</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><img alt="" loading="lazy" width="1430" height="831" src="/_astro/DC2-flag4.C6AzDB8F_tob0d.webp" /></p><p>flag4 提示我们找 git。</p><hr /></section><section><h2>flag5<a href="#flag5"><span>#</span></a></h2><p>切换到 jerry 账号：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>su</span><span> </span><span>-</span><span> </span><span>jerry</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>密码为之前的：<code>adipiscing</code></p><p><img alt="" loading="lazy" width="2168" height="343" src="/_astro/DC2-sudo-l.Ci9SQIsj_ZPvckM.webp" /></p><p>通过 git 提权到 root：<sup><a href="#user-content-fn-gtfobins-git">4</a></sup></p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>sudo</span><span> </span><span>git</span><span> </span><span>branch</span><span> </span><span>--help</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>再通过 less 执行：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>!</span><span>/bin/bash</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>得到最终 flag：</p><p><img alt="" loading="lazy" width="1153" height="902" src="/_astro/DC2-flag5.LVf0ZM56_Z1Sx24S.webp" /></p><hr /></section></section>
<section><h1>References<a href="#references"><span>#</span></a></h1><ul>
<li><a href="https://www.hackingarticles.in/dc-2-walkthrough/" target="_blank">Raj Chandel’s Blog - DC-2 Walkthrough</a></li>
</ul></section>
<section><h2>Footnotes<a href="#footnote-label"><span>#</span></a></h2>
<ol>
<li>
<p><a href="https://www.vulnhub.com/entry/dc-2,311/" target="_blank">Vulnhub - DC-2</a> <a href="#user-content-fnref-vulnhub">↩</a></p>
</li>
<li>
<p><a href="https://github.com/digininja/CeWL" target="_blank">Github - CeWL</a> <a href="#user-content-fnref-github-cewl">↩</a></p>
</li>
<li>
<p><a href="https://gtfobins.org/gtfobins/vi/#shell" target="_blank">GTFObins - vi</a> <a href="#user-content-fnref-gtfobins-vi">↩</a></p>
</li>
<li>
<p><a href="https://gtfobins.org/gtfobins/git/#inherit" target="_blank">GTFObins - git</a> <a href="#user-content-fnref-gtfobins-git">↩</a></p>
</li>
</ol>
</section>]]></content>
    </entry>
    <entry>
      <id>https://nekoside.com/posts/node-writeup/</id>
      <title type="text">Node Writeup</title>
      <published>2026-09-23T00:00:00.000Z</published>
      <updated>2026-09-23T00:00:00.000Z</updated>
      <author><name>nekoside</name></author>
      <link rel="alternate" href="https://nekoside.com/posts/node-writeup/"/>
      <summary type="text"></summary>
      <content type="html"><![CDATA[<div><div><div></div><div>Warning</div></div><div><p>仅供安全学习，环境均为本地虚拟机或 CTF 靶场。请<strong>勿</strong>用于未授权目标。</p></div></div>
<section><h1>介绍<a href="#介绍"><span>#</span></a></h1><ul>
<li>VulnHub: <a href="https://www.vulnhub.com/entry/node-1,252/" target="_blank">VulnHub</a></li>
<li>Author: <a href="https://www.vulnhub.com/author/rob,593/" target="_blank">Rob</a></li>
</ul><p>一共两个 flag：<sup><a href="#user-content-fn-vulnhub">1</a></sup></p><ul>
<li>user</li>
<li>root</li>
</ul><hr /></section>
<section><h1>分析<a href="#分析"><span>#</span></a></h1><section><h2>侦察<a href="#侦察"><span>#</span></a></h2><p>端口：</p><ul>
<li>22 SSH</li>
<li>3000 HTTP</li>
</ul><hr /></section><section><h2>user flag<a href="#user-flag"><span>#</span></a></h2><p>注意到 URL：</p><p><code>http://192.168.74.131:3000/api/users</code></p><p>返回：</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>[</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>{</span></div></div><div><div><div>3</div></div><div><span>    </span><span>"_id"</span><span>: </span><span>"59a7365b98aa325cc03ee51c"</span><span>,</span></div></div><div><div><div>4</div></div><div><span>    </span><span>"username"</span><span>: </span><span>"myP14ceAdm1nAcc0uNT"</span><span>,</span></div></div><div><div><div>5</div></div><div><span>    </span><span>"password"</span><span>: </span><span>"dffc504aa55359b9265cbebe1e4032fe600b64475ae3fd29c07d23223334d0af"</span><span>,</span></div></div><div><div><div>6</div></div><div><span>    </span><span>"is_admin"</span><span>: </span><span>true</span></div></div><div><div><div>7</div></div><div><span><span>  </span></span><span>},</span></div></div><div><div><div>8</div></div><div><span><span>  </span></span><span>{</span></div></div><div><div><div>9</div></div><div><span>    </span><span>"_id"</span><span>: </span><span>"59a7368398aa325cc03ee51d"</span><span>,</span></div></div><div><div><div>10</div></div><div><span>    </span><span>"username"</span><span>: </span><span>"tom"</span><span>,</span></div></div><div><div><div>11</div></div><div><span>    </span><span>"password"</span><span>: </span><span>"f0e2e750791171b0391b682ec35835bd6a5c3f7c8d1d0191451ec77b4d75f240"</span><span>,</span></div></div><div><div><div>12</div></div><div><span>    </span><span>"is_admin"</span><span>: </span><span>false</span></div></div><div><div><div>13</div></div><div><span><span>  </span></span><span>},</span></div></div><div><div><div>14</div></div><div><span><span>  </span></span><span>{</span></div></div><div><div><div>15</div></div><div><span>    </span><span>"_id"</span><span>: </span><span>"59a7368e98aa325cc03ee51e"</span><span>,</span></div></div><div><div><div>16</div></div><div><span>    </span><span>"username"</span><span>: </span><span>"mark"</span><span>,</span></div></div><div><div><div>17</div></div><div><span>    </span><span>"password"</span><span>: </span><span>"de5a1adf4fedcce1533915edc60177547f1057b61b7119fd130e1f7428705f73"</span><span>,</span></div></div><div><div><div>18</div></div><div><span>    </span><span>"is_admin"</span><span>: </span><span>false</span></div></div><div><div><div>19</div></div><div><span><span>  </span></span><span>},</span></div></div><div><div><div>20</div></div><div><span><span>  </span></span><span>{</span></div></div><div><div><div>21</div></div><div><span>    </span><span>"_id"</span><span>: </span><span>"59aa9781cced6f1d1490fce9"</span><span>,</span></div></div><div><div><div>22</div></div><div><span>    </span><span>"username"</span><span>: </span><span>"rastating"</span><span>,</span></div></div><div><div><div>23</div></div><div><span>    </span><span>"password"</span><span>: </span><span>"5065db2df0d4ee53562c650c29bacf55b97e231e3fe88570abc9edd8b78ac2f0"</span><span>,</span></div></div><div><div><div>24</div></div><div><span>    </span><span>"is_admin"</span><span>: </span><span>false</span></div></div><div><div><div>25</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>26</div></div><div><span>]</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>密码长度 64 字符，猜测为 SHA-256。</p><p>通过 <a href="https://www.cmd5.com/" target="_blank">cmd5</a> 将 <code>dffc504aa55359b9265cbebe1e4032fe600b64475ae3fd29c07d23223334d0af</code> 解密为 <code>manchester</code>，</p><p>得到管理员信息：</p><ul>
<li>账号：<code>myP14ceAdm1nAcc0uNT</code></li>
<li>密码：<code>manchester</code></li>
</ul><p>登录后可以下载一个备份文件：</p><p><img alt="" loading="lazy" width="1643" height="368" src="/_astro/Node-backup.Boc6vZrc_Z2lJdNB.webp" /></p><p>这个文件没有魔数，不像常见的二进制程序。</p><p><img alt="" loading="lazy" width="2172" height="1248" src="/_astro/Node-vim.B53cYkM8_ZgVEQT.webp" /></p><p>Unicode 编码下有：</p><ul>
<li>大写字母</li>
<li>小写字母</li>
<li>数字</li>
<li><code>/</code></li>
<li><code>+</code></li>
</ul><p>一眼 Base64，解码：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>base64</span><span> </span><span>-d</span><span> </span><span>myplace.backup</span><span> &gt; </span><span>backup</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><img alt="" loading="lazy" width="2199" height="351" src="/_astro/Node-unzip.HCBNCqCU_tiR43.webp" /></p><p>是一个加密的 zip 压缩包。</p><p>刚刚的密码不对，尝试破解压缩包密码：</p><p><img alt="" loading="lazy" width="1634" height="234" src="/_astro/Node-unzip-passwd.BXmUhYFZ_ZWB7ik.webp" /></p><p>密码为 <code>magicword</code>，解压后进入备份目录。</p><p>在 <code>app.js</code> 中找到关键信息：</p><p><img alt="" loading="lazy" width="2235" height="973" src="/_astro/Node-ssh.Cl3gGkgM_1CpShA.webp" /></p><ul>
<li>用户名：<code>mark</code></li>
<li>密码：<code>5AYRft73VtFpc84k</code></li>
</ul><hr /></section><section><h2>root flag<a href="#root-flag"><span>#</span></a></h2><p>连接 ssh 后注意到 mark 不在 <code>sudoers</code>。</p><p>查看机器版本后找到对应 LPE（本地权限提升）漏洞：</p><p><img alt="" loading="lazy" width="2105" height="1155" src="/_astro/Node-searchsploit.2NISHG5U_Z12dlVQ.webp" /></p><p>使用 <code>scp</code> 将 exp 复制到 <code>/tmp</code> 下：</p><p><img alt="" loading="lazy" width="2146" height="328" src="/_astro/Node-scp.DzHXkmev_ZzMwVP.webp" /></p><p>提权：</p><p><img alt="" loading="lazy" width="1045" height="615" src="/_astro/Node-root.BPXYAK6Z_ZQxUMU.webp" /></p><p>进入 <code>/root</code>：</p><p><img alt="" loading="lazy" width="729" height="429" src="/_astro/Node-flag.Cm83vuUu_10rudB.webp" /></p><hr /></section></section>
<section><h1>References<a href="#references"><span>#</span></a></h1></section>
<section><h2>Footnotes<a href="#footnote-label"><span>#</span></a></h2>
<ol>
<li>
<p><a href="https://www.vulnhub.com/entry/node-1,252/" target="_blank">VulnHub - Node</a> <a href="#user-content-fnref-vulnhub">↩</a></p>
</li>
</ol>
</section>]]></content>
    </entry>
    <entry>
      <id>https://nekoside.com/posts/dc1/</id>
      <title type="text">DC-1 Writeup</title>
      <published>2026-09-22T00:00:00.000Z</published>
      <updated>2026-09-22T00:00:00.000Z</updated>
      <author><name>nekoside</name></author>
      <link rel="alternate" href="https://nekoside.com/posts/dc1/"/>
      <summary type="text">DC-1 靶场的复现与分析。</summary>
      <content type="html"><![CDATA[<div><div><div></div><div>Warning</div></div><div><p>仅供安全学习，环境均为本地虚拟机或 CTF 靶场。请<strong>勿</strong>用于未授权目标。</p></div></div>
<hr />
<section><h1>介绍<a href="#介绍"><span>#</span></a></h1><p><a href="https://www.vulnhub.com/entry/dc-1,292/" target="_blank">Vulnhub</a></p><p>根据<a href="https://www.vulnhub.com/author/dcau,610/" target="_blank">作者</a>的介绍，这个靶机一共有五个 flag<sup><a href="#user-content-fn-dc-1">1</a></sup>。</p><p>目标是 root shell。</p></section>
<section><h1>分析<a href="#分析"><span>#</span></a></h1><p>nmap 扫描得知：</p><ul>
<li>OS: Debian</li>
<li>Kernel: Linux 3.2 - 3.6</li>
<li>Web Server: Apache httpd 2.2.22</li>
<li>CMS: Drupal 7</li>
<li>开放的 TCP 端口：22, 80, 111</li>
</ul><hr /><p>通过 CVE-2018-7600，使用 <code>msfconsole</code> 拿到 <code>www-data</code> 的 shell：</p><p><img alt="" loading="lazy" width="1409" height="298" src="/_astro/DC1-shell.CFzVrpAk_Z1vHQrj.webp" /></p><hr /><section><h2>flag 1<a href="#flag-1"><span>#</span></a></h2><p>第一个 flag 让我们去找 Drupal 的配置文件：</p><p><img alt="" loading="lazy" width="1091" height="273" src="/_astro/DC1-flag1.BojbxF6K_1IpXSG.webp" /></p><hr /></section><section><h2>flag 2<a href="#flag-2"><span>#</span></a></h2><p>注意到 <code>/var/www/sites/default</code> 下的 <code>settings.php</code>：</p><p><img alt="" loading="lazy" width="1414" height="1041" src="/_astro/DC1-flag2.CgxzII4X_Z1djvK.webp" /></p><p>我们可以得到 Drupal 数据库的一个用户名和密码。</p><hr /></section><section><h2>flag 3<a href="#flag-3"><span>#</span></a></h2><p>进入数据库后，注意到 flag3：</p><p><img alt="" loading="lazy" width="2486" height="453" src="/_astro/DC1-flag3.CcSAvYhc_14zWUB.webp" /></p><p>但是乍一看好像没给任何信息？</p><p>注意到这个 flag3 对应的 uid 为 1，在 users 表中确认到：</p><ul>
<li>username: <code>admin</code></li>
<li>uid: 1</li>
<li>对应的密码哈希 <code>$S$DvQI6Y600iNeXRIeEMF94Y6FvN8nujJcEDTCP9nS5.i38jnEKuDR</code></li>
</ul><p>尝试注册一个新用户再通过 SQL 替换密码哈希，结果注册用户要求管理员通过且注册时不能填写密码。所以得找找其他办法。</p><p>注意到这个计算密码哈希的脚本：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>www-data@DC-1:/var/www/scripts$ ls password-hash.sh</span></div></div><div><div><div>2</div></div><div><span>password-hash.sh</span></div></div><div><div><div>3</div></div><div><span>www-data@DC-1:/var/www/scripts$</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>执行后提示我们：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>To run this script without the --root argument invoke it from the root directory</span></div></div><div><div><div>2</div></div><div><span>of your Drupal installation as</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>./scripts/password-hash.sh</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>按照指示运行：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>www-data@DC-1:/var/www$ ./scripts/password-hash.sh 123</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>password: 123           hash: $S$DhnR5dwKRomrHLQBklwV4Xb/JjiQIy2NUKwZqhOw5gbQp692NFDn</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>www-data@DC-1:/var/www$</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>得到 <code>123</code> 的哈希 <code>$S$DhnR5dwKRomrHLQBklwV4Xb/JjiQIy2NUKwZqhOw5gbQp692NFDn</code></p><p>替换 <code>admin</code> 密码：</p><p><img alt="" loading="lazy" width="1995" height="428" src="/_astro/DC1-change-passwd.CE2gePzL_2ccJs0.webp" /></p><p>登录后成功在文章列表中找到 flag3：</p><p><img alt="" loading="lazy" width="1892" height="783" src="/_astro/DC1-flag3-content.DP7c1RlQ_Z1GEmPP.webp" /></p><hr /></section><section><h2>flag 4<a href="#flag-4"><span>#</span></a></h2><p>根据 flag3 的内容：</p><blockquote><p>Special PERMS will help FIND the passwd - but you’ll need to -exec that command to work out how to get what’s in the shadow.</p></blockquote><p>这里有个双关：shadow 既指“阴影”，又指 <code>/etc/shadow</code>，同时指引我们使用 <code>-exec</code> 选项。</p><p>Q：但是什么命令有 <code>-exec</code> 选项呢？</p><p>A：注意到我们常用的命令中，<code>find</code> 带有 <code>-exec</code> 选项。</p><p><code>find -exec</code> 确实可以用于执行其他程序，但是通常情况 <code>find</code> 的权限是 755：</p><p><img alt="" loading="lazy" width="1358" height="187" src="/_astro/find.CUoUMNY4_Z1pmlv.webp" /></p><p>检查 DC-1 的 <code>find</code>：</p><p><img alt="" loading="lazy" width="1067" height="159" src="/_astro/DC1-find.BsuetikU_Z1RhXR0.webp" /></p><p>天哪竟然是 SUID，看来是作者故意改的，说明就该用这个。</p><p>先看看 <code>/etc/shadow</code>：</p><p><img alt="" loading="lazy" width="1412" height="1196" src="/_astro/DC1-shadow.BGvPqodO_Z2g8sBd.webp" /></p><p>发现了 flag4 用户及其家目录，于是：</p><p><img alt="" loading="lazy" width="1248" height="338" src="/_astro/DC1-flag4.CC-LonOn_qWfCq.webp" /></p><hr /></section><section><h2>flag 5<a href="#flag-5"><span>#</span></a></h2><p>flag4 的内容明示我们找 <code>/root</code>，众所周知普通用户无权进入 <code>/root</code>，作者也没给后门，所以…</p><p>通过 SUID 的 <code>find</code> 提权到 root：<sup><a href="#user-content-fn-gtfobins-find">2</a></sup></p><p><img alt="" loading="lazy" width="1443" height="260" src="/_astro/DC1-find-root.DcblqkEa_Z25WcD9.webp" /></p><p><img alt="" loading="lazy" width="1149" height="478" src="/_astro/DC1-flag5.CM6Ym0pj_RePwf.webp" /></p><hr /></section></section>
<section><h1>References<a href="#references"><span>#</span></a></h1></section>
<section><h2>Footnotes<a href="#footnote-label"><span>#</span></a></h2>
<ol>
<li>
<p><a href="https://www.vulnhub.com/entry/dc-1,292/" target="_blank">VulnHub - DC-1</a> <a href="#user-content-fnref-dc-1">↩</a></p>
</li>
<li>
<p><a href="https://gtfobins.org/gtfobins/find/#shell" target="_blank">GTFOBins - find</a> <a href="#user-content-fnref-gtfobins-find">↩</a></p>
</li>
</ol>
</section>]]></content>
    </entry>
    <entry>
      <id>https://nekoside.com/posts/xwayland-fcitx/</id>
      <title type="text">修复 XWayland 下的 Fcitx5 输入法</title>
      <published>2026-09-17T00:00:00.000Z</published>
      <updated>2026-09-19T00:00:00.000Z</updated>
      <author><name>nekoside</name></author>
      <link rel="alternate" href="https://nekoside.com/posts/xwayland-fcitx/"/>
      <summary type="text"></summary>
      <content type="html"><![CDATA[<section><h1>太长不看<a href="#太长不看"><span>#</span></a></h1><section><h2>QQ<a href="#qq"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>linuxqq</span><span> </span><span>--ozone-platform=wayland</span><span> </span><span>--enable-wayland-ime</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h2>Obsidian<a href="#obsidian"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>obsidian</span><span> </span><span>--enable-features=UseOzonePlatform</span><span> </span><span>--ozone-platform=wayland</span><span> </span><span>--enable-wayland-ime</span></div></div></code></pre><div><div></div><div></div></div></figure></div><hr /></section></section>
<section><h1>背景<a href="#背景"><span>#</span></a></h1><p>截至 2026 年 9 月，KDE、GNOME 等一众 DE 都切换到了 Wayland。而许多软件都没有适配 Wayland，因此这些软件需要借助 XWayland 运行。</p><p>但是 XWayland 下，Fcitx5 会无法使用。</p><hr /></section>
<section><h1>解决方案<a href="#解决方案"><span>#</span></a></h1><div><div><div></div><div>Note</div></div><div><p>使用 <a href="https://archlinux.org/packages/extra/x86_64/xorg-xeyes/" target="_blank">xorg-xeyes</a> 包提供的 <code>xeyes</code> 来判断当前启用的是 X11 / XWayland 还是原生 Wayland。</p></div></div><section><h2>Chromium / Electron<a href="#chromium--electron"><span>#</span></a></h2><p><img alt="" loading="lazy" width="1036" height="427" src="/_astro/Electron%E5%8F%82%E6%95%B0.DgbVz01a_Z1HwDYX.webp" /></p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>--ozone-platform-hint</span><span>=</span><span>auto</span><span> </span><span>--enable-wayland-ime</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>你也可以用 <code>--ozone-platform=wayland</code> 强制指定 Wayland。</p><p>其中 <code>--ozone-platform-hint</code> 是 Chromium 系特有的 Flag，可以用于切换到 Wayland 后端。</p><div><div><div></div><div>Note</div></div><div><p>可以使用 <a href="https://archlinux.org/packages/extra/x86_64/xorg-xeyes/" target="_blank">xeyes</a><sup>extra</sup> 判断应用当前是 Wayland 还是 XWayland</p></div></div><p>如果不行可以<strong>追加</strong>这个参数</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>--wayland-text-input-version</span><span>=</span><span>3</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>如果使用终端启动遇到一些带 <code>GPU</code> 字眼的 <code>ERROR</code>，可以<strong>追加</strong>这个参数禁用 GPU 加速</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>--disable-gpu-compositing</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>或者你发现使用上面的 wayland 参数启动后启动变慢，也可以加上试试，因为这些 <code>ERROR</code> 会增加启动时间。</p><hr /><p>拿 <a href="https://aur.archlinux.org/packages/linuxqq" target="_blank">linuxqq</a><sup>aur</sup> 举例，</p><p><img alt="" loading="lazy" width="479" height="222" src="/_astro/linuxqq.Befo9ZWX_i4QlW.webp" /></p><p>添加参数：</p><p><img alt="" loading="lazy" width="537" height="73" src="/_astro/linuxqq-params.DPoMCtD8_XdcEv.webp" /></p><p>默认情况下发送到桌面的 <code>.desktop</code> 来自软件包，位于 <code>/usr/share/applications</code>。</p><p>编辑后的 <code>.desktop</code> 位于 ~/.local/share/applications 下，所以你需要重新发送到桌面。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>Exec</span><span>=</span><span>linuxqq</span><span> </span><span>--ozone-platform</span><span>=</span><span>wayland</span><span> </span><span>--enable-wayland-ime</span><span> </span><span>%U</span></div></div></code></pre><div><div></div><div></div></div></figure></div><hr /></section><section><h2>其他支持 Wayland 后端的应用<a href="#其他支持-wayland-后端的应用"><span>#</span></a></h2><section><h3>Godot<a href="#godot"><span>#</span></a></h3><p>在 Godot 编辑器设置中勾选“高级设置”（右上角开关），随后在“运行” -&gt; “平台”中勾选“首选 Wayland”后重启 Godot 即可。</p><p><img alt="" loading="lazy" width="1920" height="1027" src="/_astro/godot-wayland.EYTpk9lX_1RRvNm.webp" /></p><hr /></section></section><section><h2>普通 X11 应用<a href="#普通-x11-应用"><span>#</span></a></h2><p>以 WPS 为例：</p><p>在 KDE 菜单编辑器中为所有 WPS 菜单项添加环境变量：</p><p><code>QT_IM_MODULE=fcitx</code></p><p>这会在 <code>~/.local/share/applications</code> 重新生成新的 <code>.desktop</code> 文件（同时不会影响其他软件）。</p><p>已经发送到桌面的需要重新发送一次，否则使用的还是 <code>/usr/share/applications</code> 的 <code>.desktop</code>。</p><p>由于 <code>~/.local/share/applications</code> 的搜索优先级高于 <code>/usr/share/applications</code>，通过 XDG 关联的文件直接打开也应当能工作。</p></section></section>]]></content>
    </entry>
    <entry>
      <id>https://nekoside.com/posts/lnk-suffix/</id>
      <title type="text">去掉新建快捷方式的后缀</title>
      <published>2026-09-04T00:00:00.000Z</published>
      <updated>2026-09-04T00:00:00.000Z</updated>
      <author><name>nekoside</name></author>
      <link rel="alternate" href="https://nekoside.com/posts/lnk-suffix/"/>
      <summary type="text"></summary>
      <content type="html"><![CDATA[<section><h1>环境<a href="#环境"><span>#</span></a></h1><ul>
<li>Windows 11 IoT 企业版 LTSC 24H2</li>
</ul></section>
<section><h1>方案<a href="#方案"><span>#</span></a></h1><div><div><div></div><div>Warning</div></div><div><p>已知问题：</p><p>该方案会导致“发送到桌面快捷方式”错误地发送原文件而非快捷方式（<code>.lnk</code>）</p></div></div><p>定位到注册表：<code>HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer</code></p><p>创建项：<code>NamingTemplates</code></p><p>该项的有效键值对：</p><ul>
<li><code>RenameNameTemplate</code><sup><a href="#user-content-fn-howtogeek">1</a></sup></li>
<li><code>CopyNameTemplate</code><sup><a href="#user-content-fn-elevenforum">2</a></sup> 复制后文件的名称</li>
<li><code>ShortcutNameTemplate</code> 新建的快捷方式名称，这才是我们要找的</li>
</ul><p>键类型：<code>REG_SZ</code>（字符串值）</p><p>键值中，可以使用 <code>%s</code> 表示原始文件名称</p><p>（新建并）修改 <code>ShortcutNameTemplate</code> 的值为 <code>%s</code> 即可去除新快捷方式的文字后缀。</p><div><div><div></div><div>Note</div></div><div><p>该修改无需重启，会立即生效</p></div></div><div><div><div></div><div>Note</div></div><div><p>网传的另一种方案：修改键 <code>link</code> 的值为全零，经过测试这种方案在重启后会被系统自动覆写。</p></div></div></section>
<section><h1>References<a href="#references"><span>#</span></a></h1></section>
<section><h2>Footnotes<a href="#footnote-label"><span>#</span></a></h2>
<ol>
<li>
<p><a href="https://www.howtogeek.com/715225/change-default-new-folder-name-windows-10/" target="_blank">How to Geek</a> <a href="#user-content-fnref-howtogeek">↩</a></p>
</li>
<li>
<p><a href="https://www.elevenforum.com/t/change-copy-name-extension-in-windows-11.3065/" target="_blank">Eleven Forum</a> <a href="#user-content-fnref-elevenforum">↩</a></p>
</li>
</ol>
</section>]]></content>
    </entry>
    <entry>
      <id>https://nekoside.com/posts/router-vulnerability/</id>
      <title type="text">路由器固件漏洞分析</title>
      <published>2026-09-04T00:00:00.000Z</published>
      <updated>2026-09-04T00:00:00.000Z</updated>
      <author><name>nekoside</name></author>
      <link rel="alternate" href="https://nekoside.com/posts/router-vulnerability/"/>
      <summary type="text">从零开始进行路由器固件的漏洞挖掘。</summary>
      <content type="html"><![CDATA[<section><h1>环境搭建<a href="#环境搭建"><span>#</span></a></h1><section><h2>固件提取<a href="#固件提取"><span>#</span></a></h2><p>UBI</p><p>ubireader_extract_images</p><p>squashfs 的魔数为：<code>68 73 71 73</code> (小端序：<code>0x73717368</code>)<sup><a href="#user-content-fn-sfs-magic-kernel">1</a></sup><sup><a href="#user-content-fn-sfs-magic">2</a></sup></p><section><h3>unblob<a href="#unblob"><span>#</span></a></h3><p><a href="https://github.com/onekey-sec/unblob" target="_blank">unblob</a> 是更现代的固件提取工具。</p><p>安装：<sup><a href="#user-content-fn-unblob-github">3</a></sup></p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>sudo</span><span> </span><span>apt</span><span> </span><span>install</span><span> </span><span>unblob</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>安装其依赖的外部提取工具：<sup><a href="#user-content-fn-unblob-github">3</a></sup></p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>sudo</span><span> </span><span>apt</span><span> </span><span>install</span><span> </span><span>android-sdk-libsparse-utils</span><span> </span><span>e2fsprogs</span><span> </span><span>p7zip-full</span><span>\</span></div></div><div><div><div>2</div></div><div><span> </span><span>unar</span><span> </span><span>zlib1g-dev</span><span> </span><span>liblzo2-dev</span><span> </span><span>lzop</span><span> </span><span>lziprecover</span><span> </span><span>libhyperscan-dev</span><span> </span><span>zstd</span><span> </span><span>lz4</span><span> </span><span>sasquatch</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>使用该命令验证所有依赖是否满足：<sup><a href="#user-content-fn-unblob-github">3</a></sup></p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>unblob</span><span> </span><span>--show-external-dependencies</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>提取固件：<sup><a href="#user-content-fn-unblob-github">3</a></sup></p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>unblob</span><span> </span><span>&lt;xxx.bin&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>binwalk<a href="#binwalk"><span>#</span></a></h3><p><code>binwalk</code><sup><a href="https://www.kali.org/tools/binwalk/" target="_blank">kali</a></sup> (binwalk2) 或
<code>binwalk3</code><sup><a href="https://www.kali.org/tools/binwalk3/" target="_blank">kali</a></sup></p><p>查看：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>binwalk3</span><span> </span><span>xxx.bin</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>提取：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>binwalk3</span><span> </span><span>-Me</span><span> </span><span>xxx.bin</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>得到 squashfs</p></section></section><section><h2>仿真<a href="#仿真"><span>#</span></a></h2><section><h3>用户态仿真<a href="#用户态仿真"><span>#</span></a></h3><p>由于路由器往往使用 MIPS 或 ARM 架构，直接 chroot 会出现问题。</p><p>安装 <code>qemu-user</code> 包后可以直接 <code>chroot</code></p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>sudo</span><span> </span><span>apt</span><span> </span><span>install</span><span> </span><span>qemu-user</span></div></div></code></pre><div><div></div><div></div></div></figure></div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>sudo</span><span> </span><span>chroot</span><span> </span><span>./</span><span> </span><span>./bin/sh</span></div></div></code></pre><div><div></div><div></div></div></figure></div><div><div><div></div><div>Note</div></div><div><p>挂载前检查一下 <code>./bin/sh</code> 有没有执行权限位</p></div></div></section><section><h3>全系统仿真<a href="#全系统仿真"><span>#</span></a></h3><p>全系统仿真无需手动挂载文件系统。</p><section><h4>FirmAE<a href="#firmae"><span>#</span></a></h4><p><a href="https://github.com/pr0v3rbs/FirmAE" target="_blank">FirmAE</a> 本质是 QEMU 全系统仿真，但是替我们做了很多工作。</p><p>更换静态 <code>busybox</code>（FirmAE 会用系统的静态 busybox 替换进仿真环境）</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>sudo</span><span> </span><span>apt</span><span> </span><span>install</span><span> </span><span>busybox-static</span></div></div></code></pre><div><div></div><div></div></div></figure></div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>git</span><span> </span><span>clone</span><span> </span><span>--recursive</span><span> </span><span>https://github.com/pr0v3rbs/FirmAE.git</span></div></div><div><div><div>2</div></div><div><span>cd</span><span> </span><span>FirmAE</span></div></div><div><div><div>3</div></div><div><span>sudo</span><span> </span><span>./download.sh</span></div></div></code></pre><div><div></div><div></div></div></figure></div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>sudo</span><span> </span><span>./install.sh</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>安装时可能遇到：<code>Error: Package 'uml-utilities' has no installation candidate</code>，是因为 <a href="https://pkg.kali.org/pkg/uml-utilities" target="_blank">uml-utilities</a> 包已经被移出 Kali 仓库，</p><p>需要另行手动安装该包，否则后面网络模拟会卡住：（FirmAE 用到该包的 <code>tunctl</code>）</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span># 安装</span></div></div><div><div><div>2</div></div><div><span>从</span><span> </span><span>Debian</span><span> </span><span>仓库拉取</span><span> </span><span>deb</span><span> </span><span>包后手动安装</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 验证</span></div></div><div><div><div>5</div></div><div><span>apt</span><span> </span><span>list</span><span> </span><span>--installed</span><span> | </span><span>grep</span><span> </span><span>uml</span></div></div></code></pre><div><div></div><div></div></div></figure></div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>sudo</span><span> </span><span>./init.sh</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>检查：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>sudo</span><span> </span><span>./run.sh</span><span> </span><span>-c</span><span> </span><span>&lt;名字&gt;</span><span> </span><span>&lt;固件文件&gt;</span></div></div><div><div><div>2</div></div><div><span># 检查过程中日志在 ./scratch/1 下，模拟仿真性能损耗大，时间会比较长</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>如果检查通过，则可以运行仿真：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>sudo</span><span> </span><span>./run.sh</span><span> </span><span>-r</span><span> </span><span>&lt;名字&gt;</span><span> </span><span>&lt;固件文件&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>每次运行后都会挂载 loop 设备，会导致后续重新仿真失败，需要清除之前的挂载：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>lsblk</span></div></div><div><div><div>2</div></div><div><span>sudo</span><span> </span><span>umount</span><span> </span><span>&lt;挂载点&gt;</span></div></div><div><div><div>3</div></div><div><span>sudo</span><span> </span><span>losetup</span><span> </span><span>-d</span><span> </span><span>&lt;设备&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>FAT<a href="#fat"><span>#</span></a></h4><p><a href="https://github.com/attify/firmware-analysis-toolkit" target="_blank">FAT</a> 是另一个 IoT 仿真工具。</p></section><section><h4><code>qemu-system</code><a href="#qemu-system"><span>#</span></a></h4><p>手动 qemu 整机模拟，比较复杂，需要处理很多工作。</p></section></section><section><h3>NVRAM<a href="#nvram"><span>#</span></a></h3><p>Web 服务通常会读写 <code>/proc/nvram</code> 或 <code>/dev/nvram</code>，如果没有挂载或对应文件不存在，会导致无法正常启动 Web 服务。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>mount</span><span> </span><span>-t</span><span> </span><span>proc</span><span> </span><span>proc</span><span> </span><span>/proc</span></div></div><div><div><div>2</div></div><div><span>mount</span><span> </span><span>-t</span><span> </span><span>ramfs</span><span> </span><span>ramfs</span><span> </span><span>/var</span></div></div><div><div><div>3</div></div><div><span>/etc/init.d/S19init.sh</span></div></div><div><div><div>4</div></div><div><span>/etc/init.d/S20init.sh</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>FirmAE 会替我们处理好 NVRAM，但是用户态仿真需要手动处理。</p><ul>
<li><a href="https://github.com/firmadyne/libnvram" target="_blank">libnvram</a></li>
<li><a href="https://github.com/zcutlip/nvram-faker" target="_blank">nvram-faker</a></li>
</ul><p>其他常见方式：</p><ul>
<li><code>touch /proc/nvram</code></li>
</ul></section></section></section>
<section><h1>漏洞挖掘<a href="#漏洞挖掘"><span>#</span></a></h1><section><h2>Web Server<a href="#web-server"><span>#</span></a></h2><ul>
<li><code>uhttpd</code> OpenWRT 的默认 Web Server
<a href="https://openwrt.org/docs/guide-user/services/webserver/http.uhttpd" target="_blank">文档</a>
<a href="https://git.openwrt.org/project/uhttpd/" target="_blank">仓库</a></li>
<li><code>thttpd</code>
<a href="https://github.com/eantcal/thttpd" target="_blank">仓库</a></li>
<li><code>jhttpd</code>
<a href="https://github.com/bh1xdx/jhttpd" target="_blank">仓库</a></li>
</ul><section><h3>CGI<a href="#cgi"><span>#</span></a></h3><p><strong>CGI (Common Gateway Interface)</strong> 是一种能让 Web 服务器执行外部程序来处理 HTTP(S) 请求的<strong>接口标准</strong>。<sup><a href="#user-content-fn-cgi-wiki">4</a></sup></p><p>在路由器的漏洞挖掘中，我们经常会看到 CGI 关键词</p></section></section><section><h2>逆向工程<a href="#逆向工程"><span>#</span></a></h2><p><img alt="" loading="lazy" width="561" height="346" src="/_astro/IDA-information.5_Jz1-Z5_1FnW60.webp" /></p><p>内存映射</p><p><img alt="" loading="lazy" width="996" height="668" src="/_astro/IDA-and-Internet.-y55hjzT_1mH2Kj.webp" /></p><p>F5 反汇编</p><p><img alt="" loading="lazy" width="1229" height="730" src="/_astro/information2.BJ5H26m3_1Y5S3h.webp" /></p><p>使用 IDA 打开后会生成如下文件：</p><ul>
<li><code>.id0</code> 主数据库文件</li>
<li><code>.id1</code> 数据库文件</li>
<li><code>.id2</code> 数据库文件</li>
<li><code>.nam</code> 命名列表</li>
<li><code>.til </code> 类型信息库</li>
</ul><p><img alt="" loading="lazy" width="561" height="346" src="/_astro/IDA-information.5_Jz1-Z5_1FnW60.webp" /></p><p>导入后左侧的 <code>sub_xxx</code> 函数是因为 IDA 没有识别到原来的名字</p><p><img alt="" loading="lazy" width="426" height="352" src="/_astro/function-name.DZEV4EtG_1uw6xK.webp" /></p><p>所有紫色背景的函数均为 <code>.extern</code> 动态链接的。</p><p><img alt="" loading="lazy" width="452" height="272" src="/_astro/function-bold.Dk7lKDzy_Z2h924t.webp" /></p><p>加粗代表该函数有函数原型，例如标准库的 <code>sprintf</code>, <code>snprintf</code></p><p><img alt="" loading="lazy" width="613" height="170" src="/_astro/sprintf.BhgnwAOI_216pLx.webp" /></p><p>按下 X 查看所有 Xref (Cross Reference 交叉引用)：</p><ul>
<li>Xrefs To -&gt; 谁引用了我</li>
<li>Xrefs From -&gt; 我引用了谁</li>
</ul><hr /><section><h3>汇编<a href="#汇编"><span>#</span></a></h3><p>由于逆向工程通常使用 Intel 语法，这里统一使用 Intel 语法。</p><p>这里只列举 IoT 常见的架构</p><a href="/posts/mips-asm/"><div><div>MIPS 汇编</div><div><span>2026-08-29</span><span><span>#MIPS</span><span>#汇编</span></span></div></div></a><hr /></section></section></section>
<section><h1>References<a href="#references"><span>#</span></a></h1></section>
<section><h2>Footnotes<a href="#footnote-label"><span>#</span></a></h2>
<ol>
<li>
<p><a href="https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/include/uapi/linux/magic.h#n21" target="_blank">git.kernel.org - magic.h</a> <a href="#user-content-fnref-sfs-magic-kernel">↩</a></p>
</li>
<li>
<p><a href="https://www.file-extension.info/format/sfs#magic" target="_blank">File-Extension.info - SFS File</a> <a href="#user-content-fnref-sfs-magic">↩</a></p>
</li>
<li>
<p><a href="https://github.com/onekey-sec/unblob" target="_blank">Github - unblob</a> <a href="#user-content-fnref-unblob-github">↩</a> <a href="#user-content-fnref-unblob-github-2">↩<sup>2</sup></a> <a href="#user-content-fnref-unblob-github-3">↩<sup>3</sup></a> <a href="#user-content-fnref-unblob-github-4">↩<sup>4</sup></a></p>
</li>
<li>
<p><a href="https://en.wikipedia.org/wiki/Common_Gateway_Interface" target="_blank">Wikipedia - CGI</a> <a href="#user-content-fnref-cgi-wiki">↩</a></p>
</li>
</ol>
</section>]]></content>
    </entry>
    <entry>
      <id>https://nekoside.com/posts/fix-linux-chromium-middle-scroll/</id>
      <title type="text">解决 Linux 下 Chromium 系浏览器不能用中键滚动</title>
      <published>2026-08-30T00:00:00.000Z</published>
      <updated>2026-09-09T00:00:00.000Z</updated>
      <author><name>nekoside</name></author>
      <link rel="alternate" href="https://nekoside.com/posts/fix-linux-chromium-middle-scroll/"/>
      <summary type="text"></summary>
      <content type="html"><![CDATA[<section><h1>背景<a href="#背景"><span>#</span></a></h1><p>Linux 下 Chromium 系浏览器默认不能用中键滚动，而 Firefox 可以。</p></section>
<section><h1>解决方案<a href="#解决方案"><span>#</span></a></h1><div><div><div></div><div>Note</div></div><div><p>为了避免使用中键时不小心粘贴（如在 claude.ai 中使用中键滚动总是会触发粘贴操作），你可能还需要禁用中键粘贴。</p></div></div><section><h2>启用中键滚动<a href="#启用中键滚动"><span>#</span></a></h2><section><h3>普通 Chromium 系浏览器<a href="#普通-chromium-系浏览器"><span>#</span></a></h3><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>--enable-blink-features</span><span>=</span><span>MiddleClickAutoscroll</span><span> </span><span>--test-type</span></div></div></code></pre><div><div></div><div></div></div></figure></div><div><div><div></div><div>Note</div></div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>--test-type</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>用于关闭烦人的警告</p></div></div></section><section><h3>Brave / Brave Origin<a href="#brave--brave-origin"><span>#</span></a></h3><p>启用：</p><p><code>brave://flags/#middle-button-autoscroll</code></p></section><section><h3>Helium<a href="#helium"><span>#</span></a></h3><p>启用</p><p><code>helium://flags/#middle-click-autoscroll</code></p><div><div><div></div><div>Note</div></div><div><p>或使用 <code>HeliumMiddleClickAutoscroll</code> 而非 <code>MiddleClickAutoscroll</code></p></div></div></section></section><section><h2>禁用中键粘贴<a href="#禁用中键粘贴"><span>#</span></a></h2><section><h3>KDE<a href="#kde"><span>#</span></a></h3><p>系统设置 -&gt; 工作区 -&gt; 常规行为 -&gt; 取消选择“中键点击：粘贴选中的文本”，后重新启动计算机。</p></section></section></section>]]></content>
    </entry>
    <entry>
      <id>https://nekoside.com/posts/disable-hyper-v/</id>
      <title type="text">如何为 VMWare 禁用 Hyper-V</title>
      <published>2026-08-20T00:00:00.000Z</published>
      <updated>2026-09-05T00:00:00.000Z</updated>
      <author><name>nekoside</name></author>
      <link rel="alternate" href="https://nekoside.com/posts/disable-hyper-v/"/>
      <summary type="text"></summary>
      <content type="html"><![CDATA[<section><h1>前言<a href="#前言"><span>#</span></a></h1><hr /><p>要验证当前 Hyper-V 是否启用，有两个方法</p><section><h2>VMWare<a href="#vmware"><span>#</span></a></h2><p>这是最直接，也是我们最关心的方法，在虚拟机的 “Settings” -&gt; “Options” -&gt; “Advanced” -&gt; “Settings” 中，如果出现一个关于“侧通道缓解”的选项，证明当前 VMWare 和 Hyper-V 共存。</p></section><section><h2><code>msinfo32</code><a href="#msinfo32"><span>#</span></a></h2><p>Win + R 运行 <code>msinfo32</code>，滑到最下面，如果出现:“已检测到虚拟机监控程序…”，证明当前 Hyper-V 正在运行；</p><p>如果是若干个“Hyper-V - xxxx 是”的条目，则证明没有启用。</p></section></section>
<section><h1>禁用 Hyper-V<a href="#禁用-hyper-v"><span>#</span></a></h1><section><h2>1. 禁用内存完整性<a href="#1-禁用内存完整性"><span>#</span></a></h2><p>在“Windows 安全中心” -&gt; “设备安全性” -&gt; “内核隔离”中禁用“内存完整性”（需要重启生效，等会一并重启即可）</p></section><section><h2>2. 禁用 Credential Guard<a href="#2-禁用-credential-guard"><span>#</span></a></h2><p>两种方式二选一，如果你的系统支持组策略，建议优先通过组策略修改。</p><section><h3>组策略<a href="#组策略"><span>#</span></a></h3><p>Win + R 运行 <code>gpedit.msc</code> 或直接打开本地组策略，在“本地计算机策略” -&gt; “计算机配置” -&gt; “管理模板” -&gt; “系统” -&gt; “Device Guard” 中将“打开基于虚拟化的安全”策略设置为“已禁用”。</p></section><section><h3>注册表<a href="#注册表"><span>#</span></a></h3><p>如果你的系统不支持本地组策略，可以直接编辑注册表对应键。</p><p>“如果在未启用 UEFI Lock 且未组策略的情况下启用 Credential Guard，则编辑注册表项即可禁用它。”<sup><a href="#user-content-fn-credential-guard">1</a></sup></p><div><div><div></div><div>Warning</div></div><div><p>“删除这些注册表设置可能不会禁用 Credential Guard。 它们必须设置为值 0。”<sup><a href="#user-content-fn-credential-guard">1</a></sup></p></div></div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>密钥路径： HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa</span></div></div><div><div><div>2</div></div><div><span>密钥名称： LsaCfgFlags</span></div></div><div><div><div>3</div></div><div><span>类型： REG_DWORD</span></div></div><div><div><div>4</div></div><div><span>值： 0</span></div></div></code></pre><div><div></div><div></div></div></figure></div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>密钥路径： HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\DeviceGuard</span></div></div><div><div><div>2</div></div><div><span>密钥名称： LsaCfgFlags</span></div></div><div><div><div>3</div></div><div><span>类型： REG_DWORD</span></div></div><div><div><div>4</div></div><div><span>值： 0</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section><section><h2>3. <code>bcdedit</code> 显式关闭<a href="#3-bcdedit-显式关闭"><span>#</span></a></h2><p>打开管理员 Powershell 或 cmd，执行：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>bcdedit </span><span>/</span><span>set hypervisorlaunchtype off</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h2>4. 启用 CPU 的硬件虚拟化支持<a href="#4-启用-cpu-的硬件虚拟化支持"><span>#</span></a></h2><p>在 BIOS/UEFI 菜单中，启用对应的 CPU 虚拟化支持</p><ul>
<li>AMD: AMD-V</li>
<li>Intel: VT-x</li>
</ul><hr /><p><strong>重启计算机</strong></p><div><div><div></div><div>Note</div></div><div><p>考虑到你的“关机”可能不是真正的“关机”，请直接选择“重启”</p></div></div></section></section>
<section><h1>检验<a href="#检验"><span>#</span></a></h1><p>现在 VMWare 的虚拟机设置中，刚刚的“侧通道缓解”选项应当消失，且 <code>msinfo32</code> 的结果也有所不同。</p></section>
<section><h1>References<a href="#references"><span>#</span></a></h1><ul>
<li><a href="https://learn.microsoft.com/zh-cn/troubleshoot/windows-client/application-management/virtualization-apps-not-work-with-hyper-v" target="_blank">Microsoft Learn - 虚拟化应用程序不能与 Hyper-V 和基于 Hyper-V 的功能协同工作</a></li>
<li><a href="https://linux.do/t/topic/104340/18" target="_blank">Linux Do</a></li>
</ul></section>
<section><h2>Footnotes<a href="#footnote-label"><span>#</span></a></h2>
<ol>
<li>
<p><a href="https://learn.microsoft.com/zh-cn/windows/security/identity-protection/credential-guard/configure?tabs=intune#disable-credential-guard" target="_blank">Microsoft Learn - 配置 Credential Guard</a> <a href="#user-content-fnref-credential-guard">↩</a> <a href="#user-content-fnref-credential-guard-2">↩<sup>2</sup></a></p>
</li>
</ol>
</section>]]></content>
    </entry>
    <entry>
      <id>https://nekoside.com/posts/arch-install/</id>
      <title type="text">Arch Linux 安装</title>
      <published>2026-08-05T00:00:00.000Z</published>
      <updated>2026-09-25T00:00:00.000Z</updated>
      <author><name>nekoside</name></author>
      <link rel="alternate" href="https://nekoside.com/posts/arch-install/"/>
      <summary type="text"></summary>
      <content type="html"><![CDATA[<div><div><div></div><div>Warning</div></div><div><p>由于 Arch Linux 更新频繁，请注意本文的更新时间。</p><p>如果你阅读时本文已经过时，请参考下列资源：</p><ul>
<li><a href="https://archlinux.org/news/" target="_blank">ArchLinux News</a></li>
<li><a href="https://wiki.archlinux.org/title/Main_page" target="_blank">ArchLinux Wiki</a></li>
<li><a href="https://archlinux.org/packages/" target="_blank">ArchLinux Packages</a></li>
</ul></div></div>
<section><h1>太长不看 (TL;DR)<a href="#太长不看-tldr"><span>#</span></a></h1><ul>
<li><code>lsblk</code></li>
<li><code>cfdisk</code></li>
<li><code>mkfs</code></li>
<li><code>mount</code></li>
<li><code>pacstrap</code>
<ul>
<li><code>linux</code> 内核</li>
<li><code>linux-firmware</code> 包含很多驱动，例如小螃蟹、Intel 无线网卡驱动</li>
<li><code>networkmanager</code> 网络前端，提供 <code>nmcli</code> 和 <code>nmtui</code></li>
</ul>
</li>
<li><code>arch-chroot</code></li>
<li><code>grub-install</code></li>
<li><code>grub-mkconfig</code></li>
<li><code>genfstab</code></li>
<li>按需安装如 <code>plasma-meta</code>, <code>nvidia-open</code></li>
</ul><hr /><p>也许下面的内容全都是废话（如果你能熟练地安装 ArchLinux）。倘若真的需要帮助，我大概率会看 <a href="https://wiki.archlinux.org/" target="_blank">ArchWiki</a> 或者用 <a href="http://duckduckgo.com/" target="_blank">Duckduckgo</a> 搜索我的问题。</p><p>这篇文章产生的原因是我多次在安装完成后忘记修改 root 密码，或是忘记安装 <code>linux-firmware</code>，又或是没有更新 <code>/etc/fstab</code>，所以写了上面的“TL;DR”给自己看。</p><p>但是只写这些可能无法帮助到正在阅读的你，索性我就写了较为详细的安装过程。</p></section>
<section><h1>介绍<a href="#介绍"><span>#</span></a></h1><p>众所周知，<strong>Arch Linux</strong><sup><a href="#user-content-fn-arch">1</a></sup> 是最<strong>激进</strong>的 Linux 发行版之一，其收录的软件包又<strong>多</strong>又<strong>新</strong>。</p><p>以 <a href="https://github.com/Gobidev/pfetch-rs" target="_blank">pfetch-rs</a> 为例，隐藏掉 OpenBSD、FreeBSD、Homebrew 和第三方仓库后，可以看到只有 Arch Linux、Void Linux 和 Alpine 收录了该包。</p><div><div><div></div><div>叠甲</div></div><div><p>只是随便拿一个比较小众的开源工具举例子，<strong>非引战</strong>目的，也不是精心设计。</p></div></div><p><img alt="" loading="lazy" width="1993" height="1204" src="/_astro/pkg-pfetch.0ZstepeL_ZyRKXp.webp" /></p><p>然而由于其滚动更新的特点，相比 Debian、CentOS 等发行版，Arch Linux 也更加不稳定。</p><p>因此你几乎看不到有服务器使用 Arch Linux。</p><div><div><div></div><div>Note</div></div><div><p>Arch Linux 自己的服务器确实使用 Arch Linux。</p></div></div></section>
<section><h1>详细过程<a href="#详细过程"><span>#</span></a></h1><div><div><div></div><div>Note</div></div><div><p>如果硬盘空间太小，会导致 <code>pacman -F</code> 崩溃，原因是 <code>pacman -F</code> 会使用 <code>/tmp</code>，而 <code>/tmp</code> 在 ArchISO 默认使用内存。</p></div></div><section><h2>网络<a href="#网络"><span>#</span></a></h2><p>Arch Linux 的安装需要网络，所以安装的第一步是联网。</p><p>如果你使用虚拟机，也许不需要任何配置，检查：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>ip</span><span> </span><span>a</span></div></div></code></pre><div><div></div><div></div></div></figure></div><section><h3>有线网络<a href="#有线网络"><span>#</span></a></h3></section><section><h3>无线网络<a href="#无线网络"><span>#</span></a></h3><p>ArchISO 内置了 <code>iwd</code> 包，所以我们可以使用 <code>iwctl</code> 连接无线网络。</p><p>解除对无线网卡的锁定：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>rfkill</span><span> </span><span>list</span></div></div></code></pre><div><div></div><div></div></div></figure></div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>rfkill</span><span> </span><span>unblock</span><span> </span><span>&lt;无线网卡编号&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>进入 iwctl：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>iwctl</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>列出无线网卡：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>device</span><span> </span><span>list</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>扫描无线网络：</p></section></section><section><h2>分区<a href="#分区"><span>#</span></a></h2></section><section><h2>加密<a href="#加密"><span>#</span></a></h2></section><section><h2>内核 (Kernel)<a href="#内核-kernel"><span>#</span></a></h2><p>当然你也可以自己编译内核（</p><section><h3>Arch 官方内核<a href="#arch-官方内核"><span>#</span></a></h3><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>pacman</span><span> </span><span>-S</span><span> </span><span>linux</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>LTS 内核<a href="#lts-内核"><span>#</span></a></h3><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>pacman</span><span> </span><span>-S</span><span> </span><span>linux-lts</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>CachyOS 内核<a href="#cachyos-内核"><span>#</span></a></h3><hr /></section></section><section><h2>Boot Loader<a href="#boot-loader"><span>#</span></a></h2><p>本文假定你是 UEFI 引导方式。</p><section><h3>GRUB<a href="#grub"><span>#</span></a></h3><p>安装 GRUB：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>pacman</span><span> </span><span>-S</span><span> </span><span>grub</span><span> </span><span>efibootmgr</span></div></div></code></pre><div><div></div><div></div></div></figure></div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>grub-install</span><span> </span><span>--bootloader-id</span><span> </span><span>GRUB</span><span> </span><span>--target</span><span> </span><span>x86_64-efi</span><span> </span><span>--efi-directory</span><span> </span><span>/boot/efi</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>如果你需要多系统引导：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>pacman</span><span> </span><span>-S</span><span> </span><span>os-prober</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>编辑 <code>/etc/default/grub</code>，找到 <code>#GRUB_DISABLE_OS_PROBER=false</code>，去掉注释。</p><p>更新 GRUB 引导条目：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>grub-mkconfig</span><span> </span><span>-o</span><span> </span><span>/boot/grub/grub.cfg</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>systemd-boot<a href="#systemd-boot"><span>#</span></a></h3><p><a href="https://wiki.archlinux.org/title/Systemd-boot" target="_blank">ArchWiki</a></p><p>如果你在找一个比 GRUB 更轻量、更 <a href="https://en.wikipedia.org/wiki/KISS_principle" target="_blank">KISS</a> 的 BL，可以看看 systemd-boot。</p><hr /></section></section><section><h2>Display Manager / Login Manager<a href="#display-manager--login-manager"><span>#</span></a></h2><section><h3>SDDM<a href="#sddm"><span>#</span></a></h3></section><section><h3>PLM (Plasma Login Manager)<a href="#plm-plasma-login-manager"><span>#</span></a></h3></section><section><h3>GDM<a href="#gdm"><span>#</span></a></h3></section><section><h3>LightDM<a href="#lightdm"><span>#</span></a></h3><hr /></section></section><section><h2>驱动程序<a href="#驱动程序"><span>#</span></a></h2><section><h3>网卡<a href="#网卡"><span>#</span></a></h3><p>常见的无线网卡驱动程序包含在 <a href="https://archlinux.org/packages/core/any/linux-firmware/" target="_blank">linux-firmware</a> 元包中。</p><p>如果你希望单独安装：</p><ul>
<li>联发科 <a href="https://archlinux.org/packages/core/any/linux-firmware-mediatek/" target="_blank">linux-firmware-mediatek</a></li>
<li>瑞昱 <a href="https://archlinux.org/packages/core/any/linux-firmware-realtek/" target="_blank">linux-firmware-realtek</a></li>
</ul></section><section><h3>显卡<a href="#显卡"><span>#</span></a></h3><section><h4>AMD<a href="#amd"><span>#</span></a></h4><p>AMD 显卡驱动 <a href="https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/gpu/drm/amd?h=v7.2" target="_blank">amdgpu</a> 包含在内核树中，无需单独安装。</p><p>安装 Vulkan 驱动：<code>vulkan-radeon</code>（不装的话 Zed 等应用无法使用 A 卡的 Vulkan，可能回退到独显）</p></section><section><h4>Intel<a href="#intel"><span>#</span></a></h4><p>安装 Vulkan 驱动：<code>vulkan-intel</code></p></section><section><h4>NVIDIA<a href="#nvidia"><span>#</span></a></h4><p>NVIDIA 开源显卡驱动 <a href="https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/gpu/drm/nouveau?h=v7.2" target="_blank">nouveau</a> 也包含在内核树中。
如果你需要更好的性能和兼容，可以安装 NVIDIA 私有驱动 <a href="https://archlinux.org/packages/extra/x86_64/nvidia-open/" target="_blank">nvidia-open</a>。</p><p><code>nvidia-open</code> 会自动拉取 <code>nvidia-utils</code>，后者包含了 Vulkan 实现，所以只需要安装一个 <code>nvidia-open</code> 包既可。</p><hr /></section></section></section><section><h2>桌面环境 (Desktop Environment)<a href="#桌面环境-desktop-environment"><span>#</span></a></h2><section><h3>KDE Plasma<a href="#kde-plasma"><span>#</span></a></h3><ul>
<li><code>plasma</code></li>
<li><code>plasma-desktop</code></li>
<li><code>plasma-meta</code></li>
</ul><hr /></section></section></section>
<section><h1>配置<a href="#配置"><span>#</span></a></h1><section><h2>dotfiles<a href="#dotfiles"><span>#</span></a></h2><p>个人推荐使用 <a href="https://www.chezmoi.io/" target="_blank">chezmoi</a> 管理 dotfiles：</p><a href="https://github.com/twpayne/chezmoi" target="_blank"><div><div><div><div></div><div>twpayne</div></div><div>/</div><div>chezmoi</div></div><div></div></div><div>Manage your dotfiles across multiple diverse machines, securely.</div><div><div>—</div><div>—</div><div>MIT</div><span>Go</span></div></a><hr /></section></section>
<section><h1>References<a href="#references"><span>#</span></a></h1></section>
<section><h2>Footnotes<a href="#footnote-label"><span>#</span></a></h2>
<ol>
<li>
<p><a href="https://archlinux.org/" target="_blank">Arch Linux</a> <a href="#user-content-fnref-arch">↩</a></p>
</li>
</ol>
</section>]]></content>
    </entry>
    <entry>
      <id>https://nekoside.com/posts/asm-x86/</id>
      <title type="text">x86 与 x64 汇编入门</title>
      <published>2026-07-16T00:00:00.000Z</published>
      <updated>2026-07-21T00:00:00.000Z</updated>
      <author><name>nekoside</name></author>
      <link rel="alternate" href="https://nekoside.com/posts/asm-x86/"/>
      <summary type="text"></summary>
      <content type="html"><![CDATA[<section><h1>介绍<a href="#介绍"><span>#</span></a></h1><section><h2>概念<a href="#概念"><span>#</span></a></h2><p>x86 是一种 CPU 指令集架构（ISA），定义了一套指令集（Instruction Set）。<sup><a href="#user-content-fn-isa">1</a></sup></p><p><a href="https://en.wikipedia.org/wiki/X86_assembly_language" target="_blank">x86 汇编</a>是这套指令集的指令的人类可读表示。一条汇编语句通常对应一条机器码。<sup><a href="#user-content-fn-asm">2</a></sup></p></section><section><h2>语法<a href="#语法"><span>#</span></a></h2><section><h3>类别<a href="#类别"><span>#</span></a></h3><p><a href="https://en.wikipedia.org/wiki/X86_assembly_language#Syntax" target="_blank">x86 汇编语法</a>通常有两种：</p><ul>
<li>AT&amp;T</li>
<li>Intel</li>
</ul><div><div><div></div><div>Note</div></div><div><p>本文使用 AT&amp;T 语法</p></div></div><p>我们的 CPU 只关心机器码，但是不同的汇编器仅支持特定的语法（类似 Assembler 和 Compiler 的关系）。</p><p>常见的三种汇编器：</p><ul>
<li><a href="https://en.wikipedia.org/wiki/GNU_Assembler" target="_blank">GNU Assembler</a> (GAS) <code>as</code> -&gt; AT&amp;T 语法
<ul>
<li>scoop: <code>gcc</code></li>
</ul>
</li>
<li><a href="https://en.wikipedia.org/wiki/Netwide_Assembler" target="_blank">Netwide Assembler</a> (NASM) -&gt; Intel 语法
<ul>
<li>scoop: <code>nasm</code></li>
</ul>
</li>
<li><a href="https://en.wikipedia.org/wiki/Microsoft_Macro_Assembler" target="_blank">Microsoft Macro Assembler</a> (MASM) -&gt; Intel 语法</li>
</ul><p>语法不能够混用，例如使用 NASM 去汇编一个 AT&amp;T 语法的汇编文件会遇到诸如“error: instruction expected”的报错。</p></section><section><h3>特点<a href="#特点"><span>#</span></a></h3><ul>
<li>换行严格（毕竟没有分号之类的东西），一行就是一条语句</li>
<li>空格、缩进宽松。有没有都可以；用哪个都可以</li>
</ul></section></section></section>
<section><h1>结构<a href="#结构"><span>#</span></a></h1><p>将</p><div><figure><figcaption><span>test.c</span></figcaption><pre><code><div><div><div>1</div></div><div><span>int</span><span> </span><span>main</span><span>() {</span></div></div><div><div><div>2</div></div><div><span>    </span><span>return</span><span> </span><span>0</span></div></div><div><div><div>3</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>使用 <code>gcc -S -O0 -fno-asynchronous-unwind-tables -fno-ident</code> 编译可得如下汇编代码：</p><div><figure><figcaption><span>test.s</span></figcaption><pre><code><div><div><div>1</div></div><div><span><span>  </span></span><span>.file  "</span><span>test</span><span>.c"</span></div></div><div><div><div>2</div></div><div><span>  </span><span>.text</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>.globl  main</span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>.type  main, @function</span></div></div><div><div><div>5</div></div><div><span>main:</span></div></div><div><div><div>6</div></div><div><span><span>  </span></span><span>pushq  %</span><span>rbp</span></div></div><div><div><div>7</div></div><div><span><span>  </span></span><span>movq</span><span>  %</span><span>rsp</span><span>, %</span><span>rbp</span></div></div><div><div><div>8</div></div><div><span><span>  </span></span><span>movl  </span><span>$0</span><span>, %</span><span>eax</span></div></div><div><div><div>9</div></div><div><span><span>  </span></span><span>popq  %</span><span>rbp</span></div></div><div><div><div>10</div></div><div><span><span>  </span></span><span>ret</span></div></div><div><div><div>11</div></div><div><span><span>  </span></span><span>.size  main, .-main</span></div></div><div><div><div>12</div></div><div><span><span>  </span></span><span>.section  .note.GNU-stack,"",@progbits</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>删除其中的无用信息得到：</p><div><figure><figcaption><span>test.s</span></figcaption><pre><code><div><div><div>1</div></div><div><span><span>  </span></span><span>.globl  main</span></div></div><div><div><div>2</div></div><div><span>main:</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>movl  </span><span>$0</span><span>, %</span><span>eax</span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>ret</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>观察上述汇编代码，可以发现有三种语句：</p><ul>
<li>指令：<code>movl $0, %eax</code>, <code>ret</code> 等，其中 <code>movl</code>, <code>ret</code> 称为指令助记符 (Instruction Mnemonic) 或助记符。</li>
<li>伪指令 (directive)：<code>.file</code>, <code>.text</code>, <code>.size</code>，以 <code>.</code> 开头。</li>
<li>标签：<code>main:</code>，对应 C 的 <code>goto</code>。</li>
</ul><p>以及：</p><ul>
<li>立即数：<code>$0</code></li>
<li>寄存器：<code>%eax</code>，<code>%rbp</code> 等</li>
</ul><p>将精简后的代码进行汇编：</p><p><code>as test.s -o test.o</code></p><p>可得到对应目标文件</p><blockquote><p><code>file test.o</code></p><p>test.o: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped</p></blockquote><div><div><div></div><div>Note</div></div><div><blockquote><p>不涉及物理地址的低级代码称为<strong>可重定位的 (relocatable)</strong>。<sup><a href="#user-content-fn-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%B3%BB%E7%BB%9F%E8%A6%81%E7%B4%A0">3</a></sup><sup>45</sup></p></blockquote></div></div><p>汇编得到的目标文件无法执行，还需要进行链接：</p><p><code>gcc test.o -o test</code></p><p>但由于程序真正的入口点是 <code>_start</code>，上述操作本质上 gcc 帮我们封装了一层，用 <code>_start</code> 调用我们写的 <code>main</code>。</p><p>下面绕过 C 标准库，将 <code>main</code> 改写为 <code>_start</code>：</p><div><figure><figcaption><span>test.s</span></figcaption><pre><code><div><div><div>1</div></div><div><span><span>  </span></span><span>.globl  _start</span></div></div><div><div><div>2</div></div><div><span>_start:</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>movl  </span><span>$60</span><span>, %</span><span>eax</span><span> # 指定操作为退出</span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>movl  </span><span>$0</span><span>, %</span><span>edi</span><span> # 指定退出码为 0</span></div></div><div><div><div>5</div></div><div><span><span>  </span></span><span>syscall</span></div></div></code></pre><div><div></div><div></div></div></figure></div><div><div><div></div><div>Note</div></div><div><p>注释：</p><ul>
<li>AT&amp;T -&gt; <code>#</code></li>
<li>Intel -&gt; <code>;</code></li>
<li>部分汇编器支持 C 风格注释 -&gt; <code>//</code></li>
</ul></div></div><p><code>ld test.o -o test</code></p><p>执行：</p><p><code>./test</code></p><section><h2>指令<a href="#指令"><span>#</span></a></h2><p>x86 汇编基础的助记符有几十个。</p><p><u>在 AT&amp;T 中</u>，助记符的后缀：</p><ul>
<li><code>q</code> 代表 64 位，如 <code>movq</code></li>
<li><code>l</code> 代表 32 位，如 <code>movl</code></li>
</ul><p>具体如下：</p>

<table><thead><tr><th>后缀</th><th>全称</th><th>宽度/字节</th></tr></thead><tbody><tr><td>b</td><td>byte</td><td>8</td></tr><tr><td>w</td><td>word</td><td>16</td></tr><tr><td>l</td><td>long</td><td>32</td></tr><tr><td>q</td><td>quad</td><td>64</td></tr></tbody></table><p>AT&amp;T 中，指令的操作数顺序：<code>OP src, dest</code></p><p>例如：<code>movl $0, %eax</code> 将 0 放入 eax 寄存器</p><p>其中，<code>$0</code> 和 <code>%eax</code> 分别为这条指令的两个操作数。</p><p>操作数又可以分为：</p><ul>
<li>
<p>直接操作数</p>
<ul>
<li>立即数</li>
</ul>
<p>如 <code>$0</code></p>
<ul>
<li>寄存器操作数</li>
</ul>
<p>如 <code>%eax</code></p>
</li>
<li>
<p>间接操作数</p>
</li>
</ul><p>如 <code>(%rbx)</code></p><section><h3>数据传送<a href="#数据传送"><span>#</span></a></h3><section><h4><code>mov</code><a href="#mov"><span>#</span></a></h4></section></section><section><h3>算数<a href="#算数"><span>#</span></a></h3><section><h4><code>add</code><a href="#add"><span>#</span></a></h4></section><section><h4><code>mul</code><a href="#mul"><span>#</span></a></h4></section></section><section><h3>堆栈<a href="#堆栈"><span>#</span></a></h3><section><h4><code>push</code><a href="#push"><span>#</span></a></h4></section><section><h4><code>pop</code><a href="#pop"><span>#</span></a></h4></section></section><section><h3>其他指令<a href="#其他指令"><span>#</span></a></h3><section><h4><code>lea</code><a href="#lea"><span>#</span></a></h4><p><code>lea</code> 返回间接操作数的地址。<sup><a href="#user-content-fn-%E6%B1%87%E7%BC%96%E8%AF%AD%E8%A8%80">4</a></sup><sup>248</sup></p></section></section></section><section><h2>伪指令<a href="#伪指令"><span>#</span></a></h2><blockquote><p>默认情况下，伪指令不区分大小写。<sup><a href="#user-content-fn-%E6%B1%87%E7%BC%96%E8%AF%AD%E8%A8%80">4</a></sup><sup>45</sup></p></blockquote><section><h4><code>.file</code><a href="#file"><span>#</span></a></h4><p>文件元信息</p></section><section><h4><code>.globl</code><a href="#globl"><span>#</span></a></h4></section><section><h4><code>.type</code><a href="#type"><span>#</span></a></h4><p>类型标注，告诉编译工具这个符号是什么类型，如 <code>.type main, @function</code> 描述 <code>main</code> 为一个函数。</p><p>只是描述性信息，多数情况下可以删除。</p></section><section><h4><code>.size</code><a href="#size"><span>#</span></a></h4><p>大小标注</p></section><section><h4><code>.ident</code><a href="#ident"><span>#</span></a></h4><p>编译器版本标注</p></section></section></section>
<section><h1><a href="https://en.wikipedia.org/wiki/Processor_register" target="_blank">寄存器</a><a href="#寄存器"><span>#</span></a></h1><section><h2>通用目的寄存器<a href="#通用目的寄存器"><span>#</span></a></h2><p><strong>G</strong>eneral-<strong>P</strong>urpose <strong>R</strong>egister<strong>s</strong> (GPRs)</p><div><div><div></div><div>Note</div></div><div><p>rax 是完整的 64 位寄存器，eax 是其低 32 位寄存器，ax 是其低 16 位寄存器，</p><p>ah 是其 8-15 位寄存器，al 是其低 8 位寄存器。</p><p>后面不再赘述。</p></div></div><ul>
<li>
<p>rax</p>
</li>
<li>
<p>rbx</p>
</li>
<li>
<p>rbp -&gt; 基址指针 (<strong>B</strong>ase <strong>P</strong>ointer)</p>
</li>
<li>
<p>rsp -&gt; 栈指针 (<strong>S</strong>tack <strong>P</strong>ointer)</p>
</li>
<li>
<p>rdi -&gt; (<strong>D</strong>estination <strong>I</strong>ndex)</p>
</li>
</ul></section><section><h2>其他寄存器<a href="#其他寄存器"><span>#</span></a></h2><ul>
<li>rip -&gt; 指令指针 (<strong>I</strong>nstruction <strong>P</strong>ointer)，即程序计数器 PC</li>
</ul></section></section>
<section><h1>段<a href="#段"><span>#</span></a></h1><p>段声明表示从下面的内容开始，一直到下一个段声明，中间的内容都归入该段。</p><p><code>.section</code> 用于声明段，例如：</p><p><code>.section .text</code> 声明一个代码段，通常简写为 <code>.text</code>。</p><section><h2>代码段<a href="#代码段"><span>#</span></a></h2><p>在 AT&amp;T 中代码段为 <code>.text</code>，在 Intel 风格中为 <code>.code</code>。</p></section><section><h2>只读数据段<a href="#只读数据段"><span>#</span></a></h2><p><code>.rodata</code>，最常见的用途为字符串常量存储。</p></section><section><h2>未初始化数据段<a href="#未初始化数据段"><span>#</span></a></h2><p>通常用 <code>.bss</code> 表示。</p><div><div><div></div><div>Note</div></div><div><p>起始于 IBM 704 汇编中“块存储开始 (Block Storage Start)”首字母缩写。<sup><a href="#user-content-fn-csapp">5</a></sup><sup>468</sup></p></div></div></section></section>
<section><h1>约定<a href="#约定"><span>#</span></a></h1><section><h2>返回值<a href="#返回值"><span>#</span></a></h2><div><div><div></div><div>Note</div></div><div><p>程序真正的入口是 <code>_start</code> 而非 <code>main</code>：</p><ol>
<li><code>_start</code> 调用 <code>main</code></li>
<li><code>main</code> 将返回值 0 写入 <code>%eax</code></li>
<li><code>main</code> <code>ret</code> 返回</li>
<li><code>_start</code> 从 <code>%eax</code> 拿到返回值</li>
</ol></div></div><ul>
<li>整数、指针 -&gt; <code>%rax</code></li>
</ul></section><section><h2>参数<a href="#参数"><span>#</span></a></h2><p><sup><a href="#user-content-fn-x64-abi">6</a></sup><sup>26</sup></p><ul>
<li>第一个参数 -&gt; <code>%rdi</code></li>
<li>第二个参数 -&gt; <code>%rsi</code></li>
<li>第三个参数 -&gt; <code>%rdx</code></li>
<li>第四个参数 -&gt; <code>%rcx</code></li>
<li>第五个参数 -&gt; <code>%r8</code></li>
<li>第六个参数 -&gt; <code>%r9</code></li>
</ul></section></section>
<section><h1>编写程序<a href="#编写程序"><span>#</span></a></h1><section><h2>系统调用<a href="#系统调用"><span>#</span></a></h2><p>系统调用是内核提供的接口，我们可以通过汇编直接调用系统调用而不经过任何高级封装。</p><blockquote><p>在 x86 下，系统调用由 0x80 中断完成，各个通用寄存器用于传递参数，EAX 寄存器用于表示系统调用的接口号。<sup><a href="#user-content-fn-%E7%A8%8B%E5%BA%8F%E5%91%98%E7%9A%84%E8%87%AA%E6%88%91%E4%BF%AE%E5%85%BB">7</a></sup><sup>385</sup></p></blockquote><p>现代的 x64 架构提供了专门的系统调用指令，分别用于从用户态到内核态、从内核态返回用户态，以下是支持情况：</p>

<table><thead><tr><th>指令</th><th>AMD Legacy</th><th>AMD Compat</th><th>AMD 64位</th><th>Intel Legacy</th><th>Intel Compat</th><th>Intel 64位</th></tr></thead><tbody><tr><td><code>syscall</code><sup><a href="#user-content-fn-apm">8</a></sup><sup>174</sup><sup><a href="#user-content-fn-sdm">9</a></sup><sup>698</sup></td><td>✅</td><td>✅</td><td>✅</td><td>❌</td><td>❌</td><td>✅</td></tr><tr><td><code>sysret</code><sup><a href="#user-content-fn-apm">8</a></sup><sup>174</sup><sup><a href="#user-content-fn-sdm">9</a></sup><sup>708</sup></td><td>✅</td><td>✅</td><td>✅</td><td>❌</td><td>❌</td><td>✅</td></tr><tr><td><code>sysenter</code><sup><a href="#user-content-fn-apm">8</a></sup><sup>176</sup><sup><a href="#user-content-fn-sdm">9</a></sup><sup>701</sup></td><td>✅</td><td>❌ (#UD)</td><td>❌ (#UD)</td><td>✅</td><td>✅</td><td>✅</td></tr><tr><td><code>sysexit</code><sup><a href="#user-content-fn-apm">8</a></sup><sup>176</sup><sup><a href="#user-content-fn-sdm">9</a></sup><sup>705</sup></td><td>✅</td><td>❌ (#UD)</td><td>❌ (#UD)</td><td>✅</td><td>✅</td><td>✅</td></tr></tbody></table><p>以 Linux 7.1 为例，系统调用号写在 <a href="https://github.com/torvalds/linux/blob/v7.1/arch/x86/entry/syscalls/syscall_64.tbl" target="_blank"><code>arch/x86/entry/syscalls/syscall_64.tbl</code></a> 中，具体的函数原型在各自的内核源码中。</p><p>编写汇编时要查看系统调用的参数等信息，可以查阅<a href="https://x64.syscall.sh/" target="_blank">该网站</a>。</p><div><div><div></div><div>Note</div></div><div><p>要在 C/C++ 中调用系统调用，可以包含头文件 <code>unistd.h</code></p><p>要查阅系统调用信息，可以直接查看 man 手册：<code>man 2 read</code></p></div></div><p>目前有五百多个，这里列出几个常见的：</p>

<table><thead><tr><th>系统调用号</th><th>系统调用</th></tr></thead><tbody><tr><td>0</td><td>read</td></tr><tr><td>1</td><td>write</td></tr><tr><td>2</td><td>open</td></tr><tr><td>3</td><td>close</td></tr><tr><td>57</td><td>fork</td></tr><tr><td>60</td><td>exit</td></tr></tbody></table><p>调用一个系统调用：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>    </span></span><span>movq</span><span>    </span><span>$系统调用号</span><span>, %</span><span>rax</span></div></div><div><div><div>2</div></div><div><span><span>    </span></span><span>movq</span><span>    </span><span>$第一个参数</span><span>, %</span><span>rdi</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>movq</span><span>    </span><span>$第二个参数</span><span>, %</span><span>rsi</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>...</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>syscall</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h2>Hello World<a href="#hello-world"><span>#</span></a></h2><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>    </span></span><span>.</span><span>section    .rodata</span></div></div><div><div><div>2</div></div><div><span>.</span><span>LC0:</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>.ascii    "Hello World!\n"</span></div></div><div><div><div>4</div></div><div><span>len = . - .LC0</span></div></div><div><div><div>5</div></div><div><span>    </span><span>.text</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>.globl    _start</span></div></div><div><div><div>7</div></div><div><span>_start:</span></div></div><div><div><div>8</div></div><div><span><span>    </span></span><span>movq</span><span>    </span><span>$1</span><span>, %</span><span>rax</span><span> # write</span></div></div><div><div><div>9</div></div><div><span><span>    </span></span><span>movq</span><span>    </span><span>$1</span><span>, %</span><span>rdi</span><span> # 文件描述符 fd</span></div></div><div><div><div>10</div></div><div><span><span>    </span></span><span>leaq    .LC0(%</span><span>rip</span><span>), %</span><span>rsi</span><span> # buffer</span></div></div><div><div><div>11</div></div><div><span><span>    </span></span><span>movq</span><span>    </span><span>$len</span><span>, %</span><span>rdx</span><span> # count</span></div></div><div><div><div>12</div></div><div><span><span>    </span></span><span>syscall</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span><span>    </span></span><span>movq</span><span>    </span><span>$60</span><span>, %</span><span>rax</span><span> # exit</span></div></div><div><div><div>15</div></div><div><span><span>    </span></span><span>movq</span><span>    </span><span>$0</span><span>, %</span><span>rdi</span><span> # exit code</span></div></div><div><div><div>16</div></div><div><span><span>    </span></span><span>syscall</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section></section>
<section><h1>反汇编<a href="#反汇编"><span>#</span></a></h1><section><h2>十六进制<a href="#十六进制"><span>#</span></a></h2><p>对于程序：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>    </span></span><span>.globl _start</span></div></div><div><div><div>2</div></div><div><span>_start:</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>movl    </span><span>$60</span><span>, %</span><span>eax</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>movl    </span><span>$0</span><span>, %</span><span>edi</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>syscall</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>编译后要查看其十六进制形式，有如下工具：</p><ul>
<li>xxd -&gt; vim 包提供</li>
<li>hexdump -&gt; util-linux 包提供</li>
<li><a href="https://en.wikipedia.org/wiki/Od_(Unix)" target="_blank">od</a> -&gt; Unix，coreutils 包提供</li>
<li><a href="https://github.com/sharkdp/hexyl" target="_blank">hexyl</a> -&gt; 现代工具，需要从 ArchLinux 官方仓库安装</li>
</ul></section><section><h2>汇编<a href="#汇编"><span>#</span></a></h2><p>要查看其汇编码，需要进行反汇编。</p><section><h3>objdump<a href="#objdump"><span>#</span></a></h3><p><code>objdump -d test</code></p><p>输出：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>test</span><span>：     文件格式 elf64-x86-</span></span><span>64</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>Disassembly of </span><span>section .text</span><span>:</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>0000000000401000</span><span> &lt;_start&gt;:</span></div></div><div><div><div>7</div></div><div><span>  </span><span>401000</span><span>:  b8 3c </span><span>00</span><span> </span><span>00</span><span> </span><span>00</span><span><span>         </span><span>mov</span><span>    </span><span>$0x3c</span><span>,%</span></span><span>eax</span></div></div><div><div><div>8</div></div><div><span>  </span><span>401005</span><span>:  bf </span><span>00</span><span> </span><span>00</span><span> </span><span>00</span><span> </span><span>00</span><span><span>         </span><span>mov</span><span>    </span><span>$0x0</span><span>,%</span></span><span>edi</span></div></div><div><div><div>9</div></div><div><span>  </span><span>40100a:</span><span>  0f </span><span>05</span><span><span>                  </span><span>syscall</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>radare2<a href="#radare2"><span>#</span></a></h3><p>现代的 CLI 逆向工具 <a href="https://github.com/radareorg/radare2" target="_blank">radare2</a>。</p><p>进入交互式 shell：</p><p><code>r2 -A test</code></p><p><code>pdf</code></p><div><div><div></div><div>Note</div></div><div><p>r2 默认显示 Intel 风格，要切换为 AT&amp;T：<code>e asm.syntax=att</code>（该命令仅在当前会话生效）。</p></div></div></section></section></section>
<section><h1>References<a href="#references"><span>#</span></a></h1></section>
<section><h2>Footnotes<a href="#footnote-label"><span>#</span></a></h2>
<ol>
<li>
<p><a href="https://en.wikipedia.org/wiki/Instruction_set_architecture#Overview" target="_blank">Instruction set architecture - Wikipedia</a> <a href="#user-content-fnref-isa">↩</a></p>
</li>
<li>
<p><a href="https://en.wikipedia.org/wiki/Assembly_language" target="_blank">Assembly language - Wikipedia</a> <a href="#user-content-fnref-asm">↩</a></p>
</li>
<li>
<p>Nisan N, Schocken S. 计算机系统要素: 如何从头构建一台现代计算机[M]. 李清安, 龚奕利, 译. 原书第2版. 北京: 机械工业出版社, 2024. <a href="#user-content-fnref-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%B3%BB%E7%BB%9F%E8%A6%81%E7%B4%A0">↩</a></p>
</li>
<li>
<p>Irvine K R. 汇编语言: 基于 x86 处理器[M]. 吴为民, 译. 原书第8版. 北京: 机械工业出版社, 2021. <a href="#user-content-fnref-%E6%B1%87%E7%BC%96%E8%AF%AD%E8%A8%80">↩</a> <a href="#user-content-fnref-%E6%B1%87%E7%BC%96%E8%AF%AD%E8%A8%80-2">↩<sup>2</sup></a></p>
</li>
<li>
<p>Bryant R E, O’Hallaron D R. 深入理解计算机系统[M]. 龚奕利, 贺莲, 译. 原书第3版. 北京: 机械工业出版社, 2016. <a href="#user-content-fnref-csapp">↩</a></p>
</li>
<li>
<p>Lu H J, Matz M, Girkar M, 等. System V Application Binary Interface AMD64 Architecture Processor Supplement[S]. 1.0. 2025. <a href="#user-content-fnref-x64-abi">↩</a></p>
</li>
<li>
<p>俞甲子, 石凡, 潘爱民. 程序员的自我修养: 链接、装载与库[M]. 北京: 电子工业出版社, 2009. <a href="#user-content-fnref-%E7%A8%8B%E5%BA%8F%E5%91%98%E7%9A%84%E8%87%AA%E6%88%91%E4%BF%AE%E5%85%BB">↩</a></p>
</li>
<li>
<p>Advanced Micro Devices, Inc. AMD64 Architecture Programmer’s Manual Volume 2: System Programming[Z]. Revision 3.44. 2026. <a href="#user-content-fnref-apm">↩</a> <a href="#user-content-fnref-apm-2">↩<sup>2</sup></a> <a href="#user-content-fnref-apm-3">↩<sup>3</sup></a> <a href="#user-content-fnref-apm-4">↩<sup>4</sup></a></p>
</li>
<li>
<p>Intel Corporation. Intel® 64 and IA-32 Architectures Software Developer Manual Volume 2: Instruction Set Reference 2B[Z]. 2026. <a href="#user-content-fnref-sdm">↩</a> <a href="#user-content-fnref-sdm-2">↩<sup>2</sup></a> <a href="#user-content-fnref-sdm-3">↩<sup>3</sup></a> <a href="#user-content-fnref-sdm-4">↩<sup>4</sup></a></p>
</li>
</ol>
</section>]]></content>
    </entry>
    <entry>
      <id>https://nekoside.com/posts/%E8%AE%B0%E5%BD%95/sys1ogconf/</id>
      <title type="text">家目录下神秘出现的 .sys1og.conf</title>
      <published>2026-07-14T00:00:00.000Z</published>
      <updated>2026-07-21T00:00:00.000Z</updated>
      <author><name>nekoside</name></author>
      <link rel="alternate" href="https://nekoside.com/posts/%E8%AE%B0%E5%BD%95/sys1ogconf/"/>
      <summary type="text">等等！为什么这儿有个 .sys1og.conf？</summary>
      <content type="html"><![CDATA[<section><h1>背景<a href="#背景"><span>#</span></a></h1><p>今天突然发现用户家目录下有一个 <code>.sys1og.conf</code> 文件，非常可疑：</p><ul>
<li>用 sys1og 替换 syslog</li>
<li>是 dotfile</li>
<li>通过 <code>pacman -Qo ~/.sys1og.conf</code> 得知没有软件包认领该文件</li>
<li>根本不知道是什么文件，也不知道是什么时候出现的</li>
<li>内容是一行 UUID</li>
</ul><p>但 <code>stat .sys1og.conf</code> 显示其被创建后从未被访问过，且没有执行权限，很是神秘。</p></section>
<section><h1>线索<a href="#线索"><span>#</span></a></h1><p>经过本地排查无果，Google 搜索得到一条有用信息：</p><p><a href="https://2o181o28.github.io/2024/08/30/Ubuntu%E5%8D%87%E7%BA%A7%E8%87%B324.04/#%E5%BE%AE%E4%BF%A1" target="_blank">cosmicAC 的博客</a>（谢谢你）</p><p>通过该文章得知这个 <code>.sys1og.conf</code> 大概率是微信产生的。</p></section>
<section><h1>验证<a href="#验证"><span>#</span></a></h1><section><h2><code>pacman.log</code><a href="#pacmanlog"><span>#</span></a></h2><p>于是我去检查了 <code>/var/log/pacman.log</code>，综合上面的 <code>stat .sys1og.conf</code> 得到如下信息：</p><p>微信安装时间</p><blockquote><p>[某一天T22:09:58+0800] [ALPM] installed wechat-bin (4.1.1.4-1)</p></blockquote><p>该文件创建时间</p><blockquote><p>创建时间：同一天 22:10:53.516000051 +0800</p></blockquote><p>中间间隔约一分钟</p></section><section><h2>复现<a href="#复现"><span>#</span></a></h2><p><code>cat -A .sys1og.conf</code> 得知该文件没什么用，并且从创建之后都没有被修改过，索性删除。打开微信，文件重新被创建，得以验证。</p><p>微信应该是启动时检查该文件是否存在，不存在就创建，存在就跳过。</p><div><div><div></div><div>环境</div></div><div><ul>
<li>ArchLinux</li>
<li>x86_64</li>
<li>7.1.3-arch1-2</li>
<li>Wayland</li>
<li>KDE Plasma 6.7.2</li>
</ul></div></div><p>得知 AUR 的 <code>wechat-bin</code> 版本 <code>4.1.1.4-1</code> 至 <code>4.1.1.7-1</code> 均会在每次重新启动微信进程时检查该文件。</p></section></section>
<section><h1>总结<a href="#总结"><span>#</span></a></h1><p><strong>微信，我***</strong>。</p></section>]]></content>
    </entry>
    <entry>
      <id>https://nekoside.com/posts/wayland-chromium-color/</id>
      <title type="text">解决 Wayland 下 Chromium 系浏览器颜色偏浅</title>
      <published>2026-07-12T00:00:00.000Z</published>
      <updated>2026-07-13T00:00:00.000Z</updated>
      <author><name>nekoside</name></author>
      <link rel="alternate" href="https://nekoside.com/posts/wayland-chromium-color/"/>
      <summary type="text"></summary>
      <content type="html"><![CDATA[<section><h1>诊断<a href="#诊断"><span>#</span></a></h1><p>使用任意屏幕拾色器如 <a href="https://apps.kde.org/kcolorchooser/" target="_blank">KColorChooser</a> 在任意 Github 仓库页面如 <a href="https://github.com/torvalds/linux" target="_blank">linux</a> 两侧黑色背景进行拾色，正常值应为 <code>#0d1117</code>，若拾取到其他值，则存在偏色（或可与 Firefox 对比，肉眼可见 Chromium 的颜色更浅）。</p><p>是 Chromium 上游已知问题：</p><p><a href="https://issues.chromium.org/issues/476172415" target="_blank">https://issues.chromium.org/issues/476172415</a></p></section>
<section><h1>临时解决方案<a href="#临时解决方案"><span>#</span></a></h1><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>--disable-features</span><span>=</span><span>WaylandWpColorManagerV1</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>随后重新进行拾色，得到的值应为 <code>#0d1117</code>。</p></section>]]></content>
    </entry>
    <entry>
      <id>https://nekoside.com/posts/fix-fontconfig-cht/</id>
      <title type="text">修复 fontconfig 显示繁体字形</title>
      <published>2026-06-21T00:00:00.000Z</published>
      <updated>2026-06-21T00:00:00.000Z</updated>
      <author><name>nekoside</name></author>
      <link rel="alternate" href="https://nekoside.com/posts/fix-fontconfig-cht/"/>
      <summary type="text"></summary>
      <content type="html"><![CDATA[<section><h1>问题描述<a href="#问题描述"><span>#</span></a></h1><p>环境</p><ul>
<li>ArchLinux</li>
<li>KDE Plasma 6.7.0</li>
<li>Wayland</li>
<li>fontconfig 2.18.1</li>
</ul></section>
<section><h1>解决方案<a href="#解决方案"><span>#</span></a></h1><blockquote><p>解决方案来自 ArchLinux CN tg 群组：银河-蜗牛</p></blockquote><div><div><div></div><div>风险操作</div></div><div><p><code>sudo rm</code> 前请再三检查</p></div></div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>sudo</span><span> </span><span>rm</span><span> </span><span>-i</span><span> </span><span>/etc/fonts/conf.d/48-guessfamily.conf</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>确定要删除的文件后输入 <code>yes</code></p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>fc-cache</span><span> </span><span>-f</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>然后重启打开应用程序。</p></section>]]></content>
    </entry>
    <entry>
      <id>https://nekoside.com/posts/kde-numlock/</id>
      <title type="text">KDE 开机自动启用 NumLock</title>
      <published>2026-06-19T00:00:00.000Z</published>
      <updated>2026-06-19T00:00:00.000Z</updated>
      <author><name>nekoside</name></author>
      <link rel="alternate" href="https://nekoside.com/posts/kde-numlock/"/>
      <summary type="text"></summary>
      <content type="html"><![CDATA[<section><h1>环境<a href="#环境"><span>#</span></a></h1><ul>
<li>Arch Linux</li>
<li>WayLand</li>
<li>KDE Plasma 6.6.5</li>
<li>Plasma Login Manager</li>
</ul></section>
<section><h1>启用<a href="#启用"><span>#</span></a></h1><p>KDE 的设置中其实有 NumLock 选项（键盘 -&gt; NumLock 在开机时的状态），但这个选项在我这里根本没有作用。</p><p>根据 <a href="https://wiki.archlinux.org/title/Activating_numlock_on_bootup" target="_blank">ArchWiki</a>，我们可以安装 <a href="https://aur.archlinux.org/packages/systemd-numlockontty" target="_blank">systemd-numlockontty</a><sup>aur</sup>：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>yay</span><span> </span><span>-S</span><span> </span><span>systemd-numlockontty</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>然后启用 <code>numLockOnTty</code> systemd 服务：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>sudo</span><span> </span><span>systemctl</span><span> </span><span>enable</span><span> </span><span>--now</span><span> </span><span>numLockOnTty</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>之后根据你的图形协议和登录方式（我这里是 Wayland + PLM，请参考 <a href="https://wiki.archlinux.org/title/Activating_numlock_on_bootup#Wayland" target="_blank">ArchWiki</a>）进行不同的操作：</p><section><h2>Plasma Login Manager<a href="#plasma-login-manager"><span>#</span></a></h2><div><div><div></div><div>Note</div></div><div><p>该文件权限为 600，所有者是 plasmalogin，看不到是正常的，使用 <code>sudoedit</code></p></div></div><p>在 <code>/var/lib/plasmalogin/.config/kdedefaults/kcminputrc</code> 中添加：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>[</span><span>Keyboard</span><span>]</span></div></div><div><div><div>2</div></div><div><span>NumLock</span><span>=</span><span>0</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>重启系统。</p></section></section>]]></content>
    </entry>
    <entry>
      <id>https://nekoside.com/posts/rime-configuration/</id>
      <title type="text">Rime 配置</title>
      <published>2026-06-17T00:00:00.000Z</published>
      <updated>2026-09-19T00:00:00.000Z</updated>
      <author><name>nekoside</name></author>
      <link rel="alternate" href="https://nekoside.com/posts/rime-configuration/"/>
      <summary type="text"></summary>
      <content type="html"><![CDATA[<section><h1>介绍<a href="#介绍"><span>#</span></a></h1><ul>
<li>
<p>小狼毫 Weasel (Windows)</p>
</li>
<li>
<p>鼠须管 Squirrel (macOS)</p>
</li>
<li>
<p>中州韵 (Linux)</p>
</li>
<li>
<p>同文 Trime (Android)</p>
</li>
</ul><p>以上输入法均为 Rime 引擎在不同平台的输入法实现，都可以当作 Rime</p></section>
<section><h1>配置<a href="#配置"><span>#</span></a></h1><p>Rime 的目录结构：</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>.</span></div></div><div><div><div>2</div></div><div><span>├── build</span></div></div><div><div><div>3</div></div><div><span>│   ├── bopomofo.prism.bin</span></div></div><div><div><div>4</div></div><div><span>│   ├── bopomofo.schema.yaml</span></div></div><div><div><div>5</div></div><div><span>│   ├── default.yaml</span></div></div><div><div><div>6</div></div><div><span>│   ├── luna_pinyin.prism.bin</span></div></div><div><div><div>7</div></div><div><span>│   ├── luna_pinyin.reverse.bin</span></div></div><div><div><div>8</div></div><div><span>│   ├── luna_pinyin.schema.yaml</span></div></div><div><div><div>9</div></div><div><span>│   ├── luna_pinyin.table.bin</span></div></div><div><div><div>10</div></div><div><span>│   ├── luna_pinyin_fluency.schema.yaml</span></div></div><div><div><div>11</div></div><div><span>│   ├── luna_pinyin_simp.prism.bin</span></div></div><div><div><div>12</div></div><div><span>│   ├── luna_pinyin_simp.schema.yaml</span></div></div><div><div><div>13</div></div><div><span>│   ├── luna_pinyin_tw.prism.bin</span></div></div><div><div><div>14</div></div><div><span>│   ├── luna_pinyin_tw.schema.yaml</span></div></div><div><div><div>15</div></div><div><span>│   ├── stroke.prism.bin</span></div></div><div><div><div>16</div></div><div><span>│   ├── stroke.reverse.bin</span></div></div><div><div><div>17</div></div><div><span>│   ├── stroke.schema.yaml</span></div></div><div><div><div>18</div></div><div><span>│   ├── stroke.table.bin</span></div></div><div><div><div>19</div></div><div><span>│   ├── terra_pinyin.reverse.bin</span></div></div><div><div><div>20</div></div><div><span>│   ├── terra_pinyin.table.bin</span></div></div><div><div><div>21</div></div><div><span>│   └── weasel.yaml</span></div></div><div><div><div>22</div></div><div><span>├── default.custom.yaml    修改这个配置文件，会覆盖上面的 default.yaml</span></div></div><div><div><div>23</div></div><div><span>├── installation.yaml</span></div></div><div><div><div>24</div></div><div><span>├── luna_pinyin.userdb</span></div></div><div><div><div>25</div></div><div><span>│   ├── 000005.ldb</span></div></div><div><div><div>26</div></div><div><span>│   ├── 000008.log</span></div></div><div><div><div>27</div></div><div><span>│   ├── CURRENT</span></div></div><div><div><div>28</div></div><div><span>│   ├── LOCK</span></div></div><div><div><div>29</div></div><div><span>│   ├── LOG</span></div></div><div><div><div>30</div></div><div><span>│   ├── LOG.old</span></div></div><div><div><div>31</div></div><div><span>│   └── MANIFEST-000007</span></div></div><div><div><div>32</div></div><div><span>├── user.yaml</span></div></div><div><div><div>33</div></div><div><span>└── weasel.custom.yaml</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><section><h2>Linux<a href="#linux"><span>#</span></a></h2><section><h3>Fcitx5<a href="#fcitx5"><span>#</span></a></h3><p>用户配置文件位于 <code>.local/share/fcitx5/rime/</code></p><p>在配置目录中新建 <code>default.custom.yaml</code> 文件，用于覆盖默认的配置。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>patch</span><span>:</span></div></div><div><div><div>2</div></div><div><span>  </span><span>menu</span><span>:</span></div></div><div><div><div>3</div></div><div><span>    </span><span># 候选词数量</span></div></div><div><div><div>4</div></div><div><span>    </span><span>page_size</span><span>: </span><span>9</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>  </span><span>ascii_composer</span><span>:</span></div></div><div><div><div>7</div></div><div><span>    </span><span>switch_key</span><span>:</span></div></div><div><div><div>8</div></div><div><span>      </span><span># 禁用左 Shift</span></div></div><div><div><div>9</div></div><div><span>      </span><span>Shift_L</span><span>: </span><span>noop</span></div></div><div><div><div>10</div></div><div><span>      </span><span># 不是 Ctrl</span></div></div><div><div><div>11</div></div><div><span>      </span><span>Control_L</span><span>: </span><span>commit_code</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>  </span><span>switcher</span><span>:</span></div></div><div><div><div>14</div></div><div><span>    </span><span># 禁用所有菜单按键</span></div></div><div><div><div>15</div></div><div><span>      </span><span>hotkeys</span><span>: []</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h3>IBus<a href="#ibus"><span>#</span></a></h3><p><strong>配置目录</strong></p><p><code>~/.config/ibus/rime</code></p><p>使用</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>ibus</span><span> </span><span>restart</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>重新部署</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>patch</span><span>:</span></div></div><div><div><div>2</div></div><div><span>  </span><span>__include</span><span>: </span><span>rime_ice_suggestion:/</span></div></div><div><div><div>3</div></div><div><span>  </span><span>menu</span><span>:</span></div></div><div><div><div>4</div></div><div><span>    </span><span>page_size</span><span>: </span><span>9</span><span> </span><span># 设置候选词数量</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>  </span><span>ascii_composer</span><span>:</span></div></div><div><div><div>7</div></div><div><span>    </span><span>switch_key</span><span>:</span></div></div><div><div><div>8</div></div><div><span>      </span><span>Shift_L</span><span>: </span><span>noop</span><span> </span><span># 禁用左 Shift</span></div></div><div><div><div>9</div></div><div><span>      </span><span>Control_L</span><span>: </span><span>commit_code</span><span> </span><span># 使用左 Control 切换</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>  </span><span>switcher</span><span>:</span></div></div><div><div><div>12</div></div><div><span>    </span><span>hotkeys</span><span>: [] </span><span># 关闭 Rime 菜单快捷键</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section></section>
<section><h1>Reference<a href="#reference"><span>#</span></a></h1><blockquote><p><a href="https://wiki.archlinuxcn.org/wiki/Rime" target="_blank">https://wiki.archlinuxcn.org/wiki/Rime</a></p></blockquote></section>]]></content>
    </entry>
    <entry>
      <id>https://nekoside.com/posts/fix-zed-tailwindcss/</id>
      <title type="text">解决 Zed 不认识 TailwindCSS 规则</title>
      <published>2026-06-16T00:00:00.000Z</published>
      <updated>2026-06-16T00:00:00.000Z</updated>
      <author><name>nekoside</name></author>
      <link rel="alternate" href="https://nekoside.com/posts/fix-zed-tailwindcss/"/>
      <summary type="text"></summary>
      <content type="html"><![CDATA[<p><a href="https://github.com/zed-industries/zed/issues/38596" target="_blank">https://github.com/zed-industries/zed/issues/38596</a></p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>  </span><span>"lsp"</span><span>: {</span></div></div><div><div><div>2</div></div><div><span>    </span><span>"vscode-css-language-server"</span><span>: {</span></div></div><div><div><div>3</div></div><div><span>      </span><span>"settings"</span><span>: {</span></div></div><div><div><div>4</div></div><div><span>        </span><span>"css"</span><span>: {</span></div></div><div><div><div>5</div></div><div><span>          </span><span>"lint"</span><span>: {</span></div></div><div><div><div>6</div></div><div><span>            </span><span>"unknownAtRules"</span><span>: </span><span>"ignore"</span><span>,</span></div></div><div><div><div>7</div></div><div><span><span>          </span></span><span>},</span></div></div><div><div><div>8</div></div><div><span><span>        </span></span><span>},</span></div></div><div><div><div>9</div></div><div><span><span>      </span></span><span>},</span></div></div><div><div><div>10</div></div><div><span><span>    </span></span><span>},</span></div></div><div><div><div>11</div></div><div><span><span>  </span></span><span>},</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<hr />
<p>Zed TailwindCSS Docs 建议</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>{</span></div></div><div><div><div>2</div></div><div><span>  </span><span>"languages"</span><span>: {</span></div></div><div><div><div>3</div></div><div><span>    </span><span>"CSS"</span><span>: {</span></div></div><div><div><div>4</div></div><div><span>      </span><span>"language_servers"</span><span>: [</span></div></div><div><div><div>5</div></div><div><span>        </span><span>"tailwindcss-intellisense-css"</span><span>,</span></div></div><div><div><div>6</div></div><div><span>        </span><span>"!vscode-css-language-server"</span><span>,</span></div></div><div><div><div>7</div></div><div><span>        </span><span>"..."</span><span>,</span></div></div><div><div><div>8</div></div><div><span><span>      </span></span><span>],</span></div></div><div><div><div>9</div></div><div><span><span>    </span></span><span>},</span></div></div><div><div><div>10</div></div><div><span><span>  </span></span><span>},</span></div></div><div><div><div>11</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div>]]></content>
    </entry>
    <entry>
      <id>https://nekoside.com/posts/vscode-toggle-explorer/</id>
      <title type="text">VSCode Toggle Explorer</title>
      <published>2026-04-30T00:00:00.000Z</published>
      <updated>2026-04-30T00:00:00.000Z</updated>
      <author><name>nekoside</name></author>
      <link rel="alternate" href="https://nekoside.com/posts/vscode-toggle-explorer/"/>
      <summary type="text"></summary>
      <content type="html"><![CDATA[<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>"key"</span><span>: </span><span>"alt+1"</span><span>,</span></div></div><div><div><div>3</div></div><div><span>    </span><span>"command"</span><span>: </span><span>"workbench.view.explorer"</span><span>,</span></div></div><div><div><div>4</div></div><div><span>    </span><span>"when"</span><span>: </span><span>"viewContainer.workbench.view.explorer.enabled"</span></div></div><div><div><div>5</div></div><div><span>},</span></div></div><div><div><div>6</div></div><div><span>{</span></div></div><div><div><div>7</div></div><div><span>    </span><span>"key"</span><span>: </span><span>"alt+1"</span><span>,</span></div></div><div><div><div>8</div></div><div><span>    </span><span>"command"</span><span>: </span><span>"workbench.action.closeSidebar"</span><span>,</span></div></div><div><div><div>9</div></div><div><span>    </span><span>"when"</span><span>: </span><span>"sideBarVisible &amp;&amp; activeViewlet == 'workbench.view.explorer'"</span></div></div><div><div><div>10</div></div><div><span>},</span></div></div></code></pre><div><div></div><div></div></div></figure></div>]]></content>
    </entry>
    <entry>
      <id>https://nekoside.com/posts/fix-bluetooth-buzz/</id>
      <title type="text">解决蓝牙耳机在播放前后的电流声</title>
      <published>2026-04-29T00:00:00.000Z</published>
      <updated>2026-04-29T00:00:00.000Z</updated>
      <author><name>nekoside</name></author>
      <link rel="alternate" href="https://nekoside.com/posts/fix-bluetooth-buzz/"/>
      <summary type="text"></summary>
      <content type="html"><![CDATA[<p>在播放音频开始时以及播放结束后会产生一声电流声，是因为蓝牙耳机会自动睡眠。</p>
<p>解决方案：后台常驻一个进程阻止睡眠。</p>
<p>这里使用 <a href="https://veg.by/en/projects/soundkeeper/" target="_blank">SoundKeeper</a></p>
<a href="https://github.com/vrubleg/soundkeeper" target="_blank"><div><div><div><div></div><div>vrubleg</div></div><div>/</div><div>soundkeeper</div></div><div></div></div><div>Repository details unavailable</div><div><div>—</div><div>—</div><div>—</div><span>Unavailable</span></div></a>
<p>按下 <code>Win+R</code> 输入 <code>shell:startup</code> 打开自启动目录将对应架构文件（通常是 <code>SoundKeeper64.exe</code>）放入即可，如果希望立即生效可以放入后双击打开，这个工具没有 GUI，会在后台常驻。</p>]]></content>
    </entry>
    <entry>
      <id>https://nekoside.com/posts/media-fomart-lyrics-tags/</id>
      <title type="text">不同音频格式嵌入歌词的元数据标签</title>
      <published>2026-04-16T00:00:00.000Z</published>
      <updated>2026-04-16T00:00:00.000Z</updated>
      <author><name>nekoside</name></author>
      <link rel="alternate" href="https://nekoside.com/posts/media-fomart-lyrics-tags/"/>
      <summary type="text"></summary>
      <content type="html"><![CDATA[

<table><thead><tr><th></th><th></th></tr></thead><tbody><tr><td>容器格式</td><td>元数据标签</td></tr><tr><td>mp3</td><td>UNSYNCED LYRICS</td></tr><tr><td>m4a</td><td>LYRICS</td></tr><tr><td>flac</td><td>LYRICS</td></tr></tbody></table>
<p>Windows 可以使用 <a href="https://www.foobar2000.org/" target="_blank">foobar2000</a> 嵌入歌词。</p>
<p>Linux 可以使用 <a href="https://github.com/KDE/kid3" target="_blank">kid3</a></p>
<a href="https://github.com/KDE/kid3" target="_blank"><div><div><div><div></div><div>KDE</div></div><div>/</div><div>kid3</div></div><div></div></div><div>Repository details unavailable</div><div><div>—</div><div>—</div><div>—</div><span>Unavailable</span></div></a>
<ul>
<li>ArchLinux</li>
</ul>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>sudo</span><span> </span><span>pacman</span><span> </span><span>-S</span><span> </span><span>kid3</span></div></div></code></pre><div><div></div><div></div></div></figure></div>]]></content>
    </entry>
    <entry>
      <id>https://nekoside.com/posts/fix-nautilus-music-cover/</id>
      <title type="text">解决 Nautilus 中音乐封面不显示</title>
      <published>2026-04-13T00:00:00.000Z</published>
      <updated>2026-04-13T00:00:00.000Z</updated>
      <author><name>nekoside</name></author>
      <link rel="alternate" href="https://nekoside.com/posts/fix-nautilus-music-cover/"/>
      <summary type="text"></summary>
      <content type="html"><![CDATA[<section><h1>问题描述<a href="#问题描述"><span>#</span></a></h1><p>环境：</p><ul>
<li>OS: ArchLinux</li>
<li>WM: Hyprland (Wayland)</li>
<li>GPU: NVIDIA</li>
</ul><p>视频和图片封面都正常显示，音乐封面不显示。</p></section>
<section><h1>解决方案<a href="#解决方案"><span>#</span></a></h1><p>安装包 <code>totem</code> :</p><ul>
<li>ArchLinux</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>sudo</span><span> </span><span>pacman</span><span> </span><span>-S</span><span> </span><span>totem</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>后重新打开 Nautilus.</p></section>]]></content>
    </entry>
    <entry>
      <id>https://nekoside.com/posts/fix-steam-sinx-download/</id>
      <title type="text">解决 Steam 下载速度像 |sinx|</title>
      <published>2026-04-11T00:00:00.000Z</published>
      <updated>2026-04-11T00:00:00.000Z</updated>
      <author><name>nekoside</name></author>
      <link rel="alternate" href="https://nekoside.com/posts/fix-steam-sinx-download/"/>
      <summary type="text"></summary>
      <content type="html"><![CDATA[<p>按 <code>Win+X</code></p>
<p><img alt="" loading="lazy" width="300" height="631" src="/_astro/Win_X.DUr0YunF_ZuFhS7.webp" /></p>
<p>选择 <code>磁盘管理(K)</code></p>
<p>点击属性</p>
<p><img alt="" loading="lazy" width="284" height="286" src="/_astro/%E7%A3%81%E7%9B%98%E5%B1%9E%E6%80%A7.eYBYi5S3_QDgpc.webp" /></p>
<div><div><div></div><div>Caution</div></div><div><p>如果你的 Steam 下载驱动器位于<strong>系统驱动器</strong>，请<strong>谨慎关闭</strong>该选项。</p></div></div>
<p>在策略中关闭写入缓存。</p>
<p><img alt="" loading="lazy" width="263" height="142" src="/_astro/%E5%86%99%E5%85%A5%E7%BC%93%E5%AD%98%E7%AD%96%E7%95%A5.C2e6I-NW_2kmF4h.webp" /></p>
<p>关闭后下载中的游戏应该会出现错误，等一会或重启 Steam 即可。</p>]]></content>
    </entry>
    <entry>
      <id>https://nekoside.com/posts/obsidian-change-mathjax-fontsize/</id>
      <title type="text">Obsidian 修改 MathJax 字号</title>
      <published>2026-04-11T00:00:00.000Z</published>
      <updated>2026-04-11T00:00:00.000Z</updated>
      <author><name>nekoside</name></author>
      <link rel="alternate" href="https://nekoside.com/posts/obsidian-change-mathjax-fontsize/"/>
      <summary type="text"></summary>
      <content type="html"><![CDATA[<p>参考：<a href="https://www.reddit.com/r/ObsidianMD/comments/qo2ayx/any_way_to_increase_the_size_of_latex_expression/" target="_blank">Reddit ObsidianMD</a></p>
<p>在仓库的 <code>.obsidian\snippets</code> 中新建一个 css 文件，</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>.MathJax</span><span> {</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>font-size: </span><span><span>1.3</span><span>em</span></span><span>;</span></div></div><div><div><div>3</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<p>然后在 Obsidian 设置 -&gt; 外观中启用即可。</p>]]></content>
    </entry>
    <entry>
      <id>https://nekoside.com/posts/obsidian-oiint/</id>
      <title type="text">让 Obsidian 正确渲染 \oiint 和 \oiiint</title>
      <published>2026-04-11T00:00:00.000Z</published>
      <updated>2026-04-11T00:00:00.000Z</updated>
      <author><name>nekoside</name></author>
      <link rel="alternate" href="https://nekoside.com/posts/obsidian-oiint/"/>
      <summary type="text"></summary>
      <content type="html"><![CDATA[<p>由于当前版本 Obsidian 使用的 MathJax 版本不支持这两个命令（MathJax 4.0 已经支持），所以无法正常渲染，解决方案如下：</p>
<section><h1>安装 Extended MathJax 插件<a href="#安装-extended-mathjax-插件"><span>#</span></a></h1><p>跟随插件指示创建 <code>preamble.sty</code></p><p>输入</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>\newcommand</span><span>{</span><span>\oiint</span><span>}{</span><span>\unicode</span><span>{x222F}}</span></div></div><div><div><div>2</div></div><div><span>\newcommand</span><span>{</span><span>\oiiint</span><span>}{</span><span>\unicode</span><span>{x2230}}</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>重新启动 Obsidian 后正常渲染。</p></section>]]></content>
    </entry>
    <entry>
      <id>https://nekoside.com/posts/vscode-reopen-with/</id>
      <title type="text">VSCode 修改某个文件的编辑方式(编辑器)</title>
      <published>2026-02-20T00:00:00.000Z</published>
      <updated>2026-02-20T00:00:00.000Z</updated>
      <author><name>nekoside</name></author>
      <link rel="alternate" href="https://nekoside.com/posts/vscode-reopen-with/"/>
      <summary type="text"></summary>
      <content type="html"><![CDATA[<p>例如我想以文本的形式编辑一个 <code>obj</code> 文件</p>
<p>在 <code>VSCode</code> 快捷键编辑中搜索</p>
<p><code>@command:workbench.action.reopenWithEditor</code></p>
<p>分配快捷键即可.</p>]]></content>
    </entry>
    <entry>
      <id>https://nekoside.com/posts/7zip-charset/</id>
      <title type="text">7-Zip 修改语言编码</title>
      <published>2026-02-13T00:00:00.000Z</published>
      <updated>2026-02-13T00:00:00.000Z</updated>
      <author><name>nekoside</name></author>
      <link rel="alternate" href="https://nekoside.com/posts/7zip-charset/"/>
      <summary type="text"></summary>
      <content type="html"><![CDATA[<ul>
<li><code>GBK</code> 936</li>
<li><code>Shift-JIS</code> 932</li>
</ul>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>7z</span><span> </span><span>x</span><span> </span><span>&lt;文件&gt;</span><span> </span><span>-o&lt;输出路径&gt;</span><span> </span><span>-mcp=932</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<p>即可用 <code>Shift-JIS</code> 解压</p>
<p>输出路径可以省略</p>
<hr />
<p>如果需要能够方便修改编码的 GUI，可以看看 <a href="https://peazip.github.io/" target="_blank">Peazip</a></p>
<a href="https://github.com/peazip/PeaZip" target="_blank"><div><div><div><div></div><div>peazip</div></div><div>/</div><div>PeaZip</div></div><div></div></div><div>Repository details unavailable</div><div><div>—</div><div>—</div><div>—</div><span>Unavailable</span></div></a>]]></content>
    </entry>
    <entry>
      <id>https://nekoside.com/posts/laptop-typec-no-power/</id>
      <title type="text">笔记本电脑 Type-C 口没电</title>
      <published>2026-02-06T00:00:00.000Z</published>
      <updated>2026-02-06T00:00:00.000Z</updated>
      <author><name>nekoside</name></author>
      <link rel="alternate" href="https://nekoside.com/posts/laptop-typec-no-power/"/>
      <summary type="text"></summary>
      <content type="html"><![CDATA[<section><h1>前言<a href="#前言"><span>#</span></a></h1><p>今天开机后发现笔记本电脑侧面的两个普通 Type-C 口没电，Type-A 口都正常，PD 口也正常.</p><p>插在 C 口拓展坞上的鼠标键盘无线接收器无法使用，充电器也不能给其他设备充电.</p></section>
<section><h1>解决<a href="#解决"><span>#</span></a></h1><p>完全关机后拔掉所有外接设备，<strong>长按电源键</strong> 30 秒，<strong>释放静电</strong>后开机，恢复正常.</p><hr /><p>还好不是硬件损坏 (</p></section>]]></content>
    </entry>
    <entry>
      <id>https://nekoside.com/posts/toonshading-outline/</id>
      <title type="text">卡通渲染中的描边</title>
      <published>2026-02-06T00:00:00.000Z</published>
      <updated>2026-02-06T00:00:00.000Z</updated>
      <author><name>nekoside</name></author>
      <link rel="alternate" href="https://nekoside.com/posts/toonshading-outline/"/>
      <summary type="text"></summary>
      <content type="html"><![CDATA[<section><h1>法线外扩<a href="#法线外扩"><span>#</span></a></h1><section><h2><strong>基本原理</strong><a href="#基本原理"><span>#</span></a></h2><p>原理是渲染两次，第一个 Pass 正常渲染正面，将背面剔除，第二个 Pass 将正面剔除后先将背面顶点沿着法线的方向移动，外扩后再渲染背面，</p><p>最后两个 Pass 叠加在一起。</p></section><section><h2><strong>Unity 实现</strong><a href="#unity-实现"><span>#</span></a></h2><p>渲染正面</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>Shader</span><span> </span><span>"nekoside/default"</span></div></div><div><div><div>2</div></div><div><span>{</span></div></div><div><div><div>3</div></div><div><span>    </span><span>Properties</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>{</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>_BaseColor(</span><span>"BaseColor"</span><span>, </span><span>Color</span><span>) = (</span><span>0</span><span>, </span><span>0</span><span>, </span><span>0</span><span>, </span><span>1</span><span>)</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>    </span><span>SubShader</span></div></div><div><div><div>9</div></div><div><span><span>    </span></span><span>{</span></div></div><div><div><div>10</div></div><div><span><span>        </span></span><span>Tags</span></div></div><div><div><div>11</div></div><div><span><span>        </span></span><span>{</span></div></div><div><div><div>12</div></div><div><span>            </span><span>"RenderType"</span><span> = </span><span>"Opaque"</span></div></div><div><div><div>13</div></div><div><span>            </span><span>"Queue"</span><span> = </span><span>"Geometry"</span></div></div><div><div><div>14</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>        </span><span>// 渲染正面</span></div></div><div><div><div>17</div></div><div><span>        </span><span>Pass</span></div></div><div><div><div>18</div></div><div><span><span>        </span></span><span>{</span></div></div><div><div><div>19</div></div><div><span><span>            </span></span><span>Cull</span><span> </span><span>Back</span></div></div><div><div><div>20</div></div><div><span>            </span><span>HLSLPROGRAM</span></div></div><div><div><div>21</div></div><div><span><span>            </span></span><span>#include</span><span> </span><span>"Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"</span></div></div><div><div><div>22</div></div><div><span><span>            </span></span><span>#pragma</span><span> vertex vert</span></div></div><div><div><div>23</div></div><div><span><span>            </span></span><span>#pragma</span><span> fragment frag</span></div></div><div><div><div>24</div></div><div>
</div></div><div><div><div>25</div></div><div><span>            </span><span>CBUFFER_START</span><span>(UnityPerMaterial)</span></div></div><div><div><div>26</div></div><div><span>            </span><span>half4</span><span> _BaseColor;</span></div></div><div><div><div>27</div></div><div><span><span>            </span></span><span>CBUFFER_END</span></div></div><div><div><div>28</div></div><div>
</div></div><div><div><div>29</div></div><div><span>            </span><span>struct</span><span> Attributes</span></div></div><div><div><div>30</div></div><div><span><span>            </span></span><span>{</span></div></div><div><div><div>31</div></div><div><span>                </span><span>float3</span><span><span> positionOS : </span><span>POSITION</span><span>;</span></span></div></div><div><div><div>32</div></div><div><span><span>            </span></span><span>};</span></div></div><div><div><div>33</div></div><div>
</div></div><div><div><div>34</div></div><div><span>            </span><span>struct</span><span> Varyings</span></div></div><div><div><div>35</div></div><div><span><span>            </span></span><span>{</span></div></div><div><div><div>36</div></div><div><span>                </span><span>float4</span><span> positionHCS : SV_POSITION;</span></div></div><div><div><div>37</div></div><div><span><span>            </span></span><span>};</span></div></div><div><div><div>38</div></div><div>
</div></div><div><div><div>39</div></div><div><span><span>            </span></span><span>Varyings </span><span>vert</span><span>(Attributes IN)</span></div></div><div><div><div>40</div></div><div><span><span>            </span></span><span>{</span></div></div><div><div><div>41</div></div><div><span><span>                </span></span><span>Varyings OUT;</span></div></div><div><div><div>42</div></div><div><span><span>                </span></span><span>OUT.positionHCS = </span><span>TransformObjectToHClip</span><span>(IN.positionOS);</span></div></div><div><div><div>43</div></div><div><span>                </span><span>return</span><span> OUT;</span></div></div><div><div><div>44</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>45</div></div><div>
</div></div><div><div><div>46</div></div><div><span>            </span><span>half4</span><span> </span><span>frag</span><span>(Varyings IN) : SV_Target</span></div></div><div><div><div>47</div></div><div><span><span>            </span></span><span>{</span></div></div><div><div><div>48</div></div><div><span>                </span><span>half4</span><span> OUT;</span></div></div><div><div><div>49</div></div><div><span><span>                </span></span><span>OUT = </span><span>half4</span><span>(_BaseColor.rgba);</span></div></div><div><div><div>50</div></div><div><span>                </span><span>return</span><span> OUT;</span></div></div><div><div><div>51</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>52</div></div><div><span>            </span><span>ENDHLSL</span></div></div><div><div><div>53</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>54</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>55</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>渲染背面（描边）</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>Shader</span><span> </span><span>"nekoside/outline"</span></div></div><div><div><div>2</div></div><div><span>{</span></div></div><div><div><div>3</div></div><div><span>    </span><span>Properties</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>{</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>_OutlineColor (</span><span>"Outline Color"</span><span>, </span><span>Color</span><span>) = (</span><span>1</span><span>, </span><span>1</span><span>, </span><span>1</span><span>, </span><span>1</span><span>)</span></div></div><div><div><div>6</div></div><div><span><span>        </span></span><span>_OutlineWidth (</span><span>"Outline Width"</span><span>, </span><span>Range</span><span>(</span><span>0</span><span>, </span><span>0.5</span><span>)) = </span><span>0.25</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>    </span><span>SubShader</span></div></div><div><div><div>10</div></div><div><span><span>    </span></span><span>{</span></div></div><div><div><div>11</div></div><div><span><span>        </span></span><span>Tags</span></div></div><div><div><div>12</div></div><div><span><span>        </span></span><span>{</span></div></div><div><div><div>13</div></div><div><span>            </span><span>"RenderType"</span><span> = </span><span>"Opaque"</span><span> </span><span>"Queue"</span><span> = </span><span>"Geometry"</span></div></div><div><div><div>14</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>        </span><span>// 渲染背面（描边）</span></div></div><div><div><div>17</div></div><div><span>        </span><span>Pass</span></div></div><div><div><div>18</div></div><div><span><span>        </span></span><span>{</span></div></div><div><div><div>19</div></div><div><span><span>            </span></span><span>Cull</span><span> </span><span>Front</span></div></div><div><div><div>20</div></div><div><span>            </span><span>HLSLPROGRAM</span></div></div><div><div><div>21</div></div><div><span><span>            </span></span><span>#include</span><span> </span><span>"Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"</span></div></div><div><div><div>22</div></div><div><span><span>            </span></span><span>#pragma</span><span> vertex vert</span></div></div><div><div><div>23</div></div><div><span><span>            </span></span><span>pragma fragment frag</span></div></div><div><div><div>24</div></div><div>
</div></div><div><div><div>25</div></div><div><span>            </span><span>CBUFFER_START</span><span>(UnityPerMaterial)</span></div></div><div><div><div>26</div></div><div><span>            </span><span>half4</span><span> _OutlineColor;</span></div></div><div><div><div>27</div></div><div><span>            </span><span>float</span><span> _OutlineWidth;</span></div></div><div><div><div>28</div></div><div><span><span>            </span></span><span>CBUFFER_END</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>            </span><span>struct</span><span> Attributes</span></div></div><div><div><div>31</div></div><div><span><span>            </span></span><span>{</span></div></div><div><div><div>32</div></div><div><span>                </span><span>float3</span><span><span> positionOS : </span><span>POSITION</span><span>;</span></span></div></div><div><div><div>33</div></div><div><span>                </span><span>float3</span><span><span> normalOS : </span><span>NORMAL</span><span>;</span></span></div></div><div><div><div>34</div></div><div><span><span>            </span></span><span>};</span></div></div><div><div><div>35</div></div><div>
</div></div><div><div><div>36</div></div><div><span>            </span><span>struct</span><span> Varyings</span></div></div><div><div><div>37</div></div><div><span><span>            </span></span><span>{</span></div></div><div><div><div>38</div></div><div><span>                </span><span>float4</span><span> positionHCS : SV_POSITION;</span></div></div><div><div><div>39</div></div><div><span><span>            </span></span><span>};</span></div></div><div><div><div>40</div></div><div>
</div></div><div><div><div>41</div></div><div><span><span>            </span></span><span>Varyings </span><span>vert</span><span>(Attributes IN)</span></div></div><div><div><div>42</div></div><div><span><span>            </span></span><span>{</span></div></div><div><div><div>43</div></div><div><span><span>                </span></span><span>Varyings OUT;</span></div></div><div><div><div>44</div></div><div><span><span>                </span></span><span>IN.positionOS += _OutlineWidth * IN.normalOS;</span></div></div><div><div><div>45</div></div><div><span><span>                </span></span><span>OUT.positionHCS = </span><span>TransformObjectToHClip</span><span>(IN.positionOS);</span></div></div><div><div><div>46</div></div><div><span>                </span><span>return</span><span> OUT;</span></div></div><div><div><div>47</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>48</div></div><div>
</div></div><div><div><div>49</div></div><div><span>            </span><span>half4</span><span> </span><span>frag</span><span>(Varyings IN) : SV_Target</span></div></div><div><div><div>50</div></div><div><span><span>            </span></span><span>{</span></div></div><div><div><div>51</div></div><div><span>                </span><span>return</span><span> _OutlineColor;</span></div></div><div><div><div>52</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>53</div></div><div><span>            </span><span>ENDHLSL</span></div></div><div><div><div>54</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>55</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>56</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>因为 <code>Unity</code> 默认不会渲染所有 Pass（因为会对性能造成影响），所以我这里把两个 Pass 拆分为两个 Shader，一共使用两个 Material.</p><p><img alt="" loading="lazy" width="342" height="130" src="/_astro/%E4%B8%A4%E4%B8%AAMaterial.HmxdrwKY_Z1KtRva.webp" /></p></section><section><h2><strong>描边断开</strong><a href="#描边断开"><span>#</span></a></h2><p>直接使用刚刚的 Shader 会变成这样</p><p><img alt="" loading="lazy" width="419" height="335" src="/_astro/%E6%8F%8F%E8%BE%B9%E6%96%AD%E5%BC%80.DkCrAnD0_16JWTq.webp" /></p><p>因为法线外扩得到的描边，会导致模型的硬边（比如这个立方体）连接处断开</p><p>解决方法是生成平滑法线</p><p><img alt="" loading="lazy" width="381" height="120" src="/_astro/Unity%E5%B9%B3%E6%BB%91%E6%B3%95%E7%BA%BF.BGnvS0Vm_Z1iHu0v.webp" /></p><p>修改 <code>Smoothing Angle</code></p><p>效果如下</p><p><img alt="" loading="lazy" width="434" height="347" src="/_astro/Unity%E6%8F%8F%E8%BE%B9.sbufMHET_Z2cX8QJ.webp" /></p></section></section>]]></content>
    </entry>
    <entry>
      <id>https://nekoside.com/posts/annoying-ms-gamingoverlay/</id>
      <title type="text">不断弹出的 ms-gamingoverlay</title>
      <published>2026-02-03T00:00:00.000Z</published>
      <updated>2026-09-26T00:00:00.000Z</updated>
      <author><name>nekoside</name></author>
      <link rel="alternate" href="https://nekoside.com/posts/annoying-ms-gamingoverlay/"/>
      <summary type="text"></summary>
      <content type="html"><![CDATA[<section><h1>原因<a href="#原因"><span>#</span></a></h1><p>原因是 Xbox Game Bar 被精简掉了，但是 Windows 的 Game DVR（Digital Video Recorder）后台还在。启动游戏等操作时，系统会去调用 <code>ms-gamingoverlay:</code> 协议，但是找不到对应的程序，所以弹出该提示框。</p><p>（Game DVR 是 Xbox 背后负责录制的东西）</p><hr /></section>
<section><h1>解决方案<a href="#解决方案"><span>#</span></a></h1><section><h2>禁用 Game DVR<a href="#禁用-game-dvr"><span>#</span></a></h2><div><div><div></div><div>Note</div></div><div><p>这里推荐一个注册表编辑工具：<a href="https://kurtzimmermann.com/downrc_en.html" target="_blank">RegCool</a>，图形化且带有历史记录，可以回退。</p><p>（不是 FOSS，但是被广泛使用）</p></div></div><ol>
<li></li>
</ol><ul>
<li>键：<code>HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\GameDVR</code></li>
<li>值：<code>AppCaptureEnabled</code></li>
<li>类型：<code>REG_DWORD</code></li>
<li>数据：<code>0</code></li>
</ul><ol>
<li></li>
</ol><ul>
<li>键：<code>HKCU\System\GameConfigStore</code></li>
<li>值：<code>GameDVR_Enabled</code></li>
<li>类型: <code>REG_DWORD</code></li>
<li>数据：<code>0</code></li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>reg add HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\GameDVR </span><span>/</span><span>f </span><span>/</span><span>t REG_DWORD </span><span>/</span><span>v AppCaptureEnabled </span><span>/</span><span>d </span></span><span>0</span></div></div><div><div><div>2</div></div><div><span><span>reg add HKCU\System\GameConfigStore </span><span>/</span><span>f </span><span>/</span><span>t REG_DWORD </span><span>/</span><span>v GameDVR_Enabled </span><span>/</span><span>d </span></span><span>0</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section>]]></content>
    </entry>
    <entry>
      <id>https://nekoside.com/posts/git-ssh-sign/</id>
      <title type="text">配置 Git 使用 SSH 签名和验证</title>
      <published>2026-02-03T00:00:00.000Z</published>
      <updated>2026-09-13T00:00:00.000Z</updated>
      <author><name>nekoside</name></author>
      <link rel="alternate" href="https://nekoside.com/posts/git-ssh-sign/"/>
      <summary type="text"></summary>
      <content type="html"><![CDATA[<section><h1>配置<a href="#配置"><span>#</span></a></h1><section><h2>基础配置<a href="#基础配置"><span>#</span></a></h2><p>生成一个新的 ssh 密钥：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>ssh-keygen</span><span> </span><span>-t</span><span> </span><span>ed25519</span><span> </span><span>-C</span><span> </span><span>"&lt;邮箱&gt;"</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>配置 Git 提交的全局用户名和邮箱：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>git</span><span> </span><span>config</span><span> </span><span>--global</span><span> </span><span>user.name</span><span> </span><span>"&lt;用户名&gt;"</span></div></div></code></pre><div><div></div><div></div></div></figure></div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>git</span><span> </span><span>config</span><span> </span><span>--global</span><span> </span><span>user.email</span><span> </span><span>"&lt;邮箱&gt;"</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h2>使用 SSH 进行签名<a href="#使用-ssh-进行签名"><span>#</span></a></h2><p>配置 Git 提交自动进行签名：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>git</span><span> </span><span>config</span><span> </span><span>--global</span><span> </span><span>commit.gpgsign</span><span> </span><span>true</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>配置签名使用 SSH：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>git</span><span> </span><span>config</span><span> </span><span>--global</span><span> </span><span>gpg.format</span><span> </span><span>ssh</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>配置签名的 SSH 公钥</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>git</span><span> </span><span>config</span><span> </span><span>--global</span><span> </span><span>user.signingkey</span><span> </span><span>&lt;SSH</span><span> </span><span>公钥或私钥文件&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><hr /></section></section>
<section><h1>References<a href="#references"><span>#</span></a></h1></section>]]></content>
    </entry>
    <entry>
      <id>https://nekoside.com/posts/optimize-pwsh-startspeed/</id>
      <title type="text">提高 PowerShell 启动速度</title>
      <published>2026-02-03T00:00:00.000Z</published>
      <updated>2026-02-03T00:00:00.000Z</updated>
      <author><name>nekoside</name></author>
      <link rel="alternate" href="https://nekoside.com/posts/optimize-pwsh-startspeed/"/>
      <summary type="text"></summary>
      <content type="html"><![CDATA[<p>在<strong>提权</strong>的 powershell 中执行以下代码：</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span># Source - https://stackoverflow.com/a/59343705</span></div></div><div><div><div>2</div></div><div><span># Posted by Theo</span></div></div><div><div><div>3</div></div><div><span># Retrieved 2026-06-24, License - CC BY-SA 4.0</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>$env:PATH</span><span><span> </span><span>=</span><span> [</span></span><span>Runtime.InteropServices.RuntimeEnvironment</span><span>]::GetRuntimeDirectory()</span></div></div><div><div><div>6</div></div><div><span>[</span><span>AppDomain</span><span>]::CurrentDomain.GetAssemblies() | </span><span>ForEach-Object</span><span> {</span></div></div><div><div><div>7</div></div><div><span>    </span><span>$path</span><span><span> </span><span>=</span><span> $_</span></span><span>.Location</span></div></div><div><div><div>8</div></div><div><span>    </span><span>if</span><span> (</span><span>$path</span><span>) {</span></div></div><div><div><div>9</div></div><div><span>        </span><span>$name</span><span><span> </span><span>=</span><span> </span></span><span>Split-Path</span><span> </span><span>$path</span><span><span> </span><span>-</span><span>Leaf</span></span></div></div><div><div><div>10</div></div><div><span>        </span><span>Write-Host</span><span><span> </span><span>-</span><span>ForegroundColor Yellow </span></span><span>"</span><span>`r`n</span><span><span>Running ngen.exe on '</span><span>$</span></span><span>name</span><span>'"</span></div></div><div><div><div>11</div></div><div><span>        </span><span>ngen.exe</span><span> install </span><span>$path</span><span><span> </span><span>/</span><span>nologo</span></span></div></div><div><div><div>12</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>13</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div>]]></content>
    </entry>
    <entry>
      <id>https://nekoside.com/posts/windows-program-starup/</id>
      <title type="text">Windows 设置程序自启动</title>
      <published>2026-01-26T00:00:00.000Z</published>
      <updated>2026-01-26T00:00:00.000Z</updated>
      <author><name>nekoside</name></author>
      <link rel="alternate" href="https://nekoside.com/posts/windows-program-starup/"/>
      <summary type="text"></summary>
      <content type="html"><![CDATA[<p><img alt="" loading="lazy" width="482" height="309" src="/_astro/startup.BOYLKXOV_Z1CwbTr.webp" /></p>
<p>执行后会打开 <code>C:\Users\&lt;UserName&gt;\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup</code></p>
<p>放在这里的程序开机后会自动执行，</p>
<p>可以把要自启动的可执行程序或其快捷方式放在这里.</p>]]></content>
    </entry>
    <entry>
      <id>https://nekoside.com/posts/fix-gnome-jetbrains-icon/</id>
      <title type="text">解决 GNOME 下 Jetbrains IDE 任务栏不显示 ICON</title>
      <published>2026-01-18T00:00:00.000Z</published>
      <updated>2026-01-18T00:00:00.000Z</updated>
      <author><name>nekoside</name></author>
      <link rel="alternate" href="https://nekoside.com/posts/fix-gnome-jetbrains-icon/"/>
      <summary type="text"></summary>
      <content type="html"><![CDATA[<section><h1>问题描述<a href="#问题描述"><span>#</span></a></h1><p><img alt="" loading="lazy" width="572" height="467" src="/_astro/IntelliJ.DVlkxd46_2gi4Fo.webp" /></p></section>
<section><h1>解决方案<a href="#解决方案"><span>#</span></a></h1><p><img alt="" loading="lazy" width="371" height="368" src="/_astro/IDEA%E5%88%9B%E5%BB%BA%E6%A1%8C%E9%9D%A2%E5%BF%AB%E6%8D%B7%E6%96%B9%E5%BC%8F.BemhhldL_Z2gUdPT.webp" /></p><p>这会在 <code>/usr/share/applications/</code> 下自动创建一个 <code>.desktop</code> 文件, 会被 GNOME 识别</p><p>原先的在 <code>~/.local/share/applications</code> 下的 <code>.desktop</code> 文件可以删除</p></section>]]></content>
    </entry>
    <entry>
      <id>https://nekoside.com/posts/linux-usb-bug/</id>
      <title type="text">Linux 下 USB 设备无法识别</title>
      <published>2026-01-13T00:00:00.000Z</published>
      <updated>2026-01-13T00:00:00.000Z</updated>
      <author><name>nekoside</name></author>
      <link rel="alternate" href="https://nekoside.com/posts/linux-usb-bug/"/>
      <summary type="text"></summary>
      <content type="html"><![CDATA[<section><h1>原因<a href="#原因"><span>#</span></a></h1><p><strong>更新 Linux 内核后没有重启, 导致 /lib/modules/ 下是新的内核, 而当前加载的是旧的内核, 插入 USB 设备后新的模块无法加载.</strong></p><hr /></section>
<section><h1>过程<a href="#过程"><span>#</span></a></h1><p><code>lsblk</code> 中没有 USB 设备</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>lsmod</span><span> | </span><span>grep</span><span> </span><span>usb_storage</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>插入设备后 USB 模块仍未加载</p><p>尝试手动加载模块</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>sudo</span><span> </span><span>modprobe</span><span> </span><span>usb_storage</span></div></div></code></pre><div><div></div><div></div></div></figure></div><blockquote><p>modprobe: FATAL: Module usb_storage not found in directory /lib/modules/6.18.4-zen1-1-zen</p></blockquote><p>随后去 /lib/modules/ 下查看发现是 6.18.5 的内核</p><p>但是当前加载的是 6.18.4 内核</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>uname</span><span> </span><span>-r</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>输出 <code>6.18.4-zen1-1-zen</code></p><p><strong>重启电脑后问题解决</strong></p></section>
<section><h1>Reference<a href="#reference"><span>#</span></a></h1><p><a href="https://www.reddit.com/r/linuxquestions/comments/9w4bq8/usb_storage_not_recognised_kernel_module_missing/" target="_blank">Reddit</a></p></section>]]></content>
    </entry>
    <entry>
      <id>https://nekoside.com/posts/xmake-basic/</id>
      <title type="text">XMake 基础</title>
      <published>2026-01-13T00:00:00.000Z</published>
      <updated>2026-01-13T00:00:00.000Z</updated>
      <author><name>nekoside</name></author>
      <link rel="alternate" href="https://nekoside.com/posts/xmake-basic/"/>
      <summary type="text"></summary>
      <content type="html"><![CDATA[<section><h1>基本命令<a href="#基本命令"><span>#</span></a></h1><section><h2>自动生成项目文件<a href="#自动生成项目文件"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>xmake</span><span> </span><span>create</span><span> </span><span>-P</span><span> </span><span>&lt;目录&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><code>-P</code> 参数用于指定创建的项目目录</p></section><section><h2>编译<a href="#编译"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>xmake</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>或</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>xmake</span><span> </span><span>build</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>或</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>xmake</span><span> </span><span>b</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><code>-y</code> 参数可以自动确认要安装的依赖包</p></section><section><h2>运行<a href="#运行"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>xmake</span><span> </span><span>run</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>或</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>xmake</span><span> </span><span>r</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h2>打包<a href="#打包"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>xmake</span><span> </span><span>package</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>或</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>xmake</span><span> </span><span>p</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section>
<section><h1>依赖管理<a href="#依赖管理"><span>#</span></a></h1><p>编辑项目根目录下的 <code>xmake.lua</code></p><p>通过 <code>add_requires()</code> , <code>add_packages()</code> 添加依赖</p><p>例如</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>add_requires</span><span>(</span><span>"glad"</span><span>, </span><span>"glfw"</span><span>, </span><span>"gtk4"</span><span>);</span></div></div><div><div><div>2</div></div><div><span>add_requires</span><span>(</span><span>"imgui"</span><span>, {</span></div></div><div><div><div>3</div></div><div><span>    </span><span>configs</span><span> = {</span></div></div><div><div><div>4</div></div><div><span>        </span><span>glfw</span><span> = </span><span>true</span><span>,</span></div></div><div><div><div>5</div></div><div><span>        </span><span>opengl3</span><span> = </span><span>true</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>7</div></div><div><span>})</span></div></div><div><div><div>8</div></div><div><span>target</span><span>(</span><span>"hello"</span><span>)</span></div></div><div><div><div>9</div></div><div><span>    </span><span>set_kind</span><span>(</span><span>"binary"</span><span>)</span></div></div><div><div><div>10</div></div><div><span>    </span><span>add_files</span><span>(</span><span>"src/*.cpp"</span><span>)</span></div></div><div><div><div>11</div></div><div><span>    </span><span>add_packages</span><span>(</span><span>"glad"</span><span>, </span><span>"glfw"</span><span>, </span><span>"imgui"</span><span>, </span><span>"gtk4"</span><span>)</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h1>让 VSCode 读取 XMake 依赖<a href="#让-vscode-读取-xmake-依赖"><span>#</span></a></h1><section><h2>生成 <code>compile_commands.json</code><a href="#生成-compile_commandsjson"><span>#</span></a></h2><section><h3><a href="https://xmake.io/guide/extensions/ide-integration-plugins.html" target="_blank">自动生成</a><a href="#自动生成"><span>#</span></a></h3><ul>
<li>在 <code>xmake.lua</code> 中添加</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>add_rules</span><span>(</span><span>"plugin.compile_commands.autoupdate"</span><span>, {</span><span>outputdir</span><span> = </span><span>"[输出路径]"</span><span>})</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>或使用<a href="https://github.com/xmake-io/xmake-vscode" target="_blank">XMake 的 VSCode 插件</a>自动生成</li>
</ul></section><section><h3>手动生成<a href="#手动生成"><span>#</span></a></h3><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>xmake</span><span> </span><span>project</span><span> </span><span>-k</span><span> </span><span>compile_commands</span><span> [输出路径]</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>其中 <code>project</code> 命令用于生成项目文件, <code>-k</code> 用于选择生成的项目文件类型</p></section></section><section><h2>指定 <code>compile_commands.json</code><a href="#指定-compile_commandsjson"><span>#</span></a></h2><p>clangd <em>似乎</em>默认只读取根目录下的 <code>compile_commands.json</code></p><p>需要在 <code>.clangd</code> 中添加：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>CompileFlags</span><span>:</span></div></div><div><div><div>2</div></div><div><span>  </span><span>CompilationDatabase</span><span>: [</span><span>compile_commands.json 目录</span><span>]</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>也可以在 VSCode <code>settings.json</code> 中指定</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>"clangd.arguments"</span><span>: [</span></div></div><div><div><div>2</div></div><div><span>    </span><span>"--compile-commands-dir=[指定你的路径]"</span></div></div><div><div><div>3</div></div><div><span>]</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section>]]></content>
    </entry>
    <entry>
      <id>https://nekoside.com/posts/xterm-kitty-unknown-terminal-type/</id>
      <title type="text">&apos;xterm-kitty&apos;: unknown terminal type</title>
      <published>2026-01-12T00:00:00.000Z</published>
      <updated>2026-08-10T00:00:00.000Z</updated>
      <author><name>nekoside</name></author>
      <link rel="alternate" href="https://nekoside.com/posts/xterm-kitty-unknown-terminal-type/"/>
      <summary type="text"></summary>
      <content type="html"><![CDATA[<section><h1>问题<a href="#问题"><span>#</span></a></h1><p>在 SSH 中执行 <code>clear</code> 命令时报错, 提示 <code>'xterm-kitty': unknown terminal type</code></p></section>
<section><h1>解决方案<a href="#解决方案"><span>#</span></a></h1><section><h2>上传 kitty 的 terminfo 到服务器 (推荐)<a href="#上传-kitty-的-terminfo-到服务器-推荐"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>kitty</span><span> </span><span>+kitten</span><span> </span><span>ssh</span><span> </span><span>&lt;user&gt;@&lt;host&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h2>本地终端降级 TERM<a href="#本地终端降级-term"><span>#</span></a></h2><section><h3>bash/zsh<a href="#bashzsh"><span>#</span></a></h3><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>export</span><span> </span><span>TERM</span><span>=</span><span>xterm-256color</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>fish<a href="#fish"><span>#</span></a></h3><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>set</span><span> </span><span>-gx</span><span> </span><span>TERM</span><span> </span><span>xterm-256color</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section><section><h2>安装 <code>kitty</code><a href="#安装-kitty"><span>#</span></a></h2><p>在服务器中安装 <code>kitty</code> 即可</p><ul>
<li>Arch 系</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>sudo</span><span> </span><span>pacman</span><span> </span><span>-S</span><span> </span><span>kitty</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>Debian 系</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>sudo</span><span> </span><span>apt</span><span> </span><span>install</span><span> </span><span>kitty</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section>]]></content>
    </entry>
    <entry>
      <id>https://nekoside.com/posts/gnome-default-terminal/</id>
      <title type="text">GNOME 修改默认终端类型</title>
      <published>2026-01-10T00:00:00.000Z</published>
      <updated>2026-01-10T00:00:00.000Z</updated>
      <author><name>nekoside</name></author>
      <link rel="alternate" href="https://nekoside.com/posts/gnome-default-terminal/"/>
      <summary type="text"></summary>
      <content type="html"><![CDATA[<p>参考：<a href="https://discourse.gnome.org/t/default-terminal/1307" target="_blank">https://discourse.gnome.org/t/default-terminal/1307</a></p>
<p>将自己使用的终端发送软链接到 <code>/usr/bin</code>, 叫做 <code>gnome-terminal</code></p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>sudo</span><span> </span><span>ln</span><span> </span><span>-s</span><span> </span><span>/usr/bin/fish</span><span> </span><span>/usr/bin/gnome-terminal</span></div></div></code></pre><div><div></div><div></div></div></figure></div>]]></content>
    </entry>
    <entry>
      <id>https://nekoside.com/posts/android-rw/</id>
      <title type="text">Android 读写权限</title>
      <published>2026-01-06T00:00:00.000Z</published>
      <updated>2026-01-06T00:00:00.000Z</updated>
      <author><name>nekoside</name></author>
      <link rel="alternate" href="https://nekoside.com/posts/android-rw/"/>
      <summary type="text"></summary>
      <content type="html"><![CDATA[<section><h2><strong>新版（Android 10 就有，但默认不开，11强制开启）</strong><a href="#新版android-10-就有但默认不开11强制开启"><span>#</span></a></h2><p>MediaStore.</p></section>
<section><h2><strong>旧版（API 29及以下）</strong><a href="#旧版api-29及以下"><span>#</span></a></h2><p>NaN. 在 AndroidManifest.xml 中声明权限，并启用 <code>requestLegacy</code></p><p>NaN. 在逻辑中请求权限 :</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>requestPermissions</span><span>(</span><span>new</span><span> </span><span>String</span><span>[]{</span><span>Manifest</span><span>.</span><span>permission</span><span>.</span><span>WRITE_EXTERNAL_STORAGE</span><span><span>}</span><span>,</span><span> </span></span><span>int</span><span><span> CODE)</span><span>;</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2><strong>如何判断是否有权限</strong><a href="#如何判断是否有权限"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>ContextCompat</span><span>.</span><span>checkSelfPermission</span><span>()</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2><strong>return CODE</strong><a href="#return-code"><span>#</span></a></h2><ul>
<li>0 代表该权限被授予</li>
</ul></section>]]></content>
    </entry>
    <entry>
      <id>https://nekoside.com/posts/win11-winx-bug/</id>
      <title type="text">Windows11 下 Win+X 菜单无法使用</title>
      <published>2026-01-06T00:00:00.000Z</published>
      <updated>2026-01-06T00:00:00.000Z</updated>
      <author><name>nekoside</name></author>
      <link rel="alternate" href="https://nekoside.com/posts/win11-winx-bug/"/>
      <summary type="text"></summary>
      <content type="html"><![CDATA[<section><h1>环境<a href="#环境"><span>#</span></a></h1><ul>
<li>版本 Windows 11 专业版</li>
<li>版本号 24H2</li>
<li>操作系统版本 26100.7171</li>
<li>体验 Windows 功能体验包 1000.26100.265.0</li>
</ul></section>
<section><h1>问题描述<a href="#问题描述"><span>#</span></a></h1><p><img alt="" loading="lazy" width="231" height="94" src="/_astro/Windows11Bug.CiahXjRF_28W03w.webp" /></p><p>如图，无论右键 Windows 图标或按下 Win + X，都无法正常弹出菜单</p><p>同时，ContextMenuManager 出现以下问题（应该有关联</p><p><img alt="" loading="lazy" width="880" height="656" src="/_astro/%E5%8F%B3%E9%94%AE%E7%AE%A1%E7%90%86.6bH3VucB_ZSQYQM.webp" /></p></section>
<section><h1>解决方案<a href="#解决方案"><span>#</span></a></h1><p>未知</p></section>]]></content>
    </entry>
    <entry>
      <id>https://nekoside.com/posts/wsl-permission-denied/</id>
      <title type="text">WSL 安装提示：拒绝访问</title>
      <published>2025-12-31T00:00:00.000Z</published>
      <updated>2025-12-31T00:00:00.000Z</updated>
      <author><name>nekoside</name></author>
      <link rel="alternate" href="https://nekoside.com/posts/wsl-permission-denied/"/>
      <summary type="text"></summary>
      <content type="html"><![CDATA[<p>明明已经提权，但仍提示拒绝访问，可以添加参数从 web 下载而非 Microsoft Store</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>wsl </span><span>--</span><span>install </span><span>--</span><span>web</span><span>-</span><span>download</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div>]]></content>
    </entry>
    <entry>
      <id>https://nekoside.com/posts/fix-github-notification/</id>
      <title type="text">修复 Github Notifications Bug</title>
      <published>2025-09-27T00:00:00.000Z</published>
      <updated>2025-09-27T00:00:00.000Z</updated>
      <author><name>nekoside</name></author>
      <link rel="alternate" href="https://nekoside.com/posts/fix-github-notification/"/>
      <summary type="text"></summary>
      <content type="html"><![CDATA[<p><a href="https://github.com/orgs/community/discussions/6874#discussioncomment-14507162" target="_blank">https://github.com/orgs/community/discussions/6874#discussioncomment-14507162</a></p>]]></content>
    </entry>
    <entry>
      <id>https://nekoside.com/posts/vscode-run-rust/</id>
      <title type="text">VSCode 一键运行 Rust</title>
      <published>2025-09-05T00:00:00.000Z</published>
      <updated>2025-09-05T00:00:00.000Z</updated>
      <author><name>nekoside</name></author>
      <link rel="alternate" href="https://nekoside.com/posts/vscode-run-rust/"/>
      <summary type="text"></summary>
      <content type="html"><![CDATA[<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>{</span></div></div><div><div><div>2</div></div><div><span>  </span><span>"key"</span><span>: </span><span>"f5"</span><span>,</span></div></div><div><div><div>3</div></div><div><span>  </span><span>"command"</span><span>: </span><span>"workbench.action.terminal.sendSequence"</span><span>,</span></div></div><div><div><div>4</div></div><div><span>  </span><span>"args"</span><span>: {</span></div></div><div><div><div>5</div></div><div><span>    </span><span>"text"</span><span>: </span><span>"cargo run</span><span>\u000D</span><span>"</span></div></div><div><div><div>6</div></div><div><span><span>  </span></span><span>},</span></div></div><div><div><div>7</div></div><div><span>  </span><span>"when"</span><span>: </span><span>"inRustProject"</span></div></div><div><div><div>8</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<p>添加到 Keybinding.json 中</p>
<blockquote><p><a href="https://stackoverflow.com/questions/72925072/how-to-create-a-shortcut-to-build-and-run-rust-code-from-inside-vs-code" target="_blank">https://stackoverflow.com/questions/72925072/how-to-create-a-shortcut-to-build-and-run-rust-code-from-inside-vs-code</a></p></blockquote>
<p>同时修改 CMake 拓展的快捷键防止冲突</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>{</span></div></div><div><div><div>2</div></div><div><span>  </span><span>"key"</span><span>: </span><span>"f5"</span><span>,</span></div></div><div><div><div>3</div></div><div><span>  </span><span>"command"</span><span>: </span><span>"cmake.launchTarget"</span><span>,</span></div></div><div><div><div>4</div></div><div><span>  </span><span>"when"</span><span>: </span><span>"resourceLangId  cpp || resourceLangId  c"</span></div></div><div><div><div>5</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div>]]></content>
    </entry>
    <entry>
      <id>https://nekoside.com/posts/pwsh-backspace-bug/</id>
      <title type="text">Powershell 退格和 Delete 出现黑色背景</title>
      <published>2025-08-28T00:00:00.000Z</published>
      <updated>2025-08-28T00:00:00.000Z</updated>
      <author><name>nekoside</name></author>
      <link rel="alternate" href="https://nekoside.com/posts/pwsh-backspace-bug/"/>
      <summary type="text"></summary>
      <content type="html"><![CDATA[<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>powershell </span><span>-</span><span>noprofile </span><span>-</span><span>command </span></span><span>"Install-Module PSReadLine -Force -SkipPublisherCheck -scope allusers"</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<p>运行上述命令</p>
<blockquote><p><a href="https://github.com/microsoft/terminal/issues/6767" target="_blank">https://github.com/microsoft/terminal/issues/6767</a></p><p><a href="https://github.com/microsoft/terminal/issues/14619" target="_blank">https://github.com/microsoft/terminal/issues/14619</a></p></blockquote>]]></content>
    </entry>
    <entry>
      <id>https://nekoside.com/posts/windows-fix-gameoverlay-popup/</id>
      <title type="text">Windows 卸载 GameOverLay 后禁用弹出窗口</title>
      <published>2025-08-24T00:00:00.000Z</published>
      <updated>2025-08-24T00:00:00.000Z</updated>
      <author><name>nekoside</name></author>
      <link rel="alternate" href="https://nekoside.com/posts/windows-fix-gameoverlay-popup/"/>
      <summary type="text"></summary>
      <content type="html"><![CDATA[<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>reg add HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\GameDVR </span><span>/</span><span>f </span><span>/</span><span>t REG_DWORD </span><span>/</span><span>v </span></span><span>"AppCaptureEnabled"</span><span><span> </span><span>/</span><span>d </span></span><span>0</span></div></div><div><div><div>2</div></div><div><span><span>reg add HKEY_CURRENT_USER\System\GameConfigStore </span><span>/</span><span>f </span><span>/</span><span>t REG_DWORD </span><span>/</span><span>v </span></span><span>"GameDVR_Enabled"</span><span><span> </span><span>/</span><span>d </span></span><span>0</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<blockquote><p><a href="https://learn.microsoft.com/en-us/answers/questions/3739326/how-to-stop-the-ms-gamingoverlay-popup" target="_blank">https://learn.microsoft.com/en-us/answers/questions/3739326/how-to-stop-the-ms-gamingoverlay-popup</a></p></blockquote>]]></content>
    </entry>
    <entry>
      <id>https://nekoside.com/posts/package-manifest-does-not-exist/</id>
      <title type="text">error：package Manifest does not exist</title>
      <published>2024-12-07T00:00:00.000Z</published>
      <updated>2026-09-11T00:00:00.000Z</updated>
      <author><name>nekoside</name></author>
      <link rel="alternate" href="https://nekoside.com/posts/package-manifest-does-not-exist/"/>
      <summary type="text"></summary>
      <content type="html"><![CDATA[<p>解决：导入这个包<sup><a href="#user-content-fn-stackoverflow">1</a></sup></p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>import</span><span> </span><span>android.Manifest</span><span>;</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<section><h2>Preferences<a href="#preferences"><span>#</span></a></h2></section>
<section><h2>Footnotes<a href="#footnote-label"><span>#</span></a></h2>
<ol>
<li>
<p><a href="https://stackoverflow.com/a/75235573" target="_blank">Stack Overflow - android manifest is not recognized in activity</a> <a href="#user-content-fnref-stackoverflow">↩</a></p>
</li>
</ol>
</section>]]></content>
    </entry>
    <entry>
      <id>https://nekoside.com/posts/hexo-deploy-to-cloud/</id>
      <title type="text">Hexo 部署博客到云端</title>
      <published>2024-11-29T00:00:00.000Z</published>
      <updated>2024-11-29T00:00:00.000Z</updated>
      <author><name>nekoside</name></author>
      <link rel="alternate" href="https://nekoside.com/posts/hexo-deploy-to-cloud/"/>
      <summary type="text"></summary>
      <content type="html"><![CDATA[<p>环境： <code>Windows 10</code></p>
<section><h2>1. 安装 <code>Git</code><a href="#1-安装-git"><span>#</span></a></h2><p><a href="https://git-scm.com/" target="_blank">Git</a></p></section>
<section><h2>2. 安装 <code>Node.js</code><a href="#2-安装-nodejs"><span>#</span></a></h2><p><a href="https://nodejs.org/" target="_blank">Node.js</a></p></section>
<section><h2>3. 安装 <code>Hexo</code><a href="#3-安装-hexo"><span>#</span></a></h2><p><a href="https://hexo.io/" target="_blank">Hexo</a></p></section>
<section><h2>4. 安装数学渲染器 <code>Pandoc</code><a href="#4-安装数学渲染器-pandoc"><span>#</span></a></h2><p><a href="https://pandoc.org/" target="_blank">Pandoc 官网</a></p><p><a href="https://github.com/jgm/pandoc/releases" target="_blank">Pandoc Github 地址</a></p></section>
<section><h2>自动部署脚本<a href="#自动部署脚本"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>cmd</span><span> /k </span><span>"&lt;你的blog所在盘符&gt;: cd &lt;你的blog根目录&gt; &amp;&amp; npx hexo clean &amp;&amp; npx hexo d"</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>另存为 <em>bat</em> 文件.</p></section>
<section><h2>如果重装系统<a href="#如果重装系统"><span>#</span></a></h2><p>如果重装系统，在完成上述步骤后，需要重新获取对仓库的访问权限.</p><p>此处以 Github 仓库为例:</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>ssh-keygen</span><span> </span><span>-t</span><span> </span><span>ed25519</span><span> </span><span>-b</span><span> </span><span>4096</span><span> </span><span>-C</span><span> </span><span>"your_email@example.com"</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><code>-t rsa</code> 指定了加密算法类型（type）为 <em>Ed25519</em> 算法,</p><p>不支持该算法的计算机可以用 <em>rsa</em> 算法</p><p>摘自 Github Docs</p><blockquote><p>If you are using a legacy system that doesn’t support the Ed25519 algorithm, use:</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>ssh-keygen</span><span> </span><span>-t</span><span> </span><span>rsa</span><span> </span><span>-b</span><span> </span><span>4096</span><span> </span><span>-C</span><span> </span><span>"your_email@example.com"</span></div></div></code></pre><div><div></div><div></div></div></figure></div></blockquote><p><code>-b 4096</code> 指定了 key 的大小（bits）为 4096（默认为 2048）</p><p>使用该命令在默认路径 （AppData 的 .ssh） 下生成公钥和私钥,</p><p>然后 <strong>将公钥添加至 Github</strong>:</p><p>在 Github 的 Settings -&gt; SH and GPG keys 中添加一个新的 SSH key.</p><p><img alt="" loading="lazy" width="358" height="196" src="/_astro/github-add-key.CX-B7u3e_nMJom.webp" /></p><p>最后重新运行刚刚的 bat 文件进行部署.</p><p>如果无法连接到 22 端口，</p><p>在 ~/.ssh 下创建 config 文件，并写入</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>Host</span><span> </span><span>github.com</span></div></div><div><div><div>2</div></div><div><span>Hostname ssh.github.com</span></div></div><div><div><div>3</div></div><div><span>Port</span><span> </span><span>443</span></div></div><div><div><div>4</div></div><div><span>User</span><span> git</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>后在 PowerShell 输入</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>ssh</span><span> </span><span>-T</span><span> </span><span>git@github.com</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>如果询问，输入 yes</p></section>
<section><h2>图片路径问题<a href="#图片路径问题"><span>#</span></a></h2><p>图片粘贴到 MarkDown 文件后，在本地正常预览，但部署后无法正常预览（生成的 html 路径有误），</p><p>使用 <a href="https://github.com/yiyungent/hexo-asset-img" target="_blank">hexo-assets-img</a> 解决, （需要删除其他修复 hexo 图片路径的插件）</p><p>具体见 README.</p></section>
<section><h2>参考 Reference<a href="#参考-reference"><span>#</span></a></h2><blockquote><p><a href="https://stackoverflow.com/questions/51834225/why-use-t-rsa-b-4096-with-ssh-keygen" target="_blank">Stack Overflow</a></p><p><a href="https://docs.github.com/en/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent" target="_blank">GitHub Docs</a></p></blockquote></section>]]></content>
    </entry>
    <entry>
      <id>https://nekoside.com/posts/sseedit-garbled-text/</id>
      <title type="text">SSEEdit中文乱码解决方案</title>
      <published>2024-08-29T00:00:00.000Z</published>
      <updated>2026-07-13T00:00:00.000Z</updated>
      <author><name>nekoside</name></author>
      <link rel="alternate" href="https://nekoside.com/posts/sseedit-garbled-text/"/>
      <summary type="text"></summary>
      <content type="html"><![CDATA[<p>转自</p>
<blockquote><p><a href="https://c.tieba.baidu.com/p/6817311646" target="_blank">百度贴吧</a></p><p>用户 @暮林芬弥</p></blockquote>
<section><h2>解决方法<a href="#解决方法"><span>#</span></a></h2><section><h3>4.0.1 之前的 SSEEdit<a href="#401-之前的-sseedit"><span>#</span></a></h3><p>在 MO 的启动参数中添加</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>-cp:utf8</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>此方法对我的 4.1.5 不起作用</p></section><section><h3>4.0.1 之后的 SSEEdit<a href="#401-之后的-sseedit"><span>#</span></a></h3><p>在以下路径中找到 <code>Plugins.sseviewsettings</code> 文件并修改</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;SystemDisk&gt;:\Users\&lt;UserName&gt;\AppData\Local\Skyrim Special Edition\</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>在文件末添加以下内容</p><div><figure><figcaption><span>Plugins.sseviewsettings</span></figcaption><pre><code><div><div><div>1</div></div><div><span>[cpoverride]</span></div></div><div><div><div>2</div></div><div><span>english</span><span><span>=</span><span>utf8</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>重新打开 SSEEdit.</p></section></section>]]></content>
    </entry>
    <entry>
      <id>https://nekoside.com/posts/skyrim-downgrade/</id>
      <title type="text">上古卷轴5 (Skyrim) 如何降级</title>
      <published>2024-08-10T00:00:00.000Z</published>
      <updated>2026-09-11T00:00:00.000Z</updated>
      <author><name>nekoside</name></author>
      <link rel="alternate" href="https://nekoside.com/posts/skyrim-downgrade/"/>
      <summary type="text"></summary>
      <content type="html"><![CDATA[<div><div><div></div><div>Note</div></div><div><p>本文介绍的是 Steam SSE (<strong>S</strong>kyrim <strong>S</strong>pecial <strong>E</strong>dition) 版本而非 LE (<strong>L</strong>egendary <strong>E</strong>dition) 版本。</p><p>但方案一的降级原理应当<sup>?</sup>适用于任何其他 Steam 游戏或软件。</p><p>对应的包 id 可以从 <a href="https://steamdb.info/" target="_blank">steamdb</a> 查询，例如：</p><p><a href="https://steamdb.info/app/489830/depots/" target="_blank">https://steamdb.info/app/489830/depots/</a></p><p><a href="https://steamdb.info/depot/489832/manifests/" target="_blank">https://steamdb.info/depot/489832/manifests/</a></p><p>格式为：</p><p><code>download_depot &lt;app id&gt; &lt;depot id&gt; &lt;manifest id&gt;</code></p></div></div>
<section><h1>方案一：手动从 steam 下载<a href="#方案一手动从-steam-下载"><span>#</span></a></h1><p>参考：</p><blockquote><p><a href="https://tieba.baidu.com/p/7884019542" target="_blank">Steam 如何下载游玩特别版 1.5.97 版本【上古卷轴吧】</a></p><p>作者：贴吧@Zelzone</p></blockquote><section><h2>1.在 steam 下载本体<a href="#1在-steam-下载本体"><span>#</span></a></h2><div><div><div></div><div>Note</div></div><div><p>也许你可以不用下载本体，直接使用控制台下载特定版本，但是我没有试过。</p></div></div><p>像往常一样下载 Skyrim</p></section><section><h2>2.打开 Steam 控制台<a href="#2打开-steam-控制台"><span>#</span></a></h2><p>Win+R 执行以下命令打开 Steam 控制台（打开慢稍等一下）</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>steam://nav/console</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h2>3.下载目标版本的游戏文件<a href="#3下载目标版本的游戏文件"><span>#</span></a></h2><p>根据你需要的游戏版本分别下载三份文件包。</p><section><h3>1.5.97<a href="#1597"><span>#</span></a></h3><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>download_depot 489830 489831 7848722008564294070</span></div></div></code></pre><div><div></div><div></div></div></figure></div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>download_depot 489830 489832 8702665189575304780</span></div></div></code></pre><div><div></div><div></div></div></figure></div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>download_depot 489830 489833 2289561010626853674</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>1.6.1170<a href="#161170"><span>#</span></a></h3><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>download_depot 489830 489831 8442952117333549665</span></div></div></code></pre><div><div></div><div></div></div></figure></div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>download_depot 489830 489832 8042843504692938467</span></div></div></code></pre><div><div></div><div></div></div></figure></div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>download_depot 489830 489833 1914580699073641964</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>下载完后打开本体目录，将所有内容删除，然后把刚刚下载的三个文件夹里的内容复制到游戏根目录。</p><p>下载目录位于 <code>Steam\steamapps\content</code> 中</p><p><code>installscript.vdf</code> 可删除。</p></section></section></section>
<section><h1>方案二：n 网降级补丁<a href="#方案二n-网降级补丁"><span>#</span></a></h1><p>补丁地址</p><blockquote><p><a href="https://www.nexusmods.com/skyrimspecialedition/mods/57618" target="_blank">Unofficial Skyrim Special Edition Downgrade Patcher (nexusmods.com)</a></p></blockquote><p>具体看补丁 Description.</p></section>]]></content>
    </entry>
</feed>
