如何使用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服务器上的原始未混淆目录:
- 遍历混淆名称所在父目录下的所有原始文件/目录名
- 对每个原始名称正向计算 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
相关产品推荐
相关产品推荐

