You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Python将Samba hash2混淆的文件名还原为Unix原生路径

Samba hash2 混淆路径还原说明

核心问题解答

  • hash2 计算仅针对单个文件/目录的名称本身,和上层路径完全无关。你给出的示例中,仅 Two Shell - SoulCity E.P. 这个目录名参与哈希计算,上层的 /aaa/bbb/ccc 路径不会参与运算。
  • 触发混淆的条件除了你查到的「目录名包含2个点且以.结尾」外,还包括:文件名包含非ASCII字符、文件名不符合Windows 8.3格式长度要求、包含Windows文件系统不允许的特殊字符。

反向转换实现方案

hash2 是单向哈希算法,仅通过混淆后的字符串 T3XBGA~5 无法直接反推出原始文件名,只能通过本地正向匹配的方式实现还原,前提是你可以访问Linux服务器上的原始未混淆目录:

  1. 遍历混淆名称所在父目录下的所有原始文件/目录名
  2. 对每个原始名称正向计算 hash2 混淆值,和你拿到的混淆名前缀(~前面的6位字符)以及后缀序号做比对,匹配成功的即为对应原始名称

正向计算Python参考实现

Samba hash2 的正向计算流程和简化实现代码如下:

def samba_mangle_hash2(raw_name: str) -> str:
    # Samba自定义Base32字符表,非标准Base32
    BASE32_TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZ346789"
    # 原始文件名转小写UTF-16LE编码
    name_utf16le = raw_name.lower().encode("utf-16le")
    # 32位哈希计算,和Samba源码逻辑对齐
    hash_val = 0xdeadbeef
    for byte in name_utf16le:
        hash_val = ((hash_val << 5) ^ (hash_val >> 27) ^ byte) & 0xFFFFFFFF
    # 哈希值转6位Base32字符串
    mangled_chars = []
    tmp = hash_val
    for _ in range(6):
        mangled_chars.append(BASE32_TABLE[tmp & 0x1F])
        tmp >>= 5
    return ''.join(reversed(mangled_chars))

# 匹配测试
if __name__ == "__main__":
    test_dir = "Two Shell - SoulCity E.P."
    prefix = samba_mangle_hash2(test_dir)
    # 输出前缀和你示例中T3XBGA比对即可完成匹配
    print(f"混淆前缀计算结果:{prefix}")

注意事项

  • 同目录下如果存在多个哈希后前缀相同的文件名,~后的序号会从1开始递增,匹配时需要同时匹配前缀和序号
  • 如果你没有原始目录的本地访问权限,无法仅通过混淆字符串还原原始文件名

内容的提问来源于stack exchange,提问作者jean k

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.20 12:15:06