记一次py恶意样本分析实战
字数 2073 2025-10-26 18:21:34
Python恶意样本分析实战教学文档
一、恶意样本基础特征分析
1.1 常见恶意代码执行模式
Python恶意样本通常采用以下典型执行模式:
- exec/compile组合:使用
compile()将字节串/字符串编译成可执行对象,再用exec()触发执行 - 变体调用方式:
eval/exec混用getattr(__builtins__, 'exec')间接调用- 通过
globals()/locals()注入命名空间 - 在lambda/闭包中包裹执行代码
- 将payload拆分拼接后再用
compile(..., '<string>', 'exec')执行
1.2 compile函数参数详解
compile(source, filename, mode, flags=0, dont_inherit=False, optimize=-1)
- source:源代码字符串或AST对象
- filename:源码文件名,恶意样本常用
'<string>'隐藏真实路径 - mode:
'exec':执行一段程序代码'eval':求值单个表达式'single':单条交互式语句
二、多层payload解析技术
2.1 编码/压缩层识别
恶意样本常用的多层编码结构:
return zlib.decompress(
lzma.decompress(
bz2.decompress(
gzip.decompress(
base64.b64decode(...)
)
)
)
)
2.2 自动化解析脚本设计
核心解析逻辑:
- 提取当前payload中
base64.b64decode('...')的字面量数据 - 将提取的字串传入解码函数进行多算法尝试
- 用解出的结果覆盖payload,继续下一轮解析
- 循环直到无法匹配到编码模式为止
解码函数设计:
def deobf(data):
# 依次尝试gzip、bz2、lzma、zlib等解压算法
# 返回解码后的数据
三、隐藏字符处理技术
3.1 异常字符检测方法
- 输出payload长度进行对比验证
- 打印hex形式检查异常字节
- 在控制台进行字符替换处理
3.2 可视化处理技巧
- 使用
repr()函数显示原始字符串表示 - 通过正则表达式过滤不可见字符
- 对比解码前后数据长度变化
四、marshal序列化分析
4.1 marshal模块基础
- 用途:CPython内部用于序列化代码对象等内部结构
- 特点:面向解释器自身,不保证跨版本稳定性
- 与pickle区别:不是通用安全序列化格式
4.2 .pyc文件结构解析
标准.pyc文件头格式:
[4字节 Magic Number] + [4字节 Bitfield] + [8字节时间戳/哈希]
详细结构:
- Magic Number(4字节):编译器版本标识(如
ó为3.13系列) - Bitfield(4字节):标志位,最低位标识是否为哈希校验格式
- 后续8字节:
- 时间戳格式:4字节mtime + 4字节源文件大小
- 哈希格式:8字节哈希前缀
4.3 恶意样本中的marshal使用
样本常用技术:
- 对payload进行
reverse()反转操作 - 使用
marshal.loads(bytes)加载字节流 - 构造伪造的pyc头:
b'ó' + b' '*12(写入魔数并清零后续12字节)
五、字节码分析与还原
5.1 反编译工具限制应对
当遇到新版Python(如3.13)时:
- uncompyle6和pycdc等工具可能不支持
- 需要采用字节码反汇编分析
5.2 代码对象结构分析
关键属性检查:
- 提取
co_consts中的常量数据 - 分析函数主体长度和结构
- 检查导入的对象和模块
5.3 LLM辅助还原技术
还原流程:
- 反汇编获取字节码指令
- 分析指令语义和逻辑流程
- 使用LLM进行代码逻辑还原
- 人工审计验证还原准确性
六、完整分析链路总结
6.1 核心分析流程
多层编码/压缩 → 隐藏字符处理 → compile+exec执行 →
reverse + marshal.loads加载 → 提取co_consts链式解包 →
字节码视角还原源码
6.2 关键技术节点
- 编码层剥离:沿构造的"套娃解码链"逐层剥离
- 环境隔离:防止命名空间污染
- 版本适配:匹配正确的Python版本环境
- 递归解析:实现自动化多阶段下钻分析
七、实战经验与易错点
7.1 常见问题处理
- 解码异常:多层解码链中混入不可见字符,导致语法不完整
- 环境污染:
compile()配合自定义globals()污染命名空间 - 版本兼容:marshal不保证跨版本稳定性
7.2 解决方案
- 可视化处理:先做字符可视化和替换
- 执行隔离:在沙箱/容器中动态执行
- 版本匹配:在同版本环境中还原验证
八、检测与防御建议
8.1 规则检测特征
静态检测关注点:
compile/eval/exec组合使用__builtins__间接调用co_consts链式反序列化- 异常编码序列与多重压缩
8.2 行为监控要点
动态检测策略:
- 沙箱内记录网络、文件、进程操作
- 监控模块加载轨迹
- 对可疑
__import__重绑定进行钩子审计 - 监控
sys.modules操作
8.3 供应链安全
- 锁定运行时Python版本指纹
- 分析.pyc魔数特征
- 建立版本差异化针对性检测策略
九、自动化分析框架设计
9.1 核心处理流程
正则抽取 → 解码解压 → 结构化判断 →
递归剥离 → 字节码反汇编/再解包
9.2 数据持久化设计
- 输出每步产物的长度、哈希与快照
- 建立分析回溯机制
- 实现污染点快速定位
9.3 安全防护机制
- 为marshal与co_consts解包添加类型/长度断言
- 实现异常字符检测守护
- 建立执行环境隔离沙箱
本教学文档涵盖了Python恶意样本分析的完整技术栈,从基础特征识别到高级反混淆技术,为安全研究人员提供了系统的分析方法和实战经验。