逆向时经常需要先认出"这段在做什么加密",才能谈后面的事。几个实用信号:
常量是最好的指纹
0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476→ MD5/SHA-1 的初始向量0x6A09E667开头的八个 → SHA-2560x9E3779B9→ TEA/XTEA 的 delta(黄金比例)0x63, 0x7C, 0x77, 0x7B...开头的 256 字节表 → AES S-box0xEDB88320→ CRC32 的多项式(注意 CRC 不是加密,但经常被误认)
Ghidra 和 IDA 都有插件(FindCrypt、signsrch)自动扫这些。这应该是你的第一步,成本几秒钟。
结构特征
- 16 轮或 32 轮的循环,每轮做移位异或 → 分组密码
- 大整数运算 + 模幂 → RSA/DH
- 256 字节的状态数组 + 两个索引来回交换 → RC4
没有常量的情况
白盒密码会把密钥揉进查找表,看不到标准常量。这时候只能从数据流形状判断:输入输出块大小、是否可逆、轮数。
一个提醒:认出算法只是第一步。真正的问题通常不在算法本身,而在怎么用的——ECB 模式、IV 写死、密钥硬编码、用 rand() 生成密钥。这些才是实际可利用的地方。