加密算法分析经验小结
注:随便写点,供自己以后再分析算法时候看,免得走弯路
分析加密算法是一件很头大的事情,这里针对通用的加密算法,譬如MD5,AES之类,谈谈分析经验。
通用加密算法都不可小觑,其作者莫出科学家之外,就算不是科学家,搞出来那也成了科学家。这类算法由于浸泡了深厚的数学功力,在我等看来高深莫测。这里不说其原理等等,单表如何逆向分析并重写出来。
从反汇编角度,这类算法往往有以下特点:
1、代码很长,不下于1、2千行;
2、处理流程简单,往往一筒子到底,中间很少有跳转或者判断;
3、有很明显的密码表。比如 mov eax, dword ptr[401234 + esi]之类;
4、主要有2-4个关键函数,特点如上面列的3条,其中前面的函数往往用来初始化密钥,后面的函数才是加密数据。
如果打算把这类函数给分析完全,可以参考以下几点经验:
1、根据密码表找到该加密算法。这类算法密码表一般都是固定的,如果不固定,虽都可以改来改去,那也就不搞深了。利用密码表里的数据,GooGle一下基本就可以找到是什么算法;
2、算法流程很长,但实际上是有法可徇的。操作流程基本都重复。如果运气好,主加密流程或许是个循环,那就更好办。如果运气不好,是一筒子下去,中间连个跳转都没有,那说明作者写代码时候或许用了宏,既然用到宏,说明那么多代码其实都在重复一种或者二种操作。为什么可以这么说呢?因为我们碰到的加密算法基本都2、3千行代码,虽然说反汇编代码比高级语言源代码长,但是我们很少见到长达1千行高级语言的加密算法。因此可以肯定地说我们面对的数千行代码其实都在重复一、二种运算流程。
4、网上有一些分析算法的软件,可以搞过来分析一下,或许有所启发。不可尽信,也不可不信(跟心诚没关系,汗。。);
3、现在我们知道了算法的名称、来历,通过官方资料和自己分析,或许可以搞明白这个算法的流程了。
下面把这个令人头大的算法还原成我们可用的代码。大体一下几条思路:
1、如果确定了是某种算法,尽量找源代码。这就要求平时多搜集、留意,免得临时抱佛脚;
2、搞不到算法,但是可以搞到类似的算法代码,可以看看能不能根据该代码修改一下,搞成自己用的。比如你碰到一个变形DES算法,那么考虑一下能否用标准DES改写一下。当然这需要分析透彻代码和反汇编代码;
3、如果头脑够灵活,把代码上面说的那几个宏操作分析一下,自己写出来;
4、如果象我这种头脑不灵便,那就可以把代码一句一句翻译成高级语言。比如说:
mov eax, ebx
xor eax, dword ptr [401234 + esi]
那就定义上变量 r_eax, r_ebx, r_esi 和密码表 T_401234,然后翻译成 r_eax = r_ebx ; r_eax ^= T_401234[r_esi];
这意味着要把数千行代码都这么翻译过来。这种垒长城的工作即没有技术含量,也浪费时间。一般需要一天半写代码+半天调试。
很不幸我到现在垒过2次长城了。
5、内嵌汇编。具体没用过,个人感觉是最省力高效的事情,可惜没用过;
6、打算自己写个此类软件,自动完成第4种方法(先汗一下自己。。。);
7、写代码时候整理好思路,选中一种方法走下去,别一会想修改人家代码,一会想自己重新写,那回死得很惨。