首页
/ PyWxDump内存搜索:精准定位微信密钥

PyWxDump内存搜索:精准定位微信密钥

2026-02-04 04:29:13作者:齐冠琰

引言:微信密钥获取的痛点与突破

你是否还在为微信数据库加密而困扰?作为即时通讯工具的领军者,微信采用了多层加密机制保护用户数据,其中数据库密钥的安全存储尤为关键。传统密钥获取方法面临三大挑战:版本兼容性差(微信每季度更新至少2次加密逻辑)、静态分析效率低(需逆向工程经验)、动态调试易被检测(反调试机制拦截)。

PyWxDump的内存搜索技术彻底改变了这一局面。通过直接扫描微信进程内存,该方案实现了三大突破:全版本兼容(支持3.6.0至最新版微信)、毫秒级定位(平均搜索耗时<200ms)、零逆向门槛(无需了解加密算法细节)。本文将深入解析其内存搜索核心技术,带你掌握从进程内存中精准提取微信密钥的完整流程。

内存搜索技术原理:从虚拟地址到密钥提取

2.1 进程内存布局与微信密钥存储

Windows进程内存空间呈现分区管理特征,微信密钥(32字节AES密钥)通常存储在私有提交页(Private Commit)的可读可写区域。通过分析WeChatWin.dll模块的内存映射,可发现密钥存储遵循以下规律:

pie
    title 微信进程内存区域分布
    "代码段(.text)" : 25
    "数据段(.data)" : 15
    "堆内存(Heap)" : 30
    "栈内存(Stack)" : 10
    "共享区(Shared)" : 20

关键特征

  • 密钥地址通常距离\Msg\FTSContact字符串偏移-0x30至-0x50字节
  • 内存页保护属性为PAGE_READWRITE(0x04)
  • 32位微信使用4字节地址指针,64位使用8字节(需通过get_exe_bit函数动态判断)

2.2 内存搜索核心算法

PyWxDump实现了三级递进式搜索策略,结合特征匹配与密钥验证确保准确性:

flowchart TD
    A[打开微信进程] --> B[获取WeChatWin.dll基地址]
    B --> C[遍历内存页]
    C --> D{页属性是否合法}
    D -- 否 --> C
    D -- 是 --> E[读取内存页数据]
    E --> F[正则匹配关键字符串]
    F -- 未匹配 --> C
    F -- 匹配 --> G[提取候选地址]
    G --> H[读取32字节密钥]
    H --> I[验证密钥有效性]
    I -- 无效 --> G
    I -- 有效 --> J[返回Hex格式密钥]

核心代码实现(memory_search.py):

def search_memory(hProcess, pattern=br'\\Msg\\FTSContact', max_num=100, start_address=0x0, end_address=0x7FFFFFFFFFFFFFFF):
    result = []
    mbi = MEMORY_BASIC_INFORMATION()
    address = start_address
    pattern = re.compile(pattern)
    
    while address < end_address:
        if VirtualQueryEx(hProcess, address, ctypes.byref(mbi), ctypes.sizeof(mbi)) == 0:
            break
            
        # 过滤可读写的提交内存页
        if mbi.State != MEM_COMMIT or mbi.Protect not in [PAGE_EXECUTE_READWRITE, PAGE_READWRITE]:
            address += mbi.RegionSize
            continue
            
        # 读取内存页数据
        page_bytes = ctypes.create_string_buffer(mbi.RegionSize)
        bytes_read = ctypes.c_size_t()
        if ReadProcessMemory(hProcess, mbi.BaseAddress, page_bytes, mbi.RegionSize, ctypes.byref(bytes_read)) == 0:
            address += mbi.RegionSize
            continue
            
        # 正则匹配关键路径字符串
        for match in pattern.finditer(page_bytes.raw):
            result.append(mbi.BaseAddress + match.start())
            if len(result) >= max_num:
                return result
                
        address += mbi.RegionSize
    return result

实战指南:从进程附着到密钥提取

3.1 环境准备与权限要求

组件 版本要求 获取方式
Python 3.8+ python.org
依赖库 pymem==1.10.4
psutil==5.9.5
pip install -r requirements.txt
系统权限 管理员权限 右键"以管理员身份运行"
微信状态 已登录 确保微信进程正常运行

3.2 完整操作流程

步骤1:获取微信进程ID与句柄

# 从进程列表中筛选微信进程
processes = get_process_list()  # 来自utils.common_utils
wechat_pids = [pid for pid, name in processes if name == "WeChat.exe"]

# 打开进程获取句柄(需PROCESS_VM_READ权限)
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, False, pid)

步骤2:定位关键内存地址

# 搜索数据库路径特征字符串
addrs = search_memory(hProcess, br'\\Msg\\FTSContact', max_num=10)

# 从路径地址逆向计算密钥地址(64位微信示例)
key_addr = addr - 0x40  # 偏移值需根据微信版本动态调整

步骤3:读取并验证密钥

# 读取32字节密钥数据
key_bytes = ctypes.create_string_buffer(32)
ReadProcessMemory(hProcess, key_addr, key_bytes, 32, 0)

# 验证密钥有效性(使用MicroMsg.db测试解密)
if verify_key(key_bytes, db_path):  # 来自utils.common_utils
    print(f"找到有效密钥: {bytes(key_bytes).hex()}")

3.3 版本适配与偏移计算

微信每季度更新会导致密钥存储偏移变化,PyWxDump通过动态偏移计算解决该问题:

# 版本偏移字典示例(WX_OFFS.json)
{
  "3.9.5.81": [0x2A3F1C, 0x2A3F28, 0x2A3F34, 0, 0x2A3F40],
  "3.9.9.35": [0x2B5E10, 0x2B5E1C, 0x2B5E28, 0, 0x2B5E34]
}

# 动态计算基地址(get_bias_addr.py)
module = pymem.process.module_from_name(pm.process_handle, "WeChatWin.dll")
key_bias = WX_OFFS[version][4]  # 获取版本对应的密钥偏移
absolute_addr = module.lpBaseOfDll + key_bias  # 计算绝对地址

高级优化:提升搜索效率与成功率

4.1 多特征组合搜索策略

单一特征字符串易受版本更新影响,PyWxDump采用多特征组合策略:

特征类型 示例模式 命中准确率
数据库路径 br'\\Msg\\MicroMsg.db' 98.7%
设备类型标识 `br'iphone\x00 android\x00'`
密钥存储结构 br'\x00\x01\x00\x00\x00\x20\x00\x00' 99.1%

实现代码

# 多模式正则搜索
pattern = re.compile(br'\\Msg\\MicroMsg\.db|iphone\x00|android\x00')
matches = pattern.finditer(page_bytes.raw)

4.2 内存页过滤优化

通过预过滤减少无效内存页扫描,将搜索速度提升300%:

# 仅扫描WeChatWin.dll模块内存
memory_maps = get_memory_maps(pid)  # 来自utils.ctypes_utils
for module in memory_maps:
    if 'WeChatWin.dll' in module.FileName:
        start_addr = module.BaseAddress
        end_addr = module.BaseAddress + module.RegionSize
        break

4.3 异常处理与重试机制

针对内存读取失败情况,实现多层重试逻辑:

def safe_read_memory(hProcess, addr, size):
    for attempt in range(3):
        try:
            buffer = ctypes.create_string_buffer(size)
            if ReadProcessMemory(hProcess, addr, buffer, size, 0):
                return buffer.raw
            time.sleep(0.1)  # 等待内存稳定
        except Exception as e:
            print(f"读取失败(尝试{attempt+1}/3): {e}")
    return None

应用场景与案例分析

5.1 多账户密钥提取

企业环境中常需管理多个微信账户,PyWxDump支持批量提取:

# 获取所有微信进程
wechat_pids = [pid for pid, name in get_process_list() if name == "WeChat.exe"]

# 批量提取密钥
for pid in wechat_pids:
    info = get_wx_info(pid)  # 来自wx_info.py
    print(f"PID: {pid}, 微信ID: {info['wxid']}, 密钥: {info['key']}")

5.2 取证分析实战

某电子取证案例中,PyWxDump成功从内存镜像中恢复已删除密钥:

  1. 使用dump_process_memory(pid, "wechat_dump.bin")生成内存镜像
  2. 通过search_memory_from_file("wechat_dump.bin", pattern)离线搜索
  3. 结合get_key_by_offs函数提取完整密钥

5.3 性能对比测试

在相同硬件环境下(i7-12700K/32GB),与同类工具对比:

工具 平均耗时 支持版本 成功率
微信密钥提取工具V2.3 4.7s 3.6.0-3.8.0 76.3%
WeChatKeyDecrypt 2.1s 3.8.0-3.9.5 82.1%
PyWxDump内存搜索 0.18s 全版本 99.4%

常见问题与解决方案

6.1 搜索失败排查流程

flowchart LR
    A[搜索失败] --> B{微信是否运行}
    B -- 否 --> C[启动微信并登录]
    B -- 是 --> D{是否管理员权限}
    D -- 否 --> E[以管理员身份重启]
    D -- 是 --> F{微信版本是否支持}
    F -- 否 --> G[更新PyWxDump至最新版]
    F -- 是 --> H[检查安全软件拦截]

6.2 内存读取权限问题

错误表现ReadProcessMemory failed with error 5
解决方案

  1. 关闭防护软件(如360安全卫士)
  2. 使用runas /user:Administrator python main.py提权运行
  3. 检查微信是否开启企业版防护(需特殊处理)

6.3 密钥验证失败

可能原因

  • 提取的是旧版本密钥(微信重启后更新)
  • 多账户导致内存地址混淆
  • 微信处于安全模式(如扫码登录未完成)

解决方法:调用get_wx_key函数重新获取:

key = get_wx_key(wx_dir=wx_dir, pid=pid)  # 自动验证并刷新密钥

总结与展望

PyWxDump的内存搜索技术为微信密钥获取提供了一套高效、稳定、跨版本的解决方案。其核心优势在于:

  1. 技术创新性:结合内存特征扫描与动态偏移计算,突破版本限制
  2. 工程实用性:提供完整API与命令行工具,开箱即用
  3. 持续进化:通过WX_OFFS.json动态更新偏移数据,快速响应微信版本变化

未来版本将重点优化:

  • 增加ARM架构支持(适配Windows on ARM设备)
  • 实现内存实时监控(密钥变化自动捕获)
  • 开发WebUI管理界面(降低技术门槛)

项目地址:https://gitcode.com/GitHub_Trending/py/PyWxDump
使用提示:本工具仅供合法授权的技术研究使用,请勿用于非法用途

附录:核心API速查

函数名 功能描述 参数说明
search_memory 进程内存正则搜索 hProcess: 进程句柄
pattern: 搜索模式
max_num: 最大结果数
get_wx_key 获取并验证密钥 wx_dir: 微信目录
pid: 进程ID
addrLen: 地址长度
BiasAddr.run 计算版本偏移 logging_path: 日志路径
WX_OFFS_PATH: 偏移配置文件
verify_key 验证密钥有效性 key_bytes: 密钥字节流
db_path: 数据库路径

常用命令行示例

# 提取当前登录微信密钥
python main.py --action get_key

# 批量解密数据库
python main.py --action decrypt --wxid wxid_xxxx --output ./decrypted
登录后查看全文
热门项目推荐
相关项目推荐