<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="rss.xsl"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>MuskAI 文档站 Blog</title>
        <link>https://docs.muskapi.cc/ja/blog</link>
        <description>MuskAI 文档站 Blog</description>
        <lastBuildDate>Wed, 20 May 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>ja</language>
        <item>
            <title><![CDATA[Codex 移动端使用第三方中转站]]></title>
            <link>https://docs.muskapi.cc/ja/blog/2026/05/20/codex-移动端使用第三方中转站</link>
            <guid>https://docs.muskapi.cc/ja/blog/2026/05/20/codex-移动端使用第三方中转站</guid>
            <pubDate>Wed, 20 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[核心原理]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Kmfy" id="核心原理">核心原理<a href="https://docs.muskapi.cc/ja/blog/2026/05/20/codex-%E7%A7%BB%E5%8A%A8%E7%AB%AF%E4%BD%BF%E7%94%A8%E7%AC%AC%E4%B8%89%E6%96%B9%E4%B8%AD%E8%BD%AC%E7%AB%99#%E6%A0%B8%E5%BF%83%E5%8E%9F%E7%90%86" class="hash-link" aria-label="核心原理 への直接リンク" title="核心原理 への直接リンク" translate="no">​</a></h2>
<p>利用 Codex 客户端 <strong>Auth层</strong>（负责账户验证、权益）与 <strong>Model层</strong>（负责实际对话请求）<strong>解耦</strong>的设计。</p>
<ul>
<li class="">
<p><strong>Auth 层</strong>：继续使用 ChatGPT 账号登录，以获得其账户身份和所有功能权益。</p>
</li>
<li class="">
<p><strong>Model 层</strong>：通过配置，将其请求指向支持 OpenAI <code>responses</code> API 的第三方中转服务。</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Kmfy" id="准备工作">准备工作<a href="https://docs.muskapi.cc/ja/blog/2026/05/20/codex-%E7%A7%BB%E5%8A%A8%E7%AB%AF%E4%BD%BF%E7%94%A8%E7%AC%AC%E4%B8%89%E6%96%B9%E4%B8%AD%E8%BD%AC%E7%AB%99#%E5%87%86%E5%A4%87%E5%B7%A5%E4%BD%9C" class="hash-link" aria-label="准备工作 への直接リンク" title="准备工作 への直接リンク" translate="no">​</a></h2>
<ol>
<li class=""><strong>账户</strong>：一个有效的 ChatGPT 账号（免费版即可）。</li>
<li class=""><strong>中转服务</strong>：一个支持 OpenAI <code>responses</code> API 模式的<a href="https://muskapi.cc/" target="_blank" rel="noopener noreferrer" class="">中转站账号</a></li>
<li class=""><strong>配置文件</strong>：找到 Codex 本地的两个配置文件准备修改：</li>
</ol>
<p>​    *   <code>~/.codex/auth.json</code></p>
<p>​    *   <code>~/.codex/config.toml</code></p>
<h2 class="anchor anchorTargetStickyNavbar_Kmfy" id="详细配置步骤">详细配置步骤<a href="https://docs.muskapi.cc/ja/blog/2026/05/20/codex-%E7%A7%BB%E5%8A%A8%E7%AB%AF%E4%BD%BF%E7%94%A8%E7%AC%AC%E4%B8%89%E6%96%B9%E4%B8%AD%E8%BD%AC%E7%AB%99#%E8%AF%A6%E7%BB%86%E9%85%8D%E7%BD%AE%E6%AD%A5%E9%AA%A4" class="hash-link" aria-label="详细配置步骤 への直接リンク" title="详细配置步骤 への直接リンク" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Kmfy" id="第一步正常登录">第一步：正常登录<a href="https://docs.muskapi.cc/ja/blog/2026/05/20/codex-%E7%A7%BB%E5%8A%A8%E7%AB%AF%E4%BD%BF%E7%94%A8%E7%AC%AC%E4%B8%89%E6%96%B9%E4%B8%AD%E8%BD%AC%E7%AB%99#%E7%AC%AC%E4%B8%80%E6%AD%A5%E6%AD%A3%E5%B8%B8%E7%99%BB%E5%BD%95" class="hash-link" aria-label="第一步：正常登录 への直接リンク" title="第一步：正常登录 への直接リンク" translate="no">​</a></h3>
<p>首先，在 Codex 客户端中，像平常一样登录你的 ChatGPT 账号，并确保登录成功、状态正常。</p>
<h3 class="anchor anchorTargetStickyNavbar_Kmfy" id="第二步修改认证配置-authjson">第二步：修改认证配置 (<code>auth.json</code>)<a href="https://docs.muskapi.cc/ja/blog/2026/05/20/codex-%E7%A7%BB%E5%8A%A8%E7%AB%AF%E4%BD%BF%E7%94%A8%E7%AC%AC%E4%B8%89%E6%96%B9%E4%B8%AD%E8%BD%AC%E7%AB%99#%E7%AC%AC%E4%BA%8C%E6%AD%A5%E4%BF%AE%E6%94%B9%E8%AE%A4%E8%AF%81%E9%85%8D%E7%BD%AE-authjson" class="hash-link" aria-label="第二步修改认证配置-authjson への直接リンク" title="第二步修改认证配置-authjson への直接リンク" translate="no">​</a></h3>
<p>找到并编辑文件 <code>~/.codex/auth.json</code>。</p>
<p><strong>关键修改项：</strong></p>
<ul>
<li class="">
<p>将 <code>"auth_mode"</code> 的值改为 <code>"chatgpt"</code>。</p>
</li>
<li class="">
<p>将 <code>"OPENAI_API_KEY"</code> 的值设为 <code>null</code>。</p>
</li>
</ul>
<p><strong>目的</strong>：确保客户端使用 ChatGPT 方式进行身份验证，并且不使用官方的 OpenAI API Key，从而为切换模型请求层铺平道路。</p>
<h3 class="anchor anchorTargetStickyNavbar_Kmfy" id="第三步修改模型提供商配置-configtoml">第三步：修改模型提供商配置 (<code>config.toml</code>)<a href="https://docs.muskapi.cc/ja/blog/2026/05/20/codex-%E7%A7%BB%E5%8A%A8%E7%AB%AF%E4%BD%BF%E7%94%A8%E7%AC%AC%E4%B8%89%E6%96%B9%E4%B8%AD%E8%BD%AC%E7%AB%99#%E7%AC%AC%E4%B8%89%E6%AD%A5%E4%BF%AE%E6%94%B9%E6%A8%A1%E5%9E%8B%E6%8F%90%E4%BE%9B%E5%95%86%E9%85%8D%E7%BD%AE-configtoml" class="hash-link" aria-label="第三步修改模型提供商配置-configtoml への直接リンク" title="第三步修改模型提供商配置-configtoml への直接リンク" translate="no">​</a></h3>
<p>找到并编辑文件 <code>~/.codex/config.toml</code>，在文件的<strong>末尾</strong>追加以下配置段落：</p>
<div class="language-text codeBlockContainer_xJ04 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kSFy"><pre tabindex="0" class="prism-code language-text codeBlock_k3oC thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_L8jx"><div class="token-line" style="color:#393A34"><span class="token plain">[[providers]]</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">id = "MuskAI" # 提供商ID，可自定义</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">name = "MuskAI" # 提供商显示名称，可自定义</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">base_url = "在官网用户中心 -【API密钥】页面复制的 Base URL"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">models = [] # 保持为空数组，模型列表会从中转站动态拉取</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">experimental_bearer_token = "sk-xxxxxxxxxxxx" # 替换为你的 API Key</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">wire_api = "responses" # 必须设置为 "responses"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">requires_openai_auth = true # 必须为 true，用于绕过客户端的某些检测</span><br></div></code></pre></div></div>
<p><strong>配置项解释：</strong></p>
<ul>
<li class=""><code>base_url</code>：登录官网后，在用户中心 -【API密钥】页面复制的 Base URL。</li>
<li class=""><code>experimental_bearer_token</code>：你在该中转服务的 API Key。</li>
<li class=""><strong><code>wire_api</code></strong>：<strong>这是最关键的一项</strong>，必须设置为 <code>"responses"</code>。这指示 Codex 使用 OpenAI 的 <code>/v1/responses</code> 端点格式发送请求，而非常见的 <code>/v1/chat/completions</code>。大部分中转服务需要特别配置才能支持此端点。</li>
<li class=""><strong><code>requires_openai_auth</code></strong>：必须设置为 <code>true</code>。这会使客户端认为当前仍在使用 OpenAI 的认证，从而顺利通过内部检查，维持 ChatGPT 账户的登录状态和功能。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Kmfy" id="第四步验证配置">第四步：验证配置<a href="https://docs.muskapi.cc/ja/blog/2026/05/20/codex-%E7%A7%BB%E5%8A%A8%E7%AB%AF%E4%BD%BF%E7%94%A8%E7%AC%AC%E4%B8%89%E6%96%B9%E4%B8%AD%E8%BD%AC%E7%AB%99#%E7%AC%AC%E5%9B%9B%E6%AD%A5%E9%AA%8C%E8%AF%81%E9%85%8D%E7%BD%AE" class="hash-link" aria-label="第四步：验证配置 への直接リンク" title="第四步：验证配置 への直接リンク" translate="no">​</a></h3>
<ol>
<li class=""><strong>重启 Codex 客户端</strong>，使配置生效。</li>
<li class="">在客户端中发送一条测试消息。</li>
<li class="">登录<a href="https://muskapi.cc/" target="_blank" rel="noopener noreferrer" class="">MuskAI</a>服务控制台，查看“用量”或“请求日志”。如果能看到刚刚测试对话产生的 API 调用记录，则说明配置成功，请求已被转发到第三方服务。</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Kmfy" id="重要注意事项">重要注意事项<a href="https://docs.muskapi.cc/ja/blog/2026/05/20/codex-%E7%A7%BB%E5%8A%A8%E7%AB%AF%E4%BD%BF%E7%94%A8%E7%AC%AC%E4%B8%89%E6%96%B9%E4%B8%AD%E8%BD%AC%E7%AB%99#%E9%87%8D%E8%A6%81%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A1%B9" class="hash-link" aria-label="重要注意事项 への直接リンク" title="重要注意事项 への直接リンク" translate="no">​</a></h2>
<ol>
<li class=""><strong>历史记录丢失</strong>：切换模型提供商后，<strong>之前的所有对话历史记录会消失</strong>。因为对话记录是与特定的模型提供商绑定的，更换后无法读取之前的记录。</li>
<li class=""><strong>模型名称格式</strong>：在中转站（如 MuskAi）中配置可用模型时，模型名称<strong>需要包含提供商前缀</strong>。例如，如果你想使用 GPT-5.4，模型名称应配置为 <code>openai/gpt-5.4</code>，而不仅仅是 <code>gpt-5.4</code>。</li>
<li class=""><strong>API 端点要求</strong>：该方法成功的关键在于，你选择的第三方中转服务<strong>必须支持 OpenAI 的 <code>/v1/responses</code> 端点</strong>。如果中转站只支持常见的 <code>/v1/chat/completions</code> 端点，则 Codex 的请求会失败。</li>
<li class=""><strong>多端同步</strong>：此配置修改后，Codex 的桌面端和移动端的功能与状态将保持同步。</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Kmfy" id="最终效果">最终效果<a href="https://docs.muskapi.cc/ja/blog/2026/05/20/codex-%E7%A7%BB%E5%8A%A8%E7%AB%AF%E4%BD%BF%E7%94%A8%E7%AC%AC%E4%B8%89%E6%96%B9%E4%B8%AD%E8%BD%AC%E7%AB%99#%E6%9C%80%E7%BB%88%E6%95%88%E6%9E%9C" class="hash-link" aria-label="最终效果 への直接リンク" title="最终效果 への直接リンク" translate="no">​</a></h2>
<p>通过以上配置，你实现了：</p>
<ul>
<li class=""><strong>身份与功能</strong>：客户端界面、账户权益（如 Plus 标志、插件、移动版解锁）仍由你的原始 ChatGPT 账户提供。</li>
<li class=""><strong>算力与模型</strong>：所有你发起的对话请求，其实际处理的计算资源和模型，都来自于你配置的第三方中转 API 服务。</li>
</ul>
<p>这使得你可以在享受 ChatGPT 官方客户端体验的同时，灵活地选用更经济、更快或更定制化的模型服务。</p>
<h1>补充</h1>
<p>看到很多人写的修改配置文件，但是不能连接windows端的codex，是因为windows端的codex它默认会删除配置字段。把配置文件改成只读，会让codex修改不了配置文件。这样就可以用手机访问codex了。放图片：
改成只读配置：</p>
<p><img decoding="async" loading="lazy" src="https://cdn3.ldstatic.com/optimized/4X/f/8/3/f8392a5121e939f923884932e72e6ad87c3a4e53_2_512x500.png" alt="image" class="img_iDrr"></p>
<p>连接完成图片：</p>
<p><img decoding="async" loading="lazy" src="https://cdn3.ldstatic.com/optimized/4X/a/c/1/ac1a433a58042dada906398fa29b31a2f1f5496f_2_225x500.jpeg" alt="a6feb854e2e87ca443b89020d02cc460" class="img_iDrr"></p>
<p>脚本文件，改成ps1后缀</p>
<div class="language-text codeBlockContainer_xJ04 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kSFy"><pre tabindex="0" class="prism-code language-text codeBlock_k3oC thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_L8jx"><div class="token-line" style="color:#393A34"><span class="token plain">$ErrorActionPreference = "Stop"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$workspace = "C:\Users\11854\Documents\Codex\2026-05-16\chatgpt-codex"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$package = Get-AppxPackage OpenAI.Codex</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">if (-not $package) {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  throw "OpenAI.Codex package not found."</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$asar = Join-Path $package.InstallLocation "app\resources\app.asar"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$patched = Join-Path $workspace ("app.asar.patched-" + $package.Version)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$backup = Join-Path $workspace ("app.asar.backup-" + $package.Version + "-" + (Get-Date -Format "yyyyMMdd-HHmmss"))</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$log = Join-Path $workspace "patch-current-codex-asar.log"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$config = "C:\Users\11854\.codex\config.toml"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">function Log($message) {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  "$(Get-Date -Format o) $message" | Add-Content -LiteralPath $log -Encoding UTF8</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">function IndexOfBytes([byte[]]$haystack, [byte[]]$needle, [int]$start) {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  for ($i = $start; $i -le $haystack.Length - $needle.Length; $i++) {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    $ok = $true</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    for ($j = 0; $j -lt $needle.Length; $j++) {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      if ($haystack[$i + $j] -ne $needle[$j]) {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        $ok = $false</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        break</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    if ($ok) { return $i }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  return -1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">function New-PatchedAsar {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  $bytes = [System.IO.File]::ReadAllBytes($asar)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  $encoding = [System.Text.Encoding]::UTF8</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  $text = $encoding.GetString($bytes)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  $pattern = "function xV(e){return Object.hasOwn(e,``remote_control``)||SV(e.features)&amp;&amp;Object.hasOwn(e.features,``remote_control``)}"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  $patchedPattern = "function xV(e){return Object.hasOwn(e,``remote_xontrol``)||SV(e.features)&amp;&amp;Object.hasOwn(e.features,``remote_xontrol``)}"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  $needle = "remote_control"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  $replacement = [System.Text.Encoding]::UTF8.GetBytes("remote_xontrol")</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  $idx = $text.IndexOf($pattern, [System.StringComparison]::Ordinal)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  if ($idx -lt 0) {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    if ($text.IndexOf($patchedPattern, [System.StringComparison]::Ordinal) -ge 0) {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      Log "Installed app.asar already appears patched."</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      return $false</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    throw "Target xV function pattern not found."</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  $positions = @()</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  $pos = $idx</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  $end = $idx + $pattern.Length</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  while (($pos = $text.IndexOf($needle, $pos, [System.StringComparison]::Ordinal)) -ge 0 -and $pos -lt $end) {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    $positions += $encoding.GetByteCount($text.Substring(0, $pos))</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    $pos += $needle.Length</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  if ($positions.Count -ne 2) {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    throw "Expected 2 remote_control occurrences in target xV function, found $($positions.Count)."</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  foreach ($p in $positions) {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    [Array]::Copy($replacement, 0, $bytes, $p, $replacement.Length)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  [System.IO.File]::WriteAllBytes($patched, $bytes)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  Log "Created patched asar: $patched offsets=$($positions -join ',')"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  return $true</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">function Ensure-ConfigFlag {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  $bytes = [System.IO.File]::ReadAllBytes($config)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  $text = [System.Text.Encoding]::UTF8.GetString($bytes)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  if ($text.Length -gt 0 -and [int][char]$text[0] -eq 0xFEFF) {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    $text = $text.Substring(1)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  $changed = $false</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  if ($text -match '(?m)^\s*remote_control\s*=') {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    if (($bytes.Length -ge 3 -and $bytes[0] -eq 0xEF -and $bytes[1] -eq 0xBB -and $bytes[2] -eq 0xBF)) {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      $encoding = [System.Text.UTF8Encoding]::new($false)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      [System.IO.File]::WriteAllText($config, $text, $encoding)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      Log "Removed UTF-8 BOM from config.toml."</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    return</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  if ($text -match '(?m)^\s*remote_connections\s*=\s*true\s*$') {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    $text = $text -replace '(?m)^(\s*remote_connections\s*=\s*true\s*)$', "`$1`r`nremote_control = true"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    $changed = $true</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  } elseif ($text -match '(?m)^\s*\[features\]\s*$') {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    $text = $text -replace '(?m)^(\s*\[features\]\s*)$', "`$1`r`nremote_control = true"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    $changed = $true</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  } else {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    $text += "`r`n[features]`r`nremote_control = true`r`n"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    $changed = $true</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  if ($changed) {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    $encoding = [System.Text.UTF8Encoding]::new($false)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    [System.IO.File]::WriteAllText($config, $text, $encoding)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Log "Added remote_control to config.toml."</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">function Get-CodexPackageProcesses {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  Get-CimInstance Win32_Process |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Where-Object {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      $_.ExecutablePath -and</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      $_.ExecutablePath.StartsWith($package.InstallLocation, [System.StringComparison]::OrdinalIgnoreCase) -and</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      ($_.Name -eq "Codex.exe" -or $_.Name -eq "codex.exe")</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Log "Package version: $($package.Version)"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Log "Target asar: $asar"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">New-PatchedAsar | Out-Null</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Ensure-ConfigFlag</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Log "Waiting for Codex package processes to exit."</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">while ($true) {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  $running = @(Get-CodexPackageProcesses)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  if ($running.Count -eq 0) {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    break</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  Log "Still waiting for Codex processes: $($running.ProcessId -join ',')"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  Start-Sleep -Seconds 2</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">try {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  &amp; takeown /F $asar | Out-Null</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  $currentUser = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  &amp; icacls $asar /grant "$($currentUser):(F)" | Out-Null</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  Log "Granted temporary app.asar permission."</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  $cipherOutput = &amp; cipher /d $asar 2&gt;&amp;1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  Log "Requested app.asar decryption/unprotect exit=$LASTEXITCODE output=$($cipherOutput -join ' | ')"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">} catch {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  Log "Failed to grant temporary app.asar permission: $($_.Exception.Message)"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  throw</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">if (-not (Test-Path -LiteralPath $backup)) {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  [System.IO.File]::WriteAllBytes($backup, [System.IO.File]::ReadAllBytes($asar))</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  Log "Created backup: $backup"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">try {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  $stream = [System.IO.File]::Open($asar, [System.IO.FileMode]::Open, [System.IO.FileAccess]::ReadWrite, [System.IO.FileShare]::None)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  $stream.Close()</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">} catch {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  Log "app.asar is still not writable: $($_.Exception.Message)"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  throw</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Copy-Item -LiteralPath $patched -Destination $asar -Force</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Log "Installed patched app.asar."</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">try {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  $currentUser = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  &amp; icacls $asar /remove:g $currentUser | Out-Null</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  &amp; icacls $asar /setowner "NT SERVICE\TrustedInstaller" | Out-Null</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  Log "Restored app.asar owner/temporary grant."</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">} catch {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  Log "Failed to restore app.asar owner/temporary grant: $($_.Exception.Message)"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Ensure-ConfigFlag</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Log "Done."</span><br></div></code></pre></div></div>
<p><img decoding="async" loading="lazy" src="https://cdn3.ldstatic.com/optimized/4X/a/3/9/a3966d04a7cf2730849b6f05a410f08aefb077da_2_407x499.png" alt="fc8096305d35df25d48fcc912568c632" class="img_iDrr"></p>
<p>官方还未推进windows的app_control链路
写了个脚本，原理就是通过UAC加权的cmd启动codex.exe-&gt;把配置文件加上语句后设置为只读(在这之前要手动在配置文件加入
[features]
js_repl = true
goals = true
remote_connections = true
remote_control = true
)
-&gt;90秒后恢复可读，程序可写入参数</p>
<p><img decoding="async" loading="lazy" src="https://cfpic.999194.xyz/file/pc/1779296003947_5c8b9ac9ebbc9514cc3bdcfb62008f90971683ea.zip" alt="5c8b9ac9ebbc9514cc3bdcfb62008f90971683ea.zip" class="img_iDrr"></p>]]></content:encoded>
            <category>Codex</category>
        </item>
    </channel>
</rss>