re 分享会 - ida 识别静态库方案
by cyril
关于来源……
在面试中
- 哈希?
- 不是哈希
- 猜了一个上下文关联
下面根据官方最新文件讲解
https://docs.hex-rays.com/user-guide/signatures/flirt/ida-f.l.i.r.t.-technology-in-depth
需求分析
- 分析对象 C or CPP
- 不完美识别
- 识别目标 segment
- 只提供函数名
- 假阳性 & 假阴性
- 性能要求
- 平台无关
- main 函数识别
技术难点
- 库的大小 → 搜索时间空间复杂度
- 重定位
- 编译器相关
- 短函数
- 版权规避
实现和原理
多阶段识别
入口点 编译器
startup signature file
前 32 字节
硬编码 + 可变编码
字典树
🌳无法区分情况?
第 33 字节到第一个变体字节(variant byte)之间的字节开始计算 CRC16 作为第二个特征存储
还是没法区分?
记录到第一个不一样的地方的字节
可还是没法区分?
Artificial Intelligence is the only way to resolve those cases. Since our goal was efficiency and speed, we decided to leave artificial intelligence for the future developments of the algorithm.
: (
引用符号特征识别
放后面的所有东西进来,管他呢
其实没啥用
编译器版本
由于我们将一个编译器的所有函数签名存储在单个签名文件中,因此无需区分库的内存模型(small、compact、medium、large、huge)及编译器的版本。
短函数过滤
签名文件的生成
- 预处理库文件:parselib
- 构建签名文件:sigmake
- 压缩文件:InfoZip
解决方案
- 树状结构解决时空复杂度
- 变体字节忽略
- 编译器单独
- 短函数引用符号类型
- 仅仅包含函数名
实操部分
Extra:文件相似度检测
- 统计各种字节的出现频率
- 然后用余弦定理