记一次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 自动化解析脚本设计

核心解析逻辑

  1. 提取当前payload中base64.b64decode('...')的字面量数据
  2. 将提取的字串传入解码函数进行多算法尝试
  3. 用解出的结果覆盖payload,继续下一轮解析
  4. 循环直到无法匹配到编码模式为止

解码函数设计

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辅助还原技术

还原流程

  1. 反汇编获取字节码指令
  2. 分析指令语义和逻辑流程
  3. 使用LLM进行代码逻辑还原
  4. 人工审计验证还原准确性

六、完整分析链路总结

6.1 核心分析流程

多层编码/压缩 → 隐藏字符处理 → compile+exec执行 → 
reverse + marshal.loads加载 → 提取co_consts链式解包 → 
字节码视角还原源码

6.2 关键技术节点

  1. 编码层剥离:沿构造的"套娃解码链"逐层剥离
  2. 环境隔离:防止命名空间污染
  3. 版本适配:匹配正确的Python版本环境
  4. 递归解析:实现自动化多阶段下钻分析

七、实战经验与易错点

7.1 常见问题处理

  • 解码异常:多层解码链中混入不可见字符,导致语法不完整
  • 环境污染compile()配合自定义globals()污染命名空间
  • 版本兼容:marshal不保证跨版本稳定性

7.2 解决方案

  1. 可视化处理:先做字符可视化和替换
  2. 执行隔离:在沙箱/容器中动态执行
  3. 版本匹配:在同版本环境中还原验证

八、检测与防御建议

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恶意样本分析的完整技术栈,从基础特征识别到高级反混淆技术,为安全研究人员提供了系统的分析方法和实战经验。

Python恶意样本分析实战教学文档 一、恶意样本基础特征分析 1.1 常见恶意代码执行模式 Python恶意样本通常采用以下典型执行模式: exec/compile组合 :使用 compile() 将字节串/字符串编译成可执行对象,再用 exec() 触发执行 变体调用方式 : eval/exec 混用 getattr(__builtins__, 'exec') 间接调用 通过 globals()/locals() 注入命名空间 在lambda/闭包中包裹执行代码 将payload拆分拼接后再用 compile(..., '<string>', 'exec') 执行 1.2 compile函数参数详解 source :源代码字符串或AST对象 filename :源码文件名,恶意样本常用 '<string>' 隐藏真实路径 mode : 'exec' :执行一段程序代码 'eval' :求值单个表达式 'single' :单条交互式语句 二、多层payload解析技术 2.1 编码/压缩层识别 恶意样本常用的多层编码结构: 2.2 自动化解析脚本设计 核心解析逻辑 : 提取当前payload中 base64.b64decode('...') 的字面量数据 将提取的字串传入解码函数进行多算法尝试 用解出的结果覆盖payload,继续下一轮解析 循环直到无法匹配到编码模式为止 解码函数设计 : 三、隐藏字符处理技术 3.1 异常字符检测方法 输出payload长度进行对比验证 打印hex形式检查异常字节 在控制台进行字符替换处理 3.2 可视化处理技巧 使用 repr() 函数显示原始字符串表示 通过正则表达式过滤不可见字符 对比解码前后数据长度变化 四、marshal序列化分析 4.1 marshal模块基础 用途 :CPython内部用于序列化代码对象等内部结构 特点 :面向解释器自身,不保证跨版本稳定性 与pickle区别 :不是通用安全序列化格式 4.2 .pyc文件结构解析 标准.pyc文件头格式 : 详细结构 : 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 核心分析流程 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恶意样本分析的完整技术栈,从基础特征识别到高级反混淆技术,为安全研究人员提供了系统的分析方法和实战经验。