逆向工程学习日志(第五天):常见加密算法特征识别与 Python 打包程序的逆向边界
本文记录逆向工程学习第五天的内容。主要涉及 AES、RSA、MD5、TEA 四种常见加密/哈希算法的基本常识与逆向识别方法,以及使用 PyInstaller 将 Python 脚本打包为 Windows 可执行文件(EXE)的实践与局限。此外,对后续学习方向进行了调整,计划将国产 AI 工具纳入辅助分析和研究对象。
一、常见加密算法的基础认知
本日以理论学习和特征识别为主,不涉及具体算法的数学推导。重点记录各算法在逆向分析中可用于识别的“签名”或行为特征。
| 算法 | 类型 | 关键特征(逆向视角) |
|---|---|---|
| MD5 | 哈希 | 输出固定 128 位(16 字节);初始化常量(A=0x67452301, B=0xefcdab89, …);循环中会使用正弦整数表(K 表) |
| AES | 对称加密 | 典型轮函数包含 SubBytes(S 盒)、ShiftRows、MixColumns、AddRoundKey;S 盒固定(可搜索 0x63, 0x7c 等字节序列);密钥扩展常数 Rcon |
| RSA | 非对称加密 | 涉及大整数运算(如模幂);常见常量 65537(0x10001)作为公钥指数;在二进制中通常通过大数库(OpenSSL、mbedtls)间接识别 |
| TEA | 对称分组加密 | 常数 Delta = 0x9E3779B9;循环中多次异或、移位、相加操作;32 轮迭代(典型实现) |
上述特征中,常量和 S 盒是最可靠的静态识别线索。在不依赖魔数(如文件签名)的情况下,准确分辨算法需要理解其结构。本日仅完成初步整理,详细原理留待后续深入学习。
二、使用 IDA 提取所需数据
在逆向分析过程中,经常需要从二进制文件中提取特定数据(如密钥、常量表、密文)。本日练习了以下方法:
- 定位数据:通过字符串窗口(Shift+F12)查找可疑常量,或通过交叉引用(Xrefs)追踪数据使用位置。
- 复制字节序列:在 IDA 的十六进制视图中选中一段数据,使用 Edit > Export data 或直接复制为十六进制文本。
- 提取到脚本:利用 IDA Python 导出数据。示例:
importidc start=0x00402000end=0x00402040data=idc.get_bytes(start,end-start)withopen("extracted.bin","wb")asf:f.write(data)
三、PyInstaller 打包 EXE 的逆向观察
使用 pyinstaller --onefile script.py 将简单的 Hello World Python 脚本打包为单个 EXE 文件。随后尝试用 IDA 或文本编辑器打开该 EXE,发现以下现象:
- 无法直接找到 “hello world” 字符串。
- 文件体积显著增大(数 MB 到数十 MB)。
- 存在大量疑似 Python 运行时库和打包后加密/压缩的数据段。
原因分析:PyInstaller 默认将 Python 解释器、依赖库、字节码(.pyc)以及主脚本打包进 EXE,并在启动时解压到内存或临时目录。字节码本身可以被反编译(如 uncompyle6),但整个 EXE 的结构并非原生 PE 可执行文件,其入口点是一个加载器,因此静态分析难以直接定位原始代码字符串。这属于打包器/封装器(Wrapper)而非传统加壳,但其对逆向造成的阻碍类似。
结论:以当前能力,逆向 PyInstaller 打包的 EXE 难度较高,且投入产出比不高,因此暂不将其作为练习目标。该实验确认了逆向工程的适用范围——原生编译语言(C/C++/Rust/Go)仍是主要分析对象。
四、当前遇到的问题
- PyInstaller 打包程序难以分析
如前所述,打包后的 EXE 结构复杂且包含运行时解压机制,无法直接提取原始字符串和逻辑。这警示在学习初期应优先聚焦于原生编译代码。 - 加密算法在不依赖魔数时的准确分辨
AES 的 S 盒和 TEA 的 Delta 常数可作为有力特征,但 MD5 的常量与某些自定义哈希可能混淆,RSA 则更多依赖大数运算模式而非固定常量。准确识别需要对算法实现有更深理解。 - 未按计划完成自写 CrackMe
原计划本日编写一个包含加密逻辑的 CrackMe 并逆向,因理论学习内容和 PyInstaller 实验耗时较多而推迟。已纳入后续两天必须完成的任务。
五、学习方向调整
本日没有产生明确的“成功瞬间”,但在实践过程中对后续学习进行了重新规划:
- 逆向能力检测:将尝试逆向一个 PyInstaller 打包的 EXE 作为阶段性能力测试(非短期目标),以检验对打包器/壳的分析水平。
- 国产 AI 工具的引入:计划将国产大语言模型(如 DeepSeek、通义千问、Kimi等)同时作为辅助分析工具(解释汇编指令、提供算法识别建议)和被研究对象(分析其客户端/API 的逆向工程可能性)。这既是学习资源优化,也是拓宽目标场景的尝试。
六、后续两天计划(巩固与复盘)
- 编写至少一个自制的 CrackMe(C/C++),加入简单的异或或 TEA 加密验证逻辑,然后使用 IDA + x64dbg 完整逆向出解密流程。
- 寻找 1-2 道 CTF 逆向方向的入门级别题目(如攻防世界、BUUCTF 平台),独立完成并写出解题思路。
- 复盘前五天内容:
- PE/ELF 文件头关键字段记忆测试
- 常用汇编指令(条件跳转、test、lea、xor 清零)的快速识别
- IDA 快捷键与 pwndbg/x64dbg 命令的整理成速查表
总结
第五天侧重于加密算法识别特征和 PyInstaller 打包机制的分析实践。理论方面整理出了四种常见算法的逆向识别要点;工具实践方面确认了原生编译代码与打包脚本代码在逆向难度上的显著差异。未能完成原定的 CrackMe 编写任务,但及时调整了学习方向,将后续重心放在巩固基础、CTF 实战和自写 CrackMe 的完整演练上。
