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)¶
- 作业目录下有非常多的子文件和子目录,用课上教的方法(
os.listdir+ 递归 /os.walk/pathlib)遍历找出所有文件。 - 老师埋了坑:部分文件的后缀是假的,是强行用 F2 重命名改过的(比如本来是 exe,改成了别的后缀)。
- 用**二进制方式读取文件头**,与作业中提供的文件特征表对比,手动找出"冒牌货"——即文件后缀与文件特征不匹配的文件。
- 把文件分成两类放到两个文件夹:
- 正常文件夹:文件内容/特征与后缀匹配的文件;
- 异常文件夹:后缀与特征不匹配的文件。
- 提交方式:右键新建一个 py 文件,写好代码、运行成功,然后
add、commit、push到作业仓库。
作业意义(约 01:31 - 02:00)¶
- 很多最简单的安全分析就是从这一步开始的:对应上学期恶意代码章节讲过的**静态分析**方法——看文件的静态内容,不用执行它就能判断它是不是正常文件。
截止时间与课程安排(约 02:00 - 02:30)¶
- deadline 是下周,一周时间完成;后面还有不少作业,节奏不会再拖沓。
- 课程基本内容已讲完:下节课讲**标准库**,之后留一节课讲评前几次作业,然后课程进入新阶段——用 Python 做实际项目,把之前的基础知识融会贯通。
示例与演示(作业解题思路)¶
综合本章内容,完成作业的典型步骤:
- 遍历:用 8.5 节的目录遍历方法(递归 +
os.listdir,或os.walk,或pathlib.Path.glob)收集作业目录下的全部文件路径。 - 读文件头:用
open(path, 'rb')以二进制方式打开每个文件,f.read(n)读出开头若干字节(如 2~4 字节)。 - 特征比对:将读出的字节与作业给出的文件特征表对照(如 BMP 的开头是
BM、exe 的开头是MZ),必要时可用 8.1 节的bytes字面值知识或 8.3 节的struct辅助解析。 - 分类:特征与后缀一致 → 移入"正常"文件夹;不一致 → 移入"异常"文件夹(可用
os.rename或 pathlib 移动文件,用os.mkdir/Path.mkdir建目录)。 - 提交:代码运行成功后 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 做真正能用的东西)。