跳转至

8.6 文件与目录——作业:猫鼠游戏(Catch Me If You Can)

内容梗概

本节课布置本章作业"猫鼠游戏"(取名自小李子主演的电影《Catch Me If You Can》)。作业仓库中有一个包含大量子目录和文件的目录,其中部分文件的后缀被故意改假(例如 exe 被重命名伪装成其他类型)。学生需要综合运用本章所学的目录遍历与二进制文件头分析技术,找出文件特征与后缀不匹配的"冒牌货",把正常文件和异常文件分别归类到两个文件夹,并将分析代码提交到作业仓库。截止时间为一周。

知识点详解

本节为作业布置课,无新授知识点,主要内容如下:

作业背景与获取方式(约 00:00 - 00:30)

  • 作业名《Catch me if you can》。点开作业链接会得到一个仓库,把仓库克隆到本地即为作业素材。

作业要求(约 00:31 - 01:30)

  1. 作业目录下有非常多的子文件和子目录,用课上教的方法(os.listdir + 递归 / os.walk / pathlib)遍历找出所有文件。
  2. 老师埋了坑:部分文件的后缀是假的,是强行用 F2 重命名改过的(比如本来是 exe,改成了别的后缀)。
  3. 用**二进制方式读取文件头**,与作业中提供的文件特征表对比,手动找出"冒牌货"——即文件后缀与文件特征不匹配的文件。
  4. 把文件分成两类放到两个文件夹:
  5. 正常文件夹:文件内容/特征与后缀匹配的文件;
  6. 异常文件夹:后缀与特征不匹配的文件。
  7. 提交方式:右键新建一个 py 文件,写好代码、运行成功,然后 add、commit、push 到作业仓库。

作业意义(约 01:31 - 02:00)

  • 很多最简单的安全分析就是从这一步开始的:对应上学期恶意代码章节讲过的**静态分析**方法——看文件的静态内容,不用执行它就能判断它是不是正常文件。

截止时间与课程安排(约 02:00 - 02:30)

  • deadline 是下周,一周时间完成;后面还有不少作业,节奏不会再拖沓。
  • 课程基本内容已讲完:下节课讲**标准库**,之后留一节课讲评前几次作业,然后课程进入新阶段——用 Python 做实际项目,把之前的基础知识融会贯通。

示例与演示(作业解题思路)

综合本章内容,完成作业的典型步骤:

  1. 遍历:用 8.5 节的目录遍历方法(递归 + os.listdir,或 os.walk,或 pathlib.Path.glob)收集作业目录下的全部文件路径。
  2. 读文件头:用 open(path, 'rb') 以二进制方式打开每个文件,f.read(n) 读出开头若干字节(如 2~4 字节)。
  3. 特征比对:将读出的字节与作业给出的文件特征表对照(如 BMP 的开头是 BM、exe 的开头是 MZ),必要时可用 8.1 节的 bytes 字面值知识或 8.3 节的 struct 辅助解析。
  4. 分类:特征与后缀一致 → 移入"正常"文件夹;不一致 → 移入"异常"文件夹(可用 os.rename 或 pathlib 移动文件,用 os.mkdir / Path.mkdir 建目录)。
  5. 提交:代码运行成功后 git add / commit / push。

重点与难点

  • 不能信后缀名:判断文件真实类型的唯一可靠依据是文件头的 magic number(特征字节),这正是 8.2 节强调的安全分析思路。
  • 遍历必须覆盖所有层级的子目录,漏掉子目录里的文件就找不全"冒牌货"。
  • 读取文件头必须用二进制模式('rb'),读出的是 bytes,比较时注意字节与字符的区别。
  • 截止一周,且代码要能实际跑通再提交。

关联内容

  • 直接综合运用本章全部内容:8.5 目录遍历、8.1 二进制数据(bytes)、8.2 二进制文件分析与 magic number 概念、8.3 struct(可选工具)、8.4 编码(如涉及文件名处理)。
  • 呼应上学期恶意代码章节的**静态分析**方法。
  • 预告后续课程:第 9 章标准库 → 作业讲评课 → 实际项目阶段(用 Python 做真正能用的东西)。