如何快速定位加密函数?

在逆向分析、漏洞挖掘、CTF 解题与恶意代码分析中,加密函数的定位往往是破解数据交互、还原通信逻辑的第一步。面对无符号的二进制程序,盲目逐行阅读汇编效率极低,掌握一套从快到慢、从静到动的定位方法论,能将分析时间从数小时压缩到几分钟。

本文从工程实践出发,系统梳理快速定位加密函数的核心思路与落地方法,覆盖静态特征匹配、动态数据流追踪、代码模式识别三大维度。

一、优先排查:基于导入表与系统 API 的秒级定位

绝大多数商业软件不会从零实现加密算法,而是直接调用系统库或成熟加密库的接口。这是成本最低、成功率最高的定位路径,应作为首步排查。

1. 系统原生加密 API

Windows 平台下,程序常调用 CryptEncryptCryptDecryptBCryptEncrypt 等 CryptoAPI / CNG 接口;Linux/macOS 则多依赖 OpenSSL、mbedTLS 等库。在 IDA、Ghidra 或 x64dbg 中直接查看导入表(Import Table),搜索以下关键词即可快速锁定加密入口:

  • CryptBCryptNCrypt(Windows 原生)
  • EVP_EncryptAES_encryptRSA_public_encrypt(OpenSSL)
  • EVP_DigestMD5_InitSHA256_Init(哈希类)

若程序静态链接了加密库,导入表中不会出现函数名,但可通过后续的常量特征识别。

2. 通用编码与校验函数

Base64、CRC、MD5 等常被误认为 "加密",定位逻辑同理。导入表中出现 base64_encodecrc32 等符号时,可直接顺藤摸瓜找到数据处理链路。

二、最高效:基于特征常量的静态匹配

标准加密算法在实现时会使用固定的初始化常量、置换表或 S 盒,这些数值在二进制中是极强的特征指纹。通过搜索常量,可在无符号程序中精准识别算法类型与位置。

1. 典型算法的特征常量

  • AES:S 盒 0x63、0x7c、0x77... 共 256 字节的固定查找表;轮常量 Rcon 序列。
  • DES / 3DES:初始置换 IP 表、逆置换 IP-1 表、S 盒固定数值。
  • MD5:初始化向量 0x67452301、0xEFCDAB89、0x98BADCFE、0x10325476。
  • SHA-1:初始化常量 0x67452301、0xEFCDAB89、0x98BADCFE、0x10325476、0xC3D2E1F0。
  • SHA-256:前 8 个素数平方根小数部分的 32 位值,共 8 个初始哈希值。
  • Base64ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ 索引字符串。

2. 实操方法

在 IDA 中使用 Search → Immediate value 搜索上述常量;或直接使用 FindCrypt、KryptoAnalyzer 等插件,一键扫描二进制中的所有已知加密算法常量,并自动标注函数位置与算法名称。

该方法对静态链接、混淆程度较低的程序命中率极高,是静态分析的首选。

三、最通用:基于数据流的动态追踪

当程序使用自定义加密、常量被混淆或加密逻辑在运行时动态生成时,静态特征会失效。此时基于 "明文→加密→密文" 的数据流规律,通过动态调试反向定位,适用性最广。

1. 输入断点法(正向追踪)

找到明文数据的输入源头(如网络接收、文件读取、界面输入框),在内存中下写入断点或硬件断点。当明文被读取、拷贝、传入函数时,调试器会断下,顺着调用栈逐层回溯,最终必然到达加密函数入口。

适用于:明文内容已知、输入点清晰的场景。

2. 输出断点法(反向回溯)

如果能观察到密文结果(如网络发包、加密文件输出),可在密文内存处下写入断点。加密函数执行完成后,密文会被写入该地址,断下后查看返回地址,即可定位到加密函数的调用处与函数本体。

适用于:密文可见、但输入路径复杂的场景。

3. 内存搜索法

在程序运行时,用调试器在整个内存空间搜索已知的明文字符串或字节序列。找到明文所在内存页后,观察哪些函数访问了该地址,这些函数中大概率包含加密逻辑。

四、经验识别:基于代码模式的特征判断

当既无符号也无常量时,可通过汇编代码的结构特征,快速圈定疑似加密函数的范围。

1. 典型加密代码模式

  • 密集位运算 :大量 xorshlshrrolror 指令连续出现,是对称加密与哈希函数的典型特征。
  • 固定次数循环:外层循环严格执行固定轮数(如 AES 10/12/14 轮、DES 16 轮),循环体内进行置换、替换运算。
  • 查表操作密集:频繁以寄存器为索引读取全局数组,对应 S 盒、置换表的查找过程。
  • 异或逐字节处理:单字节循环异或一个密钥或密钥流,是简单异或加密、RC4 等流加密的常见形态。

2. 快速筛选技巧

在函数列表中优先排查:

  • 函数体较长、循环嵌套多、调用其他函数少的 "计算密集型" 函数;
  • 参数包含数据缓冲区指针 + 长度 + 另一缓冲区指针的函数(明文输入、长度、密文输出);
  • 被多处调用、传入不同数据但逻辑一致的公共函数。

五、提效工具与自动化方案

1. 静态分析插件

  • FindCrypt / FindCrypt2:IDA 经典插件,内置大量算法常量指纹,一键扫描标注。
  • Ghidra Script:KryptoAnalyzer 等脚本,支持跨平台分析。

2. 动态 Hook 工具

  • 使用 Frida、x64dbg 脚本对常见加密 API 进行 Hook,自动打印输入明文、输出密文与调用栈,无需手动断点。
  • 针对加壳程序,先脱壳或在内存中 Dump 后再做常量扫描,效果显著提升。

3. 辅助技巧

  • 对字符串交叉引用:搜索 "key"、"iv"、"encrypt"、"cipher" 等字符串,顺引到使用它们的函数。
  • 关注密钥生成逻辑:密钥派生、随机数生成函数的下游,通常紧跟加密函数。

六、实战排查优先级建议

按效率从高到低,建议遵循以下排查顺序:

  1. 查导入表与字符串,确认是否直接调用标准加密 API;
  2. 用 FindCrypt 等插件扫描特征常量,识别标准算法;
  3. 已知明文 / 密文时,优先用动态内存断点追踪数据流;
  4. 上述均失效时,结合代码模式人工筛选疑似函数;
  5. 最后通过动调单步、输入输出比对验证函数功能。

结语

快速定位加密函数的核心,是 "先用特征缩小范围,再用动调确认功能"。标准算法靠常量与 API 秒定位,自定义加密靠数据流回溯兜底。熟练掌握这套组合方法后,绝大多数场景下都能在几分钟内锁定目标函数,为后续的密钥提取、算法还原与数据解密打下基础。

相关推荐
oh,huoyuyan12 小时前
网页公开数据采集工具推荐
人工智能·爬虫·火车采集器
崔子末13 小时前
某影视库剧集列表以及查询接口逆向
爬虫·python
雪山青木1 天前
全国微博签到数据201912-202004
大数据·爬虫·python·数据挖掘·数据分析·新浪微博
TlSfoward1 天前
DLL 指纹库 采集、检索 TLSFOWARD tls指纹库
爬虫·网络协议·https·自动化
有味道的男人2 天前
基于 Codex 爬虫构建亚马逊无人上架系统|竞品详情采集到商品发布完整实现
爬虫·亚马逊
张小凡vip2 天前
Python爬虫实战:高效稳定的文件下载模块设计与实现
开发语言·爬虫·python
tang777893 天前
爬虫代理报错速查:407/408/409/410/503 从报错到根治(实测可用)
爬虫·爬虫代理·动态代理ip·代理ip·503·407·爬虫报错
小白学大数据3 天前
Python 爬虫实战:抓取汽车之家二手车成交价格与里程数据
开发语言·爬虫·python·汽车
张小凡vip4 天前
python--爬虫--成熟的爬虫框架Scrapy
爬虫·python·scrapy