我的逆向环境是Win10 x64 逆向的产品是64位的某安全浏览器15.3.2075.64版本,版本我会放到附件里面,逆向的原因是需要做取证
我的方法是通过对CreateFile下断点拿到句柄,然后通过句柄来对ReadFile进行过滤,当ReadFile读取到内容后,对内容进行下内存写入断点
1.对Createfile下断点获取句柄
2.通过句柄来对ReadFile进行过滤
3.当ReadFile读取到内容后对内容下内存写入断点
4.当内存断点命中时就是算法的位置 所在的模块是Chrome.dll偏移0x7876C00
接下来在IDA中对算法进行分析,在分析之前需要对常见的算法特征进行了解,我的分析结果是一个AES算法
其中AES的KEY和IV都是通过MD5进行计算的,IV是固定值,KEY需要进行逆向分析
如果不知道算法的特征,可以将0x0C6A56363这种值进行百度
下面代码在Chrome.dll中偏移0x787740 这是我对数据库解密算法的分析结果
在动态调试器中找到Chrome.dll中偏移0x787740的位置,对我们已经分析出来的函数进行命名
可以看到计算完成第一个MD5得到结果是F2 A6 73 A0 A6 E1 B9 9C F6 BA B3 DB F2 37 2B 0A
第二个MD5得到结果是20 D7 42 0F 9C 37 A3 5D CA 6F E9 2A 1C 69 99 A9 这是IV
F2 A6 73 A0 A6 E1 B9 9C F6 BA B3 DB F2 37 2B 0A 和 20 D7 42 0F 9C 37 A3 5D CA 6F E9 2A 1C 69 99 A9做为参数传递给了AES_Initialization
解密前的数据是我们ReadFile读取出来的内容
解密后的数据是Sqlite3的文件标识,到这里数据库解密完成
1.将ReadFile读取的数据拷贝过来
2.使用OPENSSL库的AES算法对算法进行复现
3.解密结果和原程序一样
计算KEY的参数是AF 58 5C B1 7A 03 3E 79 BF 1E 67 DE 9D 6F 17 82 01 00 00 00 73 41 6C 54
计算的结果是F2 A6 73 A0 A6 E1 B9 9C F6 BA B3 DB F2 37 2B 0A
计算IV的参数是E8 3D 01 00 19 32 64 45 A7 FD BE 7A 31 17 2B 5F
计算的结果是20 D7 42 0F 9C 37 A3 5D CA 6F E9 2A 1C 69 99 A9
接下来先看看E8 3D 01 00 19 32 64 45 A7 FD BE 7A 31 17 2B 5F的算法,因为这个算法比较简单
经过分析发现算法就在计算IV的MD5Fun函数里面
下面就是算法的代码,这个算法是一个完整的函数,被内联优化了
算法函数有2个参数,第一个是要计算的值,第二个是接收计算结果的内存
由于算法比较复杂,这里直接将汇编拷贝到代码里面进行调用
算法函数的参数是一个固定的数字1,所以这个IV是固定值
接下来看看AF 58 5C B1 7A 03 3E 79 BF 1E 67 DE 9D 6F 17 82 01 00 00 00 73 41 6C 54的算法
经过分析AF 58 5C B1 7A 03 3E 79 BF 1E 67 DE 9D 6F 17 82 01 00 00 00 73 41 6C 54是由3个部分组成的
第一个部分是AF 58 5C B1 7A 03 3E 79 BF 1E 67 DE 9D 6F 17 82这是最重要的一个密钥
第二个部分是01 00 00 00 这是通过一个简单的算法算出来的,算法的参数是1
第三个部分是73 41 6C 54 这是一个固定值
下面是对第二个部分01 00 00 00算法的复现
由于过程内容太多,具体细节进行省略,大概就是通过对R9的基址进行追踪,然后内存访问断点进行定位
下面是定位到的算法位置是chrome.dll 中偏移0x7877BEF
在IDA中查看算法的全部样貌,可以看到该算法多次进行计算MD5
首次参与计算MD5的值是{ 28 BF 4E 5E 4E 75 8A 41 64 00 4E 56 FF FA 01 08
2E 2E 00 B6 D0 68 3E 80 2F 0C A9 FE 64 53 69 7A } 这个值是固定的
在算法函数的中间部分出现了1313f621f81ec8be54a1edbc93408161这个值需要进行逆向分析
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
最后于 2024-6-22 00:17
被旺仔_小可爱编辑
,原因: