如何快速定位加密函数?

在逆向分析、漏洞挖掘、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 秒定位,自定义加密靠数据流回溯兜底。熟练掌握这套组合方法后,绝大多数场景下都能在几分钟内锁定目标函数,为后续的密钥提取、算法还原与数据解密打下基础。

相关推荐
for_ever_love__8 小时前
python爬虫: GET请求与POST请求
开发语言·爬虫·python·网络编程
IT毕设实战小研10 小时前
基于安卓的考研资讯系统设计与实现
android·大数据·vue.js·爬虫·python·考研·课程设计
IT毕设实战小研19 小时前
基于安卓的空气质量查询系统
android·大数据·vue.js·爬虫·python·django·课程设计
benchmark_cc1 天前
1000只ETF的5分钟K线如何批量获取?QuantDash分页策略与高性能Python实践
开发语言·人工智能·爬虫·python·算法·quantdash·量化数据源
跨境观察员小周1 天前
Crawl4AI 零基础入门:网页爬虫保姆级教程
爬虫
绘梨衣5472 天前
异步任务队列-学习2
爬虫·python·学习·任务队列
Python大数据分析@2 天前
推荐一个好用的爬虫CLI工具
爬虫·网络爬虫
傻啦嘿哟2 天前
某宝商品爬虫:破解反爬的终极方案(含IP代理池+User-Agent轮换)
爬虫·网络协议·tcp/ip
棉晗榜2 天前
C# HttpClient配置具有tls指纹发起跟浏览器一样的请求解决反爬虫防护
开发语言·爬虫·c#
、如果2 天前
推文评论数据怎么拿?X(Twitter)评论分析 Skill 的工程拆解与实测
爬虫·ai编程·twitter