特征值识别
很多常见的算法,如AES、DES等,在运算过程中会使用一些常量,而为了提高运算效率,这些常量往往被硬编码在程序中
通过识别这些特征值,可以对算法进行一个大致判断
算法 | 特征值(无特殊说明为十六进制)(备注) |
---|---|
TEA系列 | 9e377b9(Delta值) |
AES | 63 7c 77 7b f2 6b 6f c5 …(S盒) |
AES | 52 09 6a d5 30 36 a5 38…(逆S盒) |
DES | 3a 32 2a 22 1a 12 0a 02…(置换表) |
DES | 39 31 29 21 19 11 09 01…(密钥变换数组PC-1) |
DES | 0e 11 0b 18 01 05 03 1c…(密钥变换数组PC-2) |
DES | 0e 04 0d 01 02 0f 0b 08…(S函数表格1) |
BlowFish | 243f6a88 85a308d3 13198a2e 0370734(P数组) |
MD5 | 67452301 efcdab89 98bbadcfe 10325476(寄存器初始值) |
MD5 | d76aa478 e8c7bb756 24070db c1bdceee…(Ti数组常量) |
SHA1 | 67452301 efcdab89 98badcfe 10325476 c3d2e1f0(寄存器初始值) |
CRC32 | 00000000 77073096 ee0e612c 990951ba(CRC表) |
Base64 | 字符串”ABCDEFGHIJKLMNNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"(字符串表) |
通过这种简单的识别法,许多开发者为各种分析工具开发了常量查找插件,如IDA的FindCypt、PEiD的KANAL等
在IDA中,FindCrypt、PEiD和KANAL都是用于分析PE文件的插件。
FindCrypt插件可以识别PE文件中的加密算法。它可以识别多种常见的加密算法,包括RSA、AES、DES、RC4等。FindCrypt还可以识别一些自定义的加密算法。
PEiD插件可以显示PE文件的各种信息,包括文件头、节表、导入表、导出表等。PEiD还可以识别一些常见的PE文件保护技术,如壳、混淆等。
KANAL插件是PEiD的一个插件,用于分析PE文件中的加密算法。KANAL可以识别多种常见的加密算法,包括RSA、AES、DES、RC4等。KANAL还可以识别一些自定义的加密算法。
以下是这三个插件在IDA中的具体功能比较:
插件 | 功能 |
---|---|
FindCrypt | 识别PE文件中的加密算法 |
PEiD | 显示PE文件的各种信息,识别PE文件保护技术 |
KANAL | 分析PE文件中的加密算法 |
以下是这三个插件在IDA中的使用方法:
FindCrypt
- 在IDA中打开要分析的PE文件。
- 点击“Plugins”菜单,选择“FindCrypt”。
- FindCrypt会显示PE文件中找到的加密算法。
PEiD
- 在IDA中打开要分析的PE文件。
- 点击“Plugins”菜单,选择“PEiD”。
- PEiD会显示PE文件的各种信息。
KANAL
- 在IDA中打开要分析的PE文件。
- 点击“Plugins”菜单,选择“Krypto ANALyzer”。
- KANAL会显示PE文件中的加密算法。
使用注意事项
- 这三个插件都是免费的,可以从网上下载
- 这三个插件的使用方法比较简单,可以参考官方文档
- 这三个插件只能识别已知的加密算法,对于未知的加密算法,这三个插件可能无法识别
除了上述功能之外,这三个插件在IDA中还有一些其他的功能:
- FindCrypt插件可以将找到的加密算法添加到IDA的数据库中,方便以后的分析
- PEiD插件可以将PE文件的信息导出到文本文件或HTML文件
- KANAL插件可以将PE文件中的加密算法导出到文本文件或HTML文件
特征运算识别
当特征值不足以识别出算法时,深入二进制文件内部,通过分析程序是否使用了某些特征运算来推测程序是否使用了某些算法
算法 | 特征运算(伪代码)(说明) |
---|---|
RC4 | i=(i+1)%256;j=(j+s[i])%256;swap(s[i],s[j]) ;t=(s[i]+s[j]%256; (密钥流生成) |
RC4 | j=(j+s[i]+k[i])%256;swap(s[i],s[j]);循环256次(S盒变换) |
Base64 | b1=c1>>2;b2=((c1&0x3)<<4)非c2>>4);b3=((c2&0xf)<<2)非(c3>>6);b4=c3&0x3f;(8位变6位) |
TEA系列 | ((x<<4)+kx)^ (y+sum) ^ ((y>>5)+ky)(轮函数) |
MD5 | (X&Y)非((~X)&Z)(F函数) (X&Z)非(Y&( ~ Z))(G函数) X ^Y ^Z (H函数) Y ^(X非( ~ Z))(I函数) |
AES | x[j]=si%4] 循环4次 s[i][j]=x[j] 循环4次 整体循环4次(行位移) |
DES | L=R R=F(R,K)^ L(Feistel结构) |
第三方库识别
为了提高编程效率,对于一些常用的算法,可以使用现成的库
对于动态链接库,函数名的符号信息可以被轻易地识别
而对于静态链接的第三方库来说,识别这些信息则比较困难
IDA识别第三方库
1.字符串识别
很多第三方库会将版本信息和该库使用的其他字符串(如报错信息等)以字符串的形式写入库中
在静态编译时,这些字符串会被一并放入二进制文件
通过寻找这些字符串,可以快速判断使用了哪些第三方库
2.函数签名识别
有时,确定了程序所使用的库后,还需要进一步识别具体的函数
之前简单介绍了如何使用IDA的签名识别功能识别C语言运行的函数库,实际上这个功能不仅能对C语言的运行库进行识别,IDA也可以通过对签名库快速匹配函数名,参数信息
IDA中自带了除C语言运行库外的常见库的签名文件
在IDA文件菜单中选择”Load File ->FLIRT Signature file"
如果IDA没有预置需要识别的库函数签名,那么可以在网上查找,如https://github.com/push0ebp/sig-database
https://github.com/Maktm/FLIRTDB
3.二进制比对识别
由于编译环境等各种情况的差异,签名有时无法完全匹配库函数
即使编译环境有一定区别,使用同一个库编译的二进制文件中的库函数也会存在许多相同之处
如果能够确定程序编写者使用了某个已知的库,并且我们能够获得一份含有符号且同样使用了该库的静态编译二进制文件,便可以利用二进制对比的方法来具体地确定每个函数
二进制对比得得常用工具是BinDiffhttps://www.zynamics.com/bindiff.html
这个没搞懂
这个工具bindiff