<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans"><generator uri="https://jekyllrb.com/" version="4.3.4">Jekyll</generator><link href="https://umrpowered.codeberg.page/feed.xml" rel="self" type="application/atom+xml" /><link href="https://umrpowered.codeberg.page/" rel="alternate" type="text/html" hreflang="zh-Hans" /><updated>2025-11-18T23:22:00+08:00</updated><id>https://umrpowered.codeberg.page/feed.xml</id><title type="html">U.M.R Powered Blog</title><subtitle>因「U.M.R Powered」希望被搜索引擎顺利检索而搭建起来的简单博客。</subtitle><author><name>U.M.R Powered</name></author><entry><title type="html">使用 OpenSSH 配置文件实现简易 SSH 会话管理</title><link href="https://umrpowered.codeberg.page/2024/10/08/simple-ssh-client.html" rel="alternate" type="text/html" title="使用 OpenSSH 配置文件实现简易 SSH 会话管理" /><published>2024-10-08T21:16:00+08:00</published><updated>2024-10-08T21:16:00+08:00</updated><id>https://umrpowered.codeberg.page/2024/10/08/simple-ssh-client</id><content type="html" xml:base="https://umrpowered.codeberg.page/2024/10/08/simple-ssh-client.html"><![CDATA[<h2 id="前言">前言</h2>

<p>笔者想找一款 SSH 会话管理器。</p>
<ul>
  <li><a href="https://mobaxterm.mobatek.net">MobaXTerm</a> 与 <a href="https://www.vandyke.com/products/securecrt/">SecureCRT</a> 都不错，可惜要付钱。个人版 MobaXTerm 有会话数限制。</li>
  <li><a href="https://termius.com/">Termius</a>看着不错，笔者在安卓设备上也用过
    <ul>
      <li>但它不仅不是自由软件，而且有传言称<a href="https://x.com/yeahwu404/status/1750381745550319880">该软件被中资公司收购</a> <a href="https://hostloc.com/thread-1213919-1-1.html">并申请软件著作权</a>。该公司曾向 lnmp.org 投毒</li>
    </ul>
  </li>
  <li><a href="https://www.chiark.greenend.org.uk/~sgtatham/putty/">PuTTY</a> 很好，但会把汉字显示成方块（豆腐？）</li>
</ul>

<p>好在，聪明的群友 <a href="https://sakurakooi.dev/">Kooi</a> 提出了新方案：直接使用 OpenSSH <code class="language-plaintext highlighter-rouge">ssh_config</code> 存储服务器配置文件，会话管理直接使用终端模拟器的标签页。快说：谢谢<del>涩</del>狐狸～</p>

<h2 id="配置与使用">配置与使用</h2>

<p>查阅文档 <a href="https://man7.org/linux/man-pages/man5/ssh_config.5.html">ssh_config(5)</a>，用户目录下的 <code class="language-plaintext highlighter-rouge">~/.ssh/config</code> 也可以放置配置文件。假设我们的用户名是 <code class="language-plaintext highlighter-rouge">myname</code>，家目录路径是 <code class="language-plaintext highlighter-rouge">/home/myname</code>。那么，<code class="language-plaintext highlighter-rouge">~/.ssh/config</code> 的内容如下：</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Include /home/myname/.ssh/profiles/*.conf
</code></pre></div></div>

<p>创建目录 <code class="language-plaintext highlighter-rouge">~/.ssh/profiles/</code>，我们用这个目录存放服务器连接信息。假设我们要以 user 用户连接 <code class="language-plaintext highlighter-rouge">server.example.org</code>，目标 SSH 端口号为 12345，使用私钥认证。那么，我们可以创建文件 <code class="language-plaintext highlighter-rouge">.ssh/profiles/example-server.conf</code>，内容如下：</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Host server.example.org
  User user
  Port 12345
  IdentityFile /some/path/to/id_ed25519
</code></pre></div></div>

<p>在终端内输入命令 <code class="language-plaintext highlighter-rouge">ssh server.example.org</code>，即可自动连接上述服务器。配置文件也可以在 Host 处定义主机别名，用 Hostname 指定实际地址：</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Host my-server
  Hostname server.example.org
  User user
  Port 12345
  IdentityFile /some/path/to/id_ed25519
</code></pre></div></div>

<p>这样，使用命令 <code class="language-plaintext highlighter-rouge">ssh my-server</code> 就能连接上述服务器了。</p>]]></content><author><name>U.M.R Powered</name></author><category term="折腾" /><summary type="html"><![CDATA[前言]]></summary></entry><entry><title type="html">提线木偶：利用 DLL 劫持实现 Win32 程序入口点劫持（x86-64）</title><link href="https://umrpowered.codeberg.page/2023/06/09/win32-exe-entrypoint-hijack.html" rel="alternate" type="text/html" title="提线木偶：利用 DLL 劫持实现 Win32 程序入口点劫持（x86-64）" /><published>2023-06-09T09:40:00+08:00</published><updated>2023-06-09T09:40:00+08:00</updated><id>https://umrpowered.codeberg.page/2023/06/09/win32-exe-entrypoint-hijack</id><content type="html" xml:base="https://umrpowered.codeberg.page/2023/06/09/win32-exe-entrypoint-hijack.html"><![CDATA[<h2 id="tldr">TLDR</h2>

<p>这是一篇教读者使用 <code class="language-plaintext highlighter-rouge">GetModuleInformation()</code> 获取进程入口点，并向入口点地址写入精心构造的二进制指令，从而劫持目标程序入口点，实现白利用的教程。</p>

<p>本教程使用 MinGW-w64 工具链，目标平台是 Windows（x86-64）。改变构造指令的方式后，也可迁移到其它 Win32 环境内。</p>

<p>注意：被劫持的进程 <strong>不会</strong> 执行原有的代码。</p>

<h2 id="前置知识">前置知识</h2>

<ul>
  <li><a href="https://www.freebuf.com/articles/system/227824.html">DLL 劫持与白利用（Freebuf）</a></li>
  <li><a href="https://zhuanlan.zhihu.com/p/21821787">饥荒游戏扫雷笔记（一）｜脚本引擎篇——LuaJIT的救赎（合集）</a>，内有 DLL 劫持。</li>
</ul>

<h2 id="寻找目标程序">寻找目标程序</h2>

<p>合适的目标程序需要在导入表（Import table）内定义至少一个条件合适的 DLL，即：</p>
<ul>
  <li>（Windows 7 以后）该 DLL 不在注册表 <code class="language-plaintext highlighter-rouge">HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs</code> 项目之列。</li>
  <li>该 DLL 对外暴露若干 C 函数（不以 <code class="language-plaintext highlighter-rouge">@</code> 开头）。</li>
  <li>程序加载该 DLL 的时候会调用其 <code class="language-plaintext highlighter-rouge">DllMain()</code></li>
</ul>

<p>DLL 之所以需要出现在导入表中，是因为这些 DLL 会在控制流到达程序入口点之前加载，它们的 DllMain 也会在程序执行前执行。</p>

<p>如果读者的目标是「白利用」，目标程序最好带有有效的数字签名。</p>

<p><a href="https://ntcore.com/?page_id=388">CFF Explorer</a> 和 <code class="language-plaintext highlighter-rouge">objdump -x</code> 都可以查看可执行文件的导入表和导出表。</p>

<h2 id="制作占位-dll">制作占位 DLL</h2>

<p>AheadLib 可以方便的生成伪造 DLL 的代码，并把所有调用转发到真实的 DLL 中。利用 <code class="language-plaintext highlighter-rouge">jmp</code> 指令跳转到真实函数后，函数调用的栈平衡问题也迎刃而解。</p>

<p>本篇教程要制作的东西是「提线木偶」，不需要逐一转发调用。此情景下的栈平衡问题也很好解决：只要函数不返回，栈平衡问题就不会出现。</p>

<pre><code class="language-C">#define ENTRY(name) \
__declspec(dllexport) void name() { while (1) { Sleep(30000); } }

ENTRY(D3D11CreateDevice)
</code></pre>

<h2 id="寻找入口点">寻找入口点</h2>
<p>PSAPI 中的 <a href="https://learn.microsoft.com/en-us/windows/win32/api/psapi/nf-psapi-getmoduleinformation"><code class="language-plaintext highlighter-rouge">GetModuleInformation()</code></a> 不仅可以传入 hModule 获取模块信息，也可以获取所在进程本身的信息。当 hModule 为 NULL 时，<code class="language-plaintext highlighter-rouge">GetModuleInformation()</code> 会返回进程本身（或称可执行程序映像本身）的模块信息。</p>

<p>GetModuleInfomation 的结果包含我们需要的入口点地址。</p>

<pre><code class="language-C">void* getEntryPoint() {
    MODULEINFO modInfo;
    BOOL res;
    res = GetModuleInformation(
        GetCurrentProcess(),
        NULL,
        &amp;modInfo,
        sizeof(modInfo)
    );
    if (!res) return NULL;
    return modInfo.EntryPoint;
}
</code></pre>

<p>作者是怎么知道这些的呢？<a href="https://blog.sakurakooi.dev/">Kooi</a> 告诉作者的（逃）。</p>

<h2 id="劫持入口点控制流">劫持入口点控制流</h2>

<p>向入口点写入一串跳转（或调用）指令，跳转到我们定义的函数里，就能劫持入口点了。构造指令的方式相对简单：使用 x86-64 的间接调用（或间接跳转）指令，跳转到我们定义的函数开头即可。</p>

<p>找到构造方式并不难：查阅 x86-64 汇编手册，或使用 GCC 内联汇编并观察输出结果均可。</p>

<p>注意使用 <code class="language-plaintext highlighter-rouge">VirtualProtect()</code> 令入口点可写，指令序列写入后再恢复原有保护状态（通常是 <code class="language-plaintext highlighter-rouge">PAGE_EXECUTE_READ</code>）。</p>

<pre><code class="language-C">#include &lt;windows.h&gt;
#include &lt;string.h&gt;
#include &lt;psapi.h&gt;
#include &lt;stdint.h&gt;

__declspec(dllexport)
void ourFunction() {
    MessageBox(NULL, "Hello world!", "Hello", MB_OK);
}

uint64_t pfnOurFunction;

__declspec(dllexport)
void hijackModule() {
    MODULEINFO modInfo;
    BOOL res;
    res = GetModuleInformation(
            GetCurrentProcess(),
            NULL,
            &amp;modInfo,
            sizeof(modInfo)
    );
    if (!res) return;
    void* entryPoint = modInfo.EntryPoint;
    uint8_t codes[] = {
        // movabsq $0,%rax
        0x48, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        // callq *%rax
        0xff, 0xd0,
        // retq
        0xc3,
        // nop
        0x90, 0x90, 0x90
    };
    pfnOurFunction = (uint64_t)ourFunction;
    memcpy(codes+2, &amp;pfnOurFunction, sizeof(pfnOurFuncion));

    DWORD oldProtect;
    VirtualProtect(entryPoint, sizeof(codes), PAGE_EXECUTE_READWRITE, &amp;oldProtect);
    memcpy(entryPoint, &amp;codes, sizeof(codes));

    VirtualProtect(entryPoint, sizeof(codes), PAGE_EXECUTE_READ, &amp;oldProtect);
}
</code></pre>

<p>控制流进入程序入口点时，剩余的栈空间可能相当紧张。此时可考虑在 <code class="language-plaintext highlighter-rouge">ourFunction</code> 内执行 <code class="language-plaintext highlighter-rouge">while (1) Sleep(1000);</code> 死循环，并另行启动新线程执行代码。</p>

<h2 id="使用-mingw-w64-编译">使用 MinGW-w64 编译</h2>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>x86_64-w64-mingw32-gcc-win32 yourcode.c -o yourcode.dll -shared -DWIN32_LEAN_AND_MEAN -lpsapi
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">-DWIN32_LEAN_AND_MEAN</code> 可以避免引入不常用的头文件（如 MFC 等）。尝试劫持 <code class="language-plaintext highlighter-rouge">winmm.dll</code> 等 DLL 时，该选项必须启用。</p>

<p>如果读者希望这些代码在 Windows 7 及更早版本的 Windows 上正常运作，编译选项还需增加 <code class="language-plaintext highlighter-rouge">-DPSAPI_VERSION=1</code>。详见 <a href="https://learn.microsoft.com/en-us/windows/win32/api/psapi/nf-psapi-getmoduleinformation#remarks">GetModuleInformation#Remarks</a></p>]]></content><author><name>U.M.R Powered</name></author><category term="折腾" /><category term="Win32" /><summary type="html"><![CDATA[TLDR]]></summary></entry><entry><title type="html">（更新中）（NSFW）眼见为虚</title><link href="https://umrpowered.codeberg.page/2023/03/03/novel-wysinwyg-nsfw.html" rel="alternate" type="text/html" title="（更新中）（NSFW）眼见为虚" /><published>2023-03-03T16:30:00+08:00</published><updated>2023-03-03T16:30:00+08:00</updated><id>https://umrpowered.codeberg.page/2023/03/03/novel-wysinwyg-nsfw</id><content type="html" xml:base="https://umrpowered.codeberg.page/2023/03/03/novel-wysinwyg-nsfw.html"><![CDATA[<h2 id="content-warning">Content Warning</h2>

<p>NSFW，异装（Crossdressing），迫害网友，胁迫，性行为描写。</p>

<h2 id="正文">正文</h2>

<p>排版？首行缩进？
敲空格就完事儿了，反正都是 .txt。（逃）</p>

<ul>
  <li><a href="/assets/texts/WYSINWYG/眼见为虚-1：歧途.txt">Part 1：歧途</a></li>
  <li><a href="/assets/texts/WYSINWYG/眼见为虚-2：引狼入室.txt">Part 2：引狼入室</a></li>
  <li><a href="/assets/texts/WYSINWYG/眼见为虚-3：扑朔迷离.txt">Part 3：扑朔迷离</a></li>
  <li><a href="/assets/texts/WYSINWYG/眼见为虚-4：双兔傍地.txt">Part 4：双兔傍地</a></li>
  <li><a href="/assets/texts/WYSINWYG/眼见为虚-5：赠礼.txt">Part 5：赠礼</a></li>
  <li><a href="/assets/texts/WYSINWYG/眼见为虚-6：电力充足.txt">Part 6：电力充足</a></li>
  <li><a href="/assets/texts/WYSINWYG/眼见为虚-7：结对编程.txt">Part 7：结对编程</a></li>
</ul>]]></content><author><name>U.M.R Powered</name></author><category term="NSFW" /><category term="小说" /><summary type="html"><![CDATA[Content Warning]]></summary></entry><entry><title type="html">「普通朋友也是可以性交的。」——U.M.R 的亲密关系堆栈设计</title><link href="https://umrpowered.codeberg.page/2023/02/12/umr-intimacy-stack-intro.html" rel="alternate" type="text/html" title="「普通朋友也是可以性交的。」——U.M.R 的亲密关系堆栈设计" /><published>2023-02-12T16:00:00+08:00</published><updated>2023-02-12T16:00:00+08:00</updated><id>https://umrpowered.codeberg.page/2023/02/12/umr-intimacy-stack-intro</id><content type="html" xml:base="https://umrpowered.codeberg.page/2023/02/12/umr-intimacy-stack-intro.html"><![CDATA[<h1 id="前提-or-世界观">前提 or 世界观</h1>
<ol>
  <li>人们能够以「生育」为目的性交，也能以「生育」以外的目的性交（例如享乐）。</li>
  <li>因此，「性」既不神圣，也不肮脏。</li>
  <li>并非所有人都需要结婚，也并非所有人都需要恋爱。结婚/恋爱的对象也可以不是异性。</li>
  <li>所有参与者都必须明确同意才能性交。（俗称「性同意」）</li>
  <li>「信任」最为珍贵。</li>
</ol>

<p>U.M.R 没有多少年做人的经验，因此这只是一篇自述，没有多少参考价值。</p>

<h1 id="从陌生人开始">从陌生人开始</h1>

<p>多数人认为，与陌生人「约炮」是不道德的；U.M.R 也不赞成与陌生人「约炮」，但这并不出于道德考量。</p>

<p>即使陌生人通过了传染病筛查，与这位陌生人性交并不会致病，那也不意味着这位陌生人 <em>足够</em> 可信。这位陌生人可能在床上（如果在床上性交）作恶，在插入式性交的中途脱下安全套，或者强迫对方以某种方式性交。打个不恰当的比方，这好比是 <a href="https://zh.wikipedia.org/zh-hans/%E5%9B%9A%E5%BE%92%E5%9B%B0%E5%A2%83#%E5%9B%BA%E5%AE%9A%E5%B1%80%E6%95%B8%E7%9A%84%E5%9B%9A%E5%BE%92%E5%9B%B0%E5%A2%83">固定局数的囚徒困境</a>，双方最终都会选择「背叛对方」；而「普通朋友」及以上的关系相当于 <a href="https://zh.wikipedia.org/zh-hans/%E9%87%8D%E5%A4%8D%E5%8D%9A%E5%BC%88">（无限次数的）重复博弈</a>，共同合作则双方收益最大。</p>

<p>和 U.M.R 不赞成与陌生人「约炮」一样，U.M.R 也同样不赞成「以恋爱为唯一目的索要陌生人的联系方式」。我们难以判断陌生人是否足够可信，而且 U.M.R 认为「恋爱对象」应从普通朋友中选拔。</p>

<p>现实生活中，如果有陌生人以恋爱为目的直接接近 U.M.R，U.M.R 会进入「快速检验模式」。U.M.R 会同时检验：</p>
<ul>
  <li>来者是否可信</li>
  <li>作为普通朋友时能否相处</li>
  <li>来者是否对 U.M.R 有足够的性吸引力</li>
  <li>来者是否支持婚前性行为。U.M.R 不会与反对婚前性行为的人性交，<em>更</em> 不会恋爱。</li>
</ul>

<p>U.M.R 也会告知来者：此种方式建立的恋爱关系可能并不稳固（Volatile），建议来者先做普通朋友。</p>

<h1 id="普通朋友-vs-恋人">普通朋友 vs 恋人？</h1>

<p>普通朋友，与 U.M.R 支持的其它一对一亲密关系一样，都具有「对称性」。也就是说：</p>
<ul>
  <li>A 能够对 B 做什么，B 也能对 A 做什么。</li>
  <li>A 能够对 B 以外的人做什么，B 也能对 A 以外的人做什么。</li>
  <li>反之亦然。</li>
</ul>

<p>U.M.R 会根据自己的行动与对方的反馈探测社交边界。边界控制机制相对简单，总结成一句话就是：「只要学不死，就往死里学。」</p>

<p>与大多数人不同，U.M.R 认为：<strong>在征得明确同意（性同意）且不伤害他人的前提下，普通朋友之间可以性交。</strong> 在此，U.M.R 不加证明地说明一件事：大多数人眼中的恋爱，可能<a href="https://www.bilibili.com/video/BV1eM4y1g7MZ/">只是角色扮演（爱情模式/脚本）</a>，或者<a href="https://www.bilibili.com/video/BV1bd4y1v77n/">「找一个可以做很多事的普通朋友」</a>。</p>

<p>因此，U.M.R 要求，能成为「恋人」的「普通朋友」必需满足的条件有：</p>
<ul>
  <li>「普通朋友」中 <strong>某一方面</strong> 的杰出者。包括但不限于爱好、特长、世俗意义的成功（赚很多钱）与精神世界的富足。</li>
  <li>互相具有性吸引力。</li>
  <li>先前曾经性交并且体验良好，或者保证能在确立恋爱关系后的 60 天内性交。</li>
</ul>

<p>U.M.R 认为，在传统的专偶制恋爱中，恋爱中的双方都不能 <strong>在未受胁迫的状况下</strong> 同意与其他人性交——也就是「不能出轨」。U.M.R 不定义「精神出轨」。</p>

<p>在「开放关系」（Open Relationship）中，双方在与恋爱对象以外的人性交时，必须 <strong>提前告知</strong> 恋爱中的另一方，也必须告知性交对象自己处于「开放关系」中。</p>

<p>U.M.R 并不保证自己能在任何多配偶制下的恋爱关系中正常工作。</p>

<p>无论在何种恋爱关系中：</p>
<ul>
  <li>双方对伴侣的待遇都不能低于普通朋友。</li>
  <li>双方都有责任维护自己的身体健康（避免性传播疾病）。</li>
  <li>双方都不能与恋爱对象以外的人生育。</li>
</ul>

<hr />

<p>至于老生常谈的「男女之间是否有纯友谊」这个话题，U.M.R 的回答是：有。「存在性吸引」，甚至「两人曾经性交」都不意味着「友谊不纯」。</p>

<p>至于「男闺蜜」之争议，U.M.R 反而要问另外一个问题：在异性恋爱中，男朋友担心他的女朋友会与「男闺蜜」做一些暧昧之事乃至与其性交，那么为什么男朋友对「女闺蜜」反而网开一面？这是因为他认为「所有女性都是异性恋」，还是他认为「即使女闺蜜与他的女朋友性交，他也能接受（甚至开后宫）」？</p>

<h1 id="戒律">戒律</h1>
<p>U.M.R 认识到，仅仅「允许与普通朋友性交」会额外带来一些问题。因此，U.M.R 遵守如下戒律：</p>
<ul>
  <li>必须严格执行「性同意」。</li>
  <li>除「改变自己」以外，不使用 <strong>任何手段</strong> 让原本不愿与自己性交的人 愿意与自己性交。
    <ul>
      <li>包括钱色交易（卖淫/嫖娼），权色交易</li>
      <li>也包括「为了和某人性交去和某人恋爱」，除非提前说明。</li>
      <li>但不包括改善穿搭、化妆、健身与提升个人能力等。</li>
    </ul>
  </li>
  <li>「知情权」先于「体面」。
    <ul>
      <li>大方地承认「对方对自己有性吸引力」。</li>
      <li>可以见色起意——记得明说。</li>
      <li>告诉对方，「您可以拒绝，这是您与生俱来的权利。」</li>
    </ul>
  </li>
  <li>不要因为「某人不愿与自己性交」而对某人发脾气（或者穿小鞋，背地里说坏话）。</li>
</ul>

<h1 id="那结婚呢">那结婚呢？</h1>
<p>U.M.R 认为，「结婚」的目的是「生育」——不仅要生小孩，还要把小孩养育成人。因此，只有在先前恋爱中表现良好、具有生育能力、且能够长期相处的对象，U.M.R 才会考虑与之结婚。</p>

<p>这意味着：U.M.R 不会考虑丁克——请放下自己对「永恒」的执念。</p>

<h1 id="沈奕斐教授的恋爱观排序大意如此">沈奕斐教授的「恋爱观排序」（大意如此）</h1>
<p>复旦大学的沈奕斐教授提出，对恋爱乃至结婚前后「拥抱，接吻，性交，确立关系，结婚」五个关键时间点排序，可以帮助表明一个人的恋爱观。</p>

<p>U.M.R 主要支持如下时序：</p>
<ul>
  <li>默认时序：拥抱，性交，确立关系，接吻，结婚</li>
  <li>兼容模式时序 A：拥抱，确立关系，接吻，性交，结婚</li>
  <li>兼容模式时序 B：确立关系，拥抱，接吻，性交，结婚</li>
</ul>]]></content><author><name>U.M.R Powered</name></author><category term="UMR架构杂谈" /><category term="性" /><category term="恋爱" /><summary type="html"><![CDATA[前提 or 世界观 人们能够以「生育」为目的性交，也能以「生育」以外的目的性交（例如享乐）。 因此，「性」既不神圣，也不肮脏。 并非所有人都需要结婚，也并非所有人都需要恋爱。结婚/恋爱的对象也可以不是异性。 所有参与者都必须明确同意才能性交。（俗称「性同意」） 「信任」最为珍贵。]]></summary></entry><entry><title type="html">友链说明及要求</title><link href="https://umrpowered.codeberg.page/links/requirements" rel="alternate" type="text/html" title="友链说明及要求" /><published>2023-02-05T00:10:00+08:00</published><updated>2023-02-05T00:10:00+08:00</updated><id>https://umrpowered.codeberg.page/links/link-requirements</id><content type="html" xml:base="https://umrpowered.codeberg.page/links/requirements"><![CDATA[<p>本要求主要参照 <a href="https://moe23333.vercel.app/posts/links">关于友链的说明及要求~</a> 撰写，在此感谢 Moe23333 的贡献。</p>

<h2 id="要求">要求</h2>
<p>注意：本博客可能存在违反中华人民共和国现行法律法规的内容。</p>

<p>为了防止内容采集站通过友链实现 SEO，并规避潜在的风险，本站（U.M.R Powered Blog ）对友链站点要求如下：</p>

<h3 id="必要条件">必要条件</h3>
<ul>
  <li>网站支持 HTTPS。</li>
  <li>至少有 1 篇原创内容。转载或搬运内容占比不超过 80%，且此部分内容 <strong>必须遵守原作者的许可协议</strong>。</li>
  <li>如网站使用（公用）子域名，子域名不为未提交至 <a href="https://publicsuffix.org/">Public Suffix List</a> 的子域名。</li>
  <li><strong>不</strong> 将访客导流至封闭式平台。</li>
</ul>

<p>截至 2023 年 1 月 31 日，未提交至 <a href="https://publicsuffix.org/">Public Suffix List</a> 的常见子域名有：<code class="language-plaintext highlighter-rouge">*.gitee.io</code>, <code class="language-plaintext highlighter-rouge">*.oschina.io</code>, <code class="language-plaintext highlighter-rouge">*.coding.me</code>, <code class="language-plaintext highlighter-rouge">*.coding.io</code> 等，此类子域名 <strong>不满足</strong> 必要条件。</p>

<p>已提交至该列表的常见子域名，如 <code class="language-plaintext highlighter-rouge">*.eu.org</code>, <code class="language-plaintext highlighter-rouge">*.github.io</code>, <code class="language-plaintext highlighter-rouge">*.codeberg.page</code> 和 <code class="language-plaintext highlighter-rouge">*.pages.dev</code> 等，此类域名满足条件。</p>

<p>封闭式平台此处指不下载应用或不登录网站就无法使用的平台，如 Facebook、微信小程序等。注意：U.M.R Powered 认为 Telegram 公开频道 <strong>不</strong> 被视作封闭式平台，但 Telegram 私密频道属于封闭式平台。</p>

<h3 id="风险警示">风险警示</h3>
<p>U.M.R Powered 认为下列特征是潜在风险，并会在有下述（部分）特征的友链后标注。</p>
<ul>
  <li>在中国大陆做 ICP 备案。</li>
  <li>使用中国大陆境内提供商使用的网页分析服务，包括但不限于：百度统计、友盟、CNZZ、51LA 。</li>
</ul>

<h3 id="可选条件">可选条件</h3>
<p>如果您的网站符合这些条件，U.M.R Powered 会对您的网站有额外好感。</p>
<ul>
  <li>能够及时更新并输出完整 <a href="https://zh.wikipedia.org/wiki/RSS">RSS</a>。</li>
  <li>网站内容按标签（Tags）和/或类别（Categories）良好整理归档。</li>
  <li>可以在禁用 JavaScript 的状况下基本正常工作（允许数学公式渲染、图表、交互等需要 JavaScript 的功能不工作）</li>
  <li>页面干净不杂乱。</li>
</ul>

<h2 id="本站信息用于添加友链">本站信息（用于添加友链）</h2>
<ul>
  <li>名称：U.M.R Powered Blog</li>
  <li>网站描述： 因「U.M.R Powered」希望被搜索引擎顺利检索而搭建起来的简单博客。</li>
  <li>网站描述（简短）： U.M.R 想要被检索。</li>
  <li>头像（可选）：<a href="/assets/avatars/ai-generated-maid.webp">Stable Diffused Maid</a> <a href="/assets/avatars/umr_pixiv_59171525.jpg">UMR from Pixiv (59171525)</a></li>
</ul>]]></content><author><name>U.M.R Powered</name></author><category term="站务" /><summary type="html"><![CDATA[本要求主要参照 关于友链的说明及要求~ 撰写，在此感谢 Moe23333 的贡献。]]></summary></entry><entry><title type="html">Hello, Jekyll!</title><link href="https://umrpowered.codeberg.page/hello-jekyll" rel="alternate" type="text/html" title="Hello, Jekyll!" /><published>2023-02-03T21:00:00+08:00</published><updated>2023-02-03T21:00:00+08:00</updated><id>https://umrpowered.codeberg.page/hello-jekyll</id><content type="html" xml:base="https://umrpowered.codeberg.page/hello-jekyll"><![CDATA[<p>如果您能看到这个页面，说明 U.M.R Powered Blog 正常运行，毛手毛脚的 U.M.R Powered 也幸运地没有搞砸什么。</p>

<p>U.M.R Powered 会尽量不在这个博客使用 JavaScript，除非 <em>她</em> 需要渲染数学公式、图表或者流程图。</p>

<figure class="highlight"><pre><code class="language-python" data-lang="python"><span class="kn">import</span> <span class="n">os</span>
<span class="n">l1</span> <span class="o">=</span> <span class="p">[</span><span class="sh">"</span><span class="s">Play</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">with</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">snakes</span><span class="sh">"</span><span class="p">]</span>
<span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s"> </span><span class="sh">"</span><span class="p">.</span><span class="nf">join</span><span class="p">(</span><span class="n">l1</span><span class="p">))</span>
<span class="c1"># prints "Play with snakes"</span></code></pre></figure>]]></content><author><name>U.M.R Powered</name></author><category term="jekyll" /><category term="update" /><category term="Jekyll" /><category term="待分类" /><summary type="html"><![CDATA[如果您能看到这个页面，说明 U.M.R Powered Blog 正常运行，毛手毛脚的 U.M.R Powered 也幸运地没有搞砸什么。]]></summary></entry><entry><title type="html">Linux 下 Flash player (SA) 画面无法正常渲染</title><link href="https://umrpowered.codeberg.page/2023/01/16/flash-player-linux-nvidia-issue.html" rel="alternate" type="text/html" title="Linux 下 Flash player (SA) 画面无法正常渲染" /><published>2023-01-16T21:10:00+08:00</published><updated>2023-01-16T21:10:00+08:00</updated><id>https://umrpowered.codeberg.page/2023/01/16/flash-player-linux-nvidia-issue</id><content type="html" xml:base="https://umrpowered.codeberg.page/2023/01/16/flash-player-linux-nvidia-issue.html"><![CDATA[<ul>
  <li>发行版： Debian 11</li>
  <li>显卡驱动： nvidia-driver from bullseye-backports, 470.161.03</li>
  <li>Flash player: 32.0.0.645</li>
</ul>

<p><img src="/assets/image/2023-01-16-flashplayer-broken.jpg" alt="RGB 错位的渲染图像，原因尚不明确" /></p>

<p>解决了困扰我数个月的 Flash player (standalone) 在我的电脑上无法正确渲染画面的问题。</p>

<p>起初怀疑 Flash player 和新的 Glibc 不兼容。尝试在 Xephyr 内启动 Flash player，一切正常。</p>

<p>怀疑是显卡驱动 OpenGL 实现问题。打开 nvidia-settings，点击 X Screen 0 - OpenGL Settings，勾选 Enable Graphics API Visual Indicator。然后发现 Flash player 没被挂上 Indicator。<del>UMR 陷入沉思</del></p>

<p>上网 Google 了一番，找到了 <a href="https://community.adobe.com/t5/flash-player-discussions/hardware-acceleration-in-standalone-flash-player/td-p/9743653">Hardware Acceleration in Standalone Flash Player</a> 这篇问答。尝试使用环境变量 <code class="language-plaintext highlighter-rouge">VDPAU_DRIVER=va_gl</code> 启动 Flash player，出现 VAAPI 报错，随后画面正常渲染。</p>

<p>看来是我的 N 卡驱动、VDPAU 和 Flash player 之间出了问题。让 Flash player 不使用 VDPAU（以禁用硬件加速），问题解决。</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">VDPAU_DRIVER</span><span class="o">=</span>null flashplayer example.swf
</code></pre></div></div>

<p><img src="/assets/image/2023-01-16-flashplayer-working.jpg" alt="禁用 VDPAU 以后正常渲染的图像" /></p>

<h3 id="ps">P.S.</h3>
<p>截图来自 ザンクロー (Zankuro) <a href="https://www.pixiv.net/en/users/7964">(Pixiv, NSFW)</a> 制作的 Flash 动画作品 <a href="https://www.dlsite.com/maniax/work/=/product_id/RJ128234.html">Moving E.C.M 4</a>。 <strong>注意：NSFW 链接</strong></p>

<p>CC BY 4.0 许可范围 <em>可能</em> 不包括本文所附的两张游戏截图。</p>]]></content><author><name>U.M.R Powered</name></author><category term="折腾" /><category term="疑难杂症" /><category term="Nvidia" /><summary type="html"><![CDATA[发行版： Debian 11 显卡驱动： nvidia-driver from bullseye-backports, 470.161.03 Flash player: 32.0.0.645]]></summary></entry><entry><title type="html">尝试借道网易 UU 加速器翻墙失败：从文件重命名到 DLL 注入</title><link href="https://umrpowered.codeberg.page/2022/06/05/gfw-traversal-along-netease-uu.html" rel="alternate" type="text/html" title="尝试借道网易 UU 加速器翻墙失败：从文件重命名到 DLL 注入" /><published>2022-06-05T17:35:00+08:00</published><updated>2022-06-05T17:35:00+08:00</updated><id>https://umrpowered.codeberg.page/2022/06/05/gfw-traversal-along-netease-uu</id><content type="html" xml:base="https://umrpowered.codeberg.page/2022/06/05/gfw-traversal-along-netease-uu.html"><![CDATA[<p>值此「六四事件」33 周年之际，防火长城发威，我使用的梯子们断的断、残的残。无奈，我只好打起了中国大陆境内各家网游加速器的主意。</p>

<p>我盯上了哔哩哔哩众多《Apex 英雄》内容创作者力荐的 <a href="https://uu.163.com/">网易 UU 加速器</a>。我架起虚拟机，请来了 UU 加速器本尊和 Polipo。UU 加速器主要提供「路由模式（模式三）」和「进程模式（模式四）」。我选择了「模式四」，尝试把 <code class="language-plaintext highlighter-rouge">polipo.exe</code> 重命名成 <code class="language-plaintext highlighter-rouge">r5apex.exe</code>，以期让 UU 加速器「加速」它。</p>

<p><img src="/assets/image/2022-06-05-uu-mode4.webp" alt="模式四下，重命名为 r5apex.exe 的 Polipo 被 UU 启动" /></p>

<p>UU 加速器将信将疑地启动了 Polipo 扮演的「Apex 英雄」，不过显然，代理没奏效。</p>

<p><img src="/assets/image/2022-06-05-uu-mode3.webp" alt="模式三下，UMR 手动修改路由表并跟踪本机到 104.26.13.31 的路由，tracert 提示请求超时" /></p>

<p>我又尝试了「路由模式（模式三）」，并手动操作本机路由表。结果 UU 加速器也不吃这套。</p>

<p>在互联网上瞎逛的时候，我忽然想起了「白利用」技术（有数字签名的正常 .exe 文件 + 掺了私货的 .dll）。四处 Google 了一番，找到了几篇看不懂的教程。</p>

<p>我又想起了早年间看过某位大佬写的，为《饥荒》桥接 LuaJIT 引擎的文章。于是我找到了 <a href="https://zhuanlan.zhihu.com/p/24570361">《饥荒游戏扫雷笔记 系列全文合集》（知乎）</a> ，里面刚好详细介绍了用 <code class="language-plaintext highlighter-rouge">dinput8.dll</code> 「捅篓子」的方法，还附带了一些源代码。</p>

<p>我原先的计划是替换掉 Steam 目录下的 <code class="language-plaintext highlighter-rouge">zlib1.dll</code>，奈何我去网上找了个大小不一样的同名 dll 扔进去，触发了 Steam 的校验机制：Steam 发现了异常，还好心地帮我备份了出问题的 DLL 文件。</p>

<p>于是我把目光转向 <code class="language-plaintext highlighter-rouge">bcrypt.dll</code>：Steam 似乎只导入了 BCryptGenRandom 函数。我新建了空白的 bcrypt.dll 文件，结果 Steam 既没崩溃也没报错；我又盯上了 <code class="language-plaintext highlighter-rouge">steamwebhelper.exe</code>，它不仅会使用 bcrypt，也会使用 WINMM。我尝试新建空白的 <code class="language-plaintext highlighter-rouge">WINMM.dll</code> 文件，报错。看来 <code class="language-plaintext highlighter-rouge">WINMM.dll</code> 应该可以用来注入 <code class="language-plaintext highlighter-rouge">steamwebhelper.exe</code>。</p>

<p>经过一天的努力，我，U.M.R Powered，终于做到了：</p>
<ul>
  <li>使用 AheadLib 生成白利用 DLL 源码</li>
  <li>安装 VS2022 + MFC</li>
  <li>踩进了 VS2022 新项目默认 <code class="language-plaintext highlighter-rouge">WINAPI_FAMILY</code> 设定的坑</li>
  <li>构建出了能用的白利用 winmm.dll</li>
  <li>把 Polipo 编译链接成 .dll</li>
</ul>

<p><img src="/assets/image/2022-06-05-steamwebhelper-listening-on-tcp-8123.webp" alt="steamwebhelper.exe 正在监听 TCP 8123 端口" /></p>

<p><img src="/assets/image/2022-06-05-curl-1111dns-redirected.webp" alt="curl 连接 1.1.1.1:443，SNI steamcommunity.com，实际连接上后者" /></p>

<p>最后，<code class="language-plaintext highlighter-rouge">steamwebhelper.exe</code> 按照我的设想，在 8123 端口上启动了 Polipo HTTP 代理服务器。但是，UU 加速器的反滥用机制也有两把刷子——如同设置了 destOverride 的 V2Ray 一样，UU 加速器也会读取 TLS ClientHello 中的 <code class="language-plaintext highlighter-rouge">server_name</code> 字段，并按其内容确定目标地址。</p>

<h1 id="ps">P.S.</h1>

<p>UMR 发现有一些网游加速器仅通过文件重命名就能顺利实现借道翻墙——但是它们大多有自己的黑名单（比如无法访问 web.archive.org）。读者也可以自行尝试上述的三种方式尝试「滥用」网游加速器。</p>]]></content><author><name>U.M.R Powered</name></author><category term="折腾" /><category term="绕过网络审查" /><category term="网游加速器" /><summary type="html"><![CDATA[值此「六四事件」33 周年之际，防火长城发威，我使用的梯子们断的断、残的残。无奈，我只好打起了中国大陆境内各家网游加速器的主意。]]></summary></entry></feed>