如何在Python3中实现Hexdump 复现sigtool十六进制转储命令效果
Python 3 实现指定Shell命令等效功能
原命令逻辑拆解
你给出的Shell命令实际执行逻辑如下:
- 读取目标文件的二进制内容
- 调用ClamAV的sigtool将二进制内容逐字节转换为连续无分隔的小写十六进制字符串
- 截取生成的十六进制字符串的前2048字节(因sigtool输出为纯ASCII字符,等价于截取前2048个字符,对应原始文件前1024字节的十六进制表示)
这个输出正好适配ClamAV .ndb恶意文件规则库的十六进制签名匹配需求。
纯Python实现(无外部依赖)
Python 3.5+ 内置的字节处理方法可以直接实现等效逻辑,不需要调用外部sigtool进程,性能更好也更方便集成到检测脚本里:
def get_clamav_hex_sig(file_path: str, dump_len: int = 2048) -> str: # 每1字节原始数据对应2位十六进制字符,按需读取避免加载整个大文件 read_size = (dump_len // 2) + (1 if dump_len % 2 else 0) with open(file_path, 'rb') as fp: raw_content = fp.read(read_size) # 生成连续小写十六进制串,和sigtool --hex-dump输出格式完全一致 hex_dump = raw_content.hex() # 截取指定长度,等效head -c的字节截取逻辑 return hex_dump[:dump_len]
使用说明
- 调用方式:直接传入目标文件路径即可,返回值就是和原Shell命令输出完全一致的十六进制字符串,可以直接用于和.ndb规则做匹配校验:
# 示例:读取目标PHP文件的十六进制签名 file_hex_sig = get_clamav_hex_sig("malicious.php") - 性能优化:上述实现不会读取整个文件,只会读取生成指定长度十六进制串所需的最少字节,扫描大体积PHP文件时效率远高于原Shell命令的全文件cat逻辑。
- 匹配注意:如果你的.ndb规则中存储的十六进制签名是大写格式,只需要将返回的签名串和规则串统一转为小写(或大写)再匹配即可,ClamAV本身对十六进制签名的大小写不敏感。
- 全量读取版本:若需要100%复刻原命令的全文件读取行为(无特殊需求不推荐,大文件下内存占用高),可以使用如下写法:
def get_hex_sig_full_read(file_path: str, dump_len: int = 2048) -> str: with open(file_path, 'rb') as fp: raw_content = fp.read() return raw_content.hex()[:dump_len]
内容的提问来源于stack exchange,提问作者tmclo
相关产品推荐
相关产品推荐

