<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>内存分析 on 猫猫鱼的小窝</title>
    <link>https://cat.fjh1997.top/tags/%E5%86%85%E5%AD%98%E5%88%86%E6%9E%90/</link>
    <description>Recent content from 猫猫鱼的小窝</description>
    <generator>Hugo</generator>
    <language>zh-CN</language>
    
    <managingEditor>xxx@example.com (catcatyu)</managingEditor>
    <webMaster>xxx@example.com (catcatyu)</webMaster>
    
    <copyright>本博客所有文章除特别声明外，均采用 BY-NC-SA 许可协议。转载请注明出处！</copyright>
    
    <lastBuildDate>Sun, 15 Mar 2026 17:31:00 +0800</lastBuildDate>
    
    
    <atom:link href="https://cat.fjh1997.top/tags/%E5%86%85%E5%AD%98%E5%88%86%E6%9E%90/atom.xml" rel="self" type="application/rss&#43;xml" />
    

    
    

    <item>
      <title>通过读取微信进程内存提取公众号信息流广告视频下载地址</title>
      <link>https://cat.fjh1997.top/posts/58321.html</link>
      <pubDate>Sun, 15 Mar 2026 17:31:00 &#43;0800</pubDate>
      <author>xxx@example.com (catcatyu)</author>
      <guid>https://cat.fjh1997.top/posts/58321.html</guid>
      <description>
        <![CDATA[<h1>通过读取微信进程内存提取公众号信息流广告视频下载地址</h1><p>作者：catcatyu（xxx@example.com）</p>
        
          <h2 id="背景">
<a class="header-anchor" href="#%e8%83%8c%e6%99%af"></a>
背景
</h2><p><img
  src="/images/2026-03-15-18-47-23.png"
  alt="2026-03-15-18-47-23" width="1649" height="1052"
  loading="lazy"
  decoding="async"
/>

在PC端微信的公众号列表中，经常会看到信息流广告视频，比如游戏广告。这些广告视频有时候挺有意思，想下载下来，但微信并没有提供下载按钮。比如看到这个广告视频的妹妹很好看🤪，那么应该怎么下载呢？本文以这个&quot;三国冰河时代&quot;游戏广告为例，介绍如何通过读取微信进程内存来提取广告视频的下载地址。</p>
<h2 id="尝试一寻找本地缓存文件失败">
<a class="header-anchor" href="#%e5%b0%9d%e8%af%95%e4%b8%80%e5%af%bb%e6%89%be%e6%9c%ac%e5%9c%b0%e7%bc%93%e5%ad%98%e6%96%87%e4%bb%b6%e5%a4%b1%e8%b4%a5"></a>
尝试一：寻找本地缓存文件（失败）
</h2><p>首先想到的思路是微信可能把视频缓存到了本地磁盘。微信PC端的数据目录一般在：</p>
<pre tabindex="0"><code>C:\Users\{用户名}\Documents\WeChat Files\{微信ID}\FileStorage\
</code></pre><p>该目录下有这些子目录：</p>
<pre tabindex="0"><code>Cache、Video、Image、Temp、Sns、MsgAttach ...
</code></pre><p>其中 <code>Video</code> 目录按月份分文件夹存放：</p>
<pre tabindex="0"><code>2024-04、2024-05、... 2025-08
</code></pre><p>但逐个检查后发现这些目录要么为空，要么只有聊天中收发的视频。<strong>公众号信息流广告的视频并不会被缓存到这里。</strong></p>
<p>同样检查了 <code>AppData</code> 下的微信目录：</p>
<pre tabindex="0"><code>C:\Users\{用户名}\AppData\Roaming\Tencent\WeChat\
C:\Users\{用户名}\AppData\Roaming\Tencent\xwechat\
</code></pre><p>新版微信（xwechat）使用了 Chromium 内核（RadiumWMPF），有类似浏览器的缓存结构：</p>
<pre tabindex="0"><code>xwechat\radium\web\profiles\webview_{用户hash}\
xwechat\radium\web\profiles\multitab_{用户hash}\
</code></pre><p>里面有 <code>Code Cache</code>、<code>IndexedDB</code>、<code>GPUCache</code> 等 Chromium 标准缓存目录，但也没找到视频文件。</p>
<p><strong>结论：公众号信息流广告视频是流式加载的，不会完整缓存到本地磁盘。</strong></p>
<h2 id="尝试二通过开发者工具远程调试失败">
<a class="header-anchor" href="#%e5%b0%9d%e8%af%95%e4%ba%8c%e9%80%9a%e8%bf%87%e5%bc%80%e5%8f%91%e8%80%85%e5%b7%a5%e5%85%b7%e8%bf%9c%e7%a8%8b%e8%b0%83%e8%af%95%e5%a4%b1%e8%b4%a5"></a>
尝试二：通过开发者工具/远程调试（失败）
</h2><p>既然新版微信使用 Chromium 内核，理论上可以通过 <code>--remote-debugging-port</code> 参数连接 DevTools 来抓取网络请求。</p>
<p>查看微信进程的命令行参数：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="nb">Get-CimInstance</span> <span class="n">Win32_Process</span> <span class="n">-Filter</span> <span class="s2">&#34;Name=&#39;WeChatAppEx.exe&#39;&#34;</span> <span class="p">|</span> <span class="nb">Select-Object</span> <span class="n">ProcessId</span><span class="p">,</span> <span class="n">CommandLine</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>发现主进程的启动参数中并没有 <code>--remote-debugging-port</code>，说明远程调试未开启，这条路也走不通。</p>
<h2 id="尝试三进程内存扫描成功">
<a class="header-anchor" href="#%e5%b0%9d%e8%af%95%e4%b8%89%e8%bf%9b%e7%a8%8b%e5%86%85%e5%ad%98%e6%89%ab%e6%8f%8f%e6%88%90%e5%8a%9f"></a>
尝试三：进程内存扫描（成功）
</h2><p>既然视频是流式加载的，那视频的URL一定在微信进程的内存中。思路是：<strong>直接读取微信进程内存，搜索视频URL模式。</strong></p>
<h3 id="第一步定位微信进程">
<a class="header-anchor" href="#%e7%ac%ac%e4%b8%80%e6%ad%a5%e5%ae%9a%e4%bd%8d%e5%be%ae%e4%bf%a1%e8%bf%9b%e7%a8%8b"></a>
第一步：定位微信进程
</h3><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="nb">Get-Process</span> <span class="p">|</span> <span class="nb">Where-Object</span> <span class="p">{</span> <span class="nv">$_</span><span class="p">.</span><span class="py">ProcessName</span> <span class="o">-match</span> <span class="s1">&#39;wechat&#39;</span> <span class="p">}</span> <span class="p">|</span>
</span></span><span class="line"><span class="cl">    <span class="nb">Select-Object</span> <span class="n">Id</span><span class="p">,</span> <span class="n">ProcessName</span><span class="p">,</span> <span class="n">Path</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>发现微信运行了多个 <code>WeChatAppEx.exe</code> 进程，这是典型的 Chromium 多进程架构：</p>
<table>
  <thead>
      <tr>
          <th>进程类型</th>
          <th>说明</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>主进程（无 &ndash;type 参数）</td>
          <td>浏览器主进程，包含页面数据</td>
      </tr>
      <tr>
          <td>&ndash;type=gpu-process</td>
          <td>GPU渲染进程</td>
      </tr>
      <tr>
          <td>&ndash;type=renderer</td>
          <td>页面渲染进程</td>
      </tr>
      <tr>
          <td>&ndash;type=utility &ndash;utility-sub-type=network</td>
          <td>网络服务进程</td>
      </tr>
  </tbody>
</table>
<p>我们要扫描的是<strong>主进程</strong>（没有 <code>--type</code> 参数的那个）。</p>
<h3 id="第二步编写内存扫描脚本">
<a class="header-anchor" href="#%e7%ac%ac%e4%ba%8c%e6%ad%a5%e7%bc%96%e5%86%99%e5%86%85%e5%ad%98%e6%89%ab%e6%8f%8f%e8%84%9a%e6%9c%ac"></a>
第二步：编写内存扫描脚本
</h3><p>通过 PowerShell 调用 Windows API 来读取进程内存：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="nb">Add-Type</span> <span class="n">-TypeDefinition</span> <span class="sh">@&#39;
</span></span></span><span class="line"><span class="cl"><span class="sh">using System;
</span></span></span><span class="line"><span class="cl"><span class="sh">using System.Runtime.InteropServices;
</span></span></span><span class="line"><span class="cl"><span class="sh">
</span></span></span><span class="line"><span class="cl"><span class="sh">public class MemoryReader {
</span></span></span><span class="line"><span class="cl"><span class="sh">    [DllImport(&#34;kernel32.dll&#34;)]
</span></span></span><span class="line"><span class="cl"><span class="sh">    public static extern IntPtr OpenProcess(
</span></span></span><span class="line"><span class="cl"><span class="sh">        int dwDesiredAccess, bool bInheritHandle, int dwProcessId);
</span></span></span><span class="line"><span class="cl"><span class="sh">
</span></span></span><span class="line"><span class="cl"><span class="sh">    [DllImport(&#34;kernel32.dll&#34;)]
</span></span></span><span class="line"><span class="cl"><span class="sh">    public static extern bool ReadProcessMemory(
</span></span></span><span class="line"><span class="cl"><span class="sh">        IntPtr hProcess, IntPtr lpBaseAddress, byte[] lpBuffer,
</span></span></span><span class="line"><span class="cl"><span class="sh">        int dwSize, ref int lpNumberOfBytesRead);
</span></span></span><span class="line"><span class="cl"><span class="sh">
</span></span></span><span class="line"><span class="cl"><span class="sh">    [DllImport(&#34;kernel32.dll&#34;)]
</span></span></span><span class="line"><span class="cl"><span class="sh">    public static extern int VirtualQueryEx(
</span></span></span><span class="line"><span class="cl"><span class="sh">        IntPtr hProcess, IntPtr lpAddress,
</span></span></span><span class="line"><span class="cl"><span class="sh">        out MEMORY_BASIC_INFORMATION lpBuffer, uint dwLength);
</span></span></span><span class="line"><span class="cl"><span class="sh">
</span></span></span><span class="line"><span class="cl"><span class="sh">    [DllImport(&#34;kernel32.dll&#34;)]
</span></span></span><span class="line"><span class="cl"><span class="sh">    public static extern bool CloseHandle(IntPtr hObject);
</span></span></span><span class="line"><span class="cl"><span class="sh">
</span></span></span><span class="line"><span class="cl"><span class="sh">    [StructLayout(LayoutKind.Sequential)]
</span></span></span><span class="line"><span class="cl"><span class="sh">    public struct MEMORY_BASIC_INFORMATION {
</span></span></span><span class="line"><span class="cl"><span class="sh">        public IntPtr BaseAddress;
</span></span></span><span class="line"><span class="cl"><span class="sh">        public IntPtr AllocationBase;
</span></span></span><span class="line"><span class="cl"><span class="sh">        public uint AllocationProtect;
</span></span></span><span class="line"><span class="cl"><span class="sh">        public IntPtr RegionSize;
</span></span></span><span class="line"><span class="cl"><span class="sh">        public uint State;
</span></span></span><span class="line"><span class="cl"><span class="sh">        public uint Protect;
</span></span></span><span class="line"><span class="cl"><span class="sh">        public uint Type;
</span></span></span><span class="line"><span class="cl"><span class="sh">    }
</span></span></span><span class="line"><span class="cl"><span class="sh">}
</span></span></span><span class="line"><span class="cl"><span class="sh">&#39;@</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>核心逻辑是遍历进程的所有已提交内存区域（<code>MEM_COMMIT = 0x1000</code>），读取内容后用正则匹配视频URL：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span><span class="lnt">37
</span><span class="lnt">38
</span><span class="lnt">39
</span><span class="lnt">40
</span><span class="lnt">41
</span><span class="lnt">42
</span><span class="lnt">43
</span><span class="lnt">44
</span><span class="lnt">45
</span><span class="lnt">46
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="nv">$targetPid</span> <span class="p">=</span> <span class="mf">42172</span>  <span class="c"># 微信主进程PID</span>
</span></span><span class="line"><span class="cl"><span class="nv">$handle</span> <span class="p">=</span> <span class="p">[</span><span class="no">MemoryReader</span><span class="p">]::</span><span class="n">OpenProcess</span><span class="p">(</span><span class="n">0x0410</span><span class="p">,</span> <span class="vm">$false</span><span class="p">,</span> <span class="nv">$targetPid</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="c"># 0x0410 = PROCESS_VM_READ | PROCESS_QUERY_INFORMATION</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nv">$address</span> <span class="p">=</span> <span class="p">[</span><span class="no">IntPtr</span><span class="p">]::</span><span class="n">Zero</span>
</span></span><span class="line"><span class="cl"><span class="nv">$mbi</span> <span class="p">=</span> <span class="nb">New-Object</span> <span class="n">MemoryReader</span><span class="p">+</span><span class="n">MEMORY_BASIC_INFORMATION</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">while</span> <span class="p">([</span><span class="no">MemoryReader</span><span class="p">]::</span><span class="n">VirtualQueryEx</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="nv">$handle</span><span class="p">,</span> <span class="nv">$address</span><span class="p">,</span> <span class="p">[</span><span class="no">ref</span><span class="p">]</span><span class="nv">$mbi</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="p">[</span><span class="no">uint32][Runtime.InteropServices.Marshal</span><span class="p">]::</span><span class="n">SizeOf</span><span class="p">(</span><span class="nv">$mbi</span><span class="p">))</span> <span class="o">-ne</span> <span class="mf">0</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="c"># 只扫描已提交的、大小合理的内存区域</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="p">(</span><span class="nv">$mbi</span><span class="p">.</span><span class="py">State</span> <span class="o">-eq</span> <span class="n">0x1000</span> <span class="o">-and</span>
</span></span><span class="line"><span class="cl">        <span class="nv">$mbi</span><span class="p">.</span><span class="py">RegionSize</span><span class="p">.</span><span class="py">ToInt64</span><span class="p">()</span> <span class="o">-lt</span> <span class="mf">10</span><span class="p">MB</span> <span class="o">-and</span>
</span></span><span class="line"><span class="cl">        <span class="nv">$mbi</span><span class="p">.</span><span class="py">RegionSize</span><span class="p">.</span><span class="py">ToInt64</span><span class="p">()</span> <span class="o">-gt</span> <span class="mf">0</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nv">$buffer</span> <span class="p">=</span> <span class="nb">New-Object</span> <span class="n">byte</span><span class="p">[]</span> <span class="p">(</span><span class="nv">$mbi</span><span class="p">.</span><span class="py">RegionSize</span><span class="p">.</span><span class="py">ToInt64</span><span class="p">())</span>
</span></span><span class="line"><span class="cl">        <span class="nv">$bytesRead</span> <span class="p">=</span> <span class="mf">0</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="p">([</span><span class="no">MemoryReader</span><span class="p">]::</span><span class="n">ReadProcessMemory</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">            <span class="nv">$handle</span><span class="p">,</span> <span class="nv">$mbi</span><span class="p">.</span><span class="n">BaseAddress</span><span class="p">,</span> <span class="nv">$buffer</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">            <span class="nv">$buffer</span><span class="p">.</span><span class="n">Length</span><span class="p">,</span> <span class="p">[</span><span class="no">ref</span><span class="p">]</span><span class="nv">$bytesRead</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">        <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="nv">$text</span> <span class="p">=</span> <span class="p">[</span><span class="no">System.Text.Encoding</span><span class="p">]::</span><span class="n">UTF8</span><span class="p">.</span><span class="py">GetString</span><span class="p">(</span><span class="nv">$buffer</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            <span class="c"># 匹配广告视频URL模式</span>
</span></span><span class="line"><span class="cl">            <span class="nv">$regex</span> <span class="p">=</span> <span class="s1">&#39;https?://[^\x00\s&#34;&lt;&gt;]{10,500}&#39;</span> <span class="p">+</span>
</span></span><span class="line"><span class="cl">                     <span class="s1">&#39;(?:\.mp4|mpvideo|finder.*video|wxv_|video\.qq|findermp)&#39;</span> <span class="p">+</span>
</span></span><span class="line"><span class="cl">                     <span class="s1">&#39;[^\x00\s&#34;&lt;&gt;]{0,200}&#39;</span>
</span></span><span class="line"><span class="cl">            <span class="nv">$matches</span> <span class="p">=</span> <span class="p">[</span><span class="no">regex</span><span class="p">]::</span><span class="n">Matches</span><span class="p">(</span><span class="nv">$text</span><span class="p">,</span> <span class="nv">$regex</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            <span class="k">foreach</span> <span class="p">(</span><span class="nv">$m</span> <span class="k">in</span> <span class="nv">$matches</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">                <span class="nv">$url</span> <span class="p">=</span> <span class="nv">$m</span><span class="p">.</span><span class="py">Value</span> <span class="o">-replace</span> <span class="s1">&#39;[\x00-\x1f]&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span>
</span></span><span class="line"><span class="cl">                <span class="k">if</span> <span class="p">(</span><span class="nv">$url</span><span class="p">.</span><span class="py">Length</span> <span class="o">-gt</span> <span class="mf">20</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">                    <span class="nb">Write-Host</span> <span class="nv">$url</span>
</span></span><span class="line"><span class="cl">                <span class="p">}</span>
</span></span><span class="line"><span class="cl">            <span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nv">$address</span> <span class="p">=</span> <span class="p">[</span><span class="no">IntPtr</span><span class="p">](</span>
</span></span><span class="line"><span class="cl">        <span class="nv">$mbi</span><span class="p">.</span><span class="py">BaseAddress</span><span class="p">.</span><span class="py">ToInt64</span><span class="p">()</span> <span class="p">+</span> <span class="nv">$mbi</span><span class="p">.</span><span class="py">RegionSize</span><span class="p">.</span><span class="py">ToInt64</span><span class="p">())</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="p">(</span><span class="nv">$address</span><span class="p">.</span><span class="py">ToInt64</span><span class="p">()</span> <span class="o">-lt</span> <span class="mf">0</span><span class="p">)</span> <span class="p">{</span> <span class="k">break</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">[</span><span class="no">MemoryReader</span><span class="p">]::</span><span class="n">CloseHandle</span><span class="p">(</span><span class="nv">$handle</span><span class="p">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="第三步扫描结果">
<a class="header-anchor" href="#%e7%ac%ac%e4%b8%89%e6%ad%a5%e6%89%ab%e6%8f%8f%e7%bb%93%e6%9e%9c"></a>
第三步：扫描结果
</h3><p>扫描了 2357 个内存区域，找到了 <strong>115 个视频URL</strong>，去重后主要是以下几个广告视频（来自 <code>wxsmw.wxs.qq.com</code> 域名）：</p>
<pre tabindex="0"><code>http://wxsmw.wxs.qq.com/.../ads_svp_video__0bc3qyabeaaacyapvlro4zurvbqeckdaaesa.f142000.mp4?dis_k=...&amp;dis_t=1764683224&amp;...
http://wxsmw.wxs.qq.com/.../ads_svp_video__0b53xabuuaad6aap6xr4u5ubtoaejk4agssa.f142000.mp4?dis_k=...&amp;dis_t=1749005722&amp;...
http://wxsmw.wxs.qq.com/.../ads_svp_video__0b53qiaowaaapmaabparcrubvaqe5obab22a.f142000.mp4?dis_k=...&amp;dis_t=1746007401&amp;...
</code></pre><p>URL的规律：</p>
<ul>
<li>域名：<code>wxsmw.wxs.qq.com</code> 或 <code>wxsnsdy.wxs.qq.com</code>（腾讯视频CDN）</li>
<li>路径包含 <code>ads_svp_video</code> 标识这是广告视频</li>
<li>参数 <code>dis_t</code> 是时间戳，可以用来判断哪个是最近的广告</li>
<li>参数 <code>dis_k</code> 和 <code>sha256</code> 用于鉴权</li>
</ul>
<h3 id="第四步确认目标视频">
<a class="header-anchor" href="#%e7%ac%ac%e5%9b%9b%e6%ad%a5%e7%a1%ae%e8%ae%a4%e7%9b%ae%e6%a0%87%e8%a7%86%e9%a2%91"></a>
第四步：确认目标视频
</h3><p>有多个广告视频URL，需要确认哪个是&quot;三国冰河时代&quot;。用同样的内存扫描方法，搜索中文关键词&quot;三国&quot;（注意要同时搜索 UTF-8 和 UTF-16LE 两种编码，因为 Windows 进程内存中两种编码都可能存在）：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="c"># UTF-8 编码的&#34;三国&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nv">$searchUtf8</span> <span class="p">=</span> <span class="p">[</span><span class="no">System.Text.Encoding</span><span class="p">]::</span><span class="n">UTF8</span><span class="p">.</span><span class="py">GetBytes</span><span class="p">(</span><span class="s1">&#39;三国&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="c"># UTF-16LE 编码的&#34;三国&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nv">$searchUtf16</span> <span class="p">=</span> <span class="p">[</span><span class="no">System.Text.Encoding</span><span class="p">]::</span><span class="n">Unicode</span><span class="p">.</span><span class="py">GetBytes</span><span class="p">(</span><span class="s1">&#39;三国&#39;</span><span class="p">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>在内存中确实找到了多处&quot;三国冰河时代&quot;的引用，包括：</p>
<ul>
<li>公众号文章元数据：<code>&quot;三国冰河时代挥师定山河活动解析&quot;</code></li>
<li>搜索记录：<code>&quot;query&quot;: &quot;三国 冰河时代&quot;</code></li>
<li>视频播放记录：<code>kVideoTracks...三国 冰河时代 - 搜一搜</code>，编码格式 <code>h264 high</code></li>
</ul>
<p>通过 <code>dis_t</code> 时间戳判断，最新的广告视频URL就是目标视频。</p>
<h3 id="第五步下载视频">
<a class="header-anchor" href="#%e7%ac%ac%e4%ba%94%e6%ad%a5%e4%b8%8b%e8%bd%bd%e8%a7%86%e9%a2%91"></a>
第五步：下载视频
</h3><p>直接用 curl 下载：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">curl -o <span class="s2">&#34;三国冰河时代_广告视频.mp4&#34;</span> <span class="s2">&#34;http://wxsmw.wxs.qq.com/131/20210/snssvpdownload/SH/reserved/ads_svp_video__0bc3qyabeaaacyapvlro4zurvbqeckdaaesa.f142000.mp4?dis_k=...&amp;dis_t=...&amp;sha256=...&amp;m=...&amp;posid=...&#34;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>返回 HTTP 200，文件大小约 7MB，<code>Content-Type: video/mp4</code>，下载成功。</p>
<h2 id="原理总结">
<a class="header-anchor" href="#%e5%8e%9f%e7%90%86%e6%80%bb%e7%bb%93"></a>
原理总结
</h2><pre tabindex="0"><code>微信公众号信息流
    ↓ 加载广告
腾讯CDN（wxsmw.wxs.qq.com）
    ↓ 流式传输视频
WeChatAppEx.exe 进程内存
    ↓ ReadProcessMemory
提取视频URL → curl下载
</code></pre><p>整个过程的关键点：</p>
<ol>
<li><strong>公众号信息流广告视频不缓存到本地磁盘</strong>，只在进程内存中存在</li>
<li>新版微信（xwechat）基于 Chromium 内核（RadiumWMPF），视频URL以明文形式保存在进程内存中</li>
<li>使用 Windows API <code>OpenProcess</code> + <code>VirtualQueryEx</code> + <code>ReadProcessMemory</code> 可以遍历读取目标进程的内存</li>
<li>广告视频URL的特征是域名为 <code>wxsmw.wxs.qq.com</code>，路径包含 <code>ads_svp_video</code></li>
<li>URL中的鉴权参数（<code>dis_k</code>、<code>sha256</code>、<code>m</code>）有时效性，需要在有效期内下载</li>
</ol>
<h2 id="注意事项">
<a class="header-anchor" href="#%e6%b3%a8%e6%84%8f%e4%ba%8b%e9%a1%b9"></a>
注意事项
</h2><ul>
<li>需要以当前用户权限运行，不需要管理员权限（因为微信也是当前用户启动的）</li>
<li>视频URL中的鉴权token有时效性，过期后需要重新扫描</li>
<li>扫描过程中微信需要保持运行，且目标广告页面需要已加载过</li>
<li>此方法同样适用于提取微信中其他流式加载的媒体内容的URL</li>
</ul>

        
        <hr><p>本文2026-03-15首发于<a href='https://cat.fjh1997.top/'>猫猫鱼的小窝</a>，最后修改于2026-03-15</p>]]>
      </description>
      
    </item>
    
  </channel>
</rss>
