首页
社区
课程
招聘
[原创]破解360密盘的加密之谜
发表于: 2011-5-9 10:28 30938

[原创]破解360密盘的加密之谜

2011-5-9 10:28
30938

360密盘是360公司最新出的一款保护用户资料不外泄的加密工具,在黑客防线2010年第12期的文章上我提到绕过文件透明加密机制的方法,我提到过360密盘加密机制,它的就是利用一个文件虚拟成磁盘,也就是FileDisk的原理,了解到这一步大家就可以明白360密盘的工作原理,通过网络验证来打开加密盘符,大家再仔细想一想,是不是验证成功,就马上解密出原先加过密的镜像文件(也就是虚拟磁盘360密盘X),解密的结果如下图1:



     由于360密盘是内嵌入360安全卫士的,所以需要安装360安全卫士才会安装360密盘,其实可以将360密盘直接剥离出360安全卫士。在360安装目录下建一个360safe文件夹,这个其实就是安装360安全卫士产生的目录,里面建一个文件夹名为mipan的目录,还需要一个360Common.dll的公用通信的动态链接库文件,如下图2所示:



     用加载驱动的工具加载360mipan.sys驱动,然后就可以使用360密盘了。在磁盘分区下会生成文件目录360mipan,里面就保存着密盘(其实它是以文件的形式保存的,对操作文件模拟成对磁盘的操作,对于用户来说是透明的)。第一次登陆时,需要网络验证,登陆后在mipan目录下会生成三个文件:mipan.ini、autologin.data、savepass.dat,mipan.ini是配置文件里面有几个参数,一个是自动登陆的参数AutoLogin,如果为1,下次就直接与autologin.data中保存的账号和密码进行验证,不需要再进行网络验证,如果将AutoLogin设置为0,并且删除autologin.data,将需要再次进行网络验证。如果从autologin.data中已加密的数据逆推出原始帐号,这肯定不行,万一不是对称加密或者是单向散列算法呢?进行网络截包分析,因为网络验证,最后要需要进行网络应答的,但是这也会存在问题,因为你伪装网络服务器,回应登录成功的包后,解密加过密的密盘文件,仍然需要正确的原始帐号和密码,或者通过原始的帐号和密码对称加过密后的密文。所以上面这些想法我觉得都不太好,最好的方法就是对使用对称加密的密盘进行分析,看是否能找到一点“蛛丝马迹”。我在测试中发现如果加密一个1G的盘,其生成的文件要大于1G,正好相差1M(1024*1024字节),我使用WinHex软件打开密盘文件(该文件保存在密盘目录360mipan下扩展名为360sv的文件,该文件与360卫士挂钩,必须通过登录360密盘软件才能删除该文件),然后偏移1M的文件位置来查看该*.360sv文件,360密盘的文件格式是NTFS,我们可以结合NTFS磁盘格式来分析,效果如下图3:



     很显然这些数据肯定是加过密的,因为我们知道磁盘分区的第一个扇区是磁盘启动扇区 ,紧接着是MFT,由读取MFT来定位磁盘上的文件, BOOTSECTOR是在最开始的第一个扇区,这里我不做过多分析,有机会在跟大家学习,关键看第二个扇区,这个扇区属于NTLDR区域(含有15个扇区),总共这16个扇区(包括前面的BOOTSECTOR)我们称之为NTFS的引导模块。从第二个扇区0x21开始连续有48个字节是0,从上面的截图我们可以看到也就是0x220-0x240,这3行的数据是一样的,大家仔细看看是不是,”真的是呀,我肯定一定以及确定”,开个玩笑,继续言归正传,假设这三行里就是密钥呢?为什么呢,因为如果是xor异或算法,A^0=A,B^0=B,只要任何数跟0进行异或都是它本身,不会变得,所以我们可以认为0x220这一行数就是密钥,如下:


(E3 01 D9 D1 25 8C B1 27 66 F4 DA 6E 7A 62 58 CF),我们拿这16个字节循环来与第一个扇区异或,可以看到熟悉的BOOTSECTOR里的一些不变信息比如开头3个字节的跳转指令(EB 52 90),后面接着8个字节(文件系统格式NTFS+4个空格),还有出错信息、引导区结束标志(55 AA),通过这些分析,我们可以知道360密盘就是采取异或的方式加密,并且密钥就在文件中,有了这些信息,我们可以写出解密程序,不久前网上已经有人爆出了破解360密盘的程序,但是我还是给大家提供了源代码,因为我无聊,所以把它给逆了,并且也仿写了一个跟它一模一样程序,核心代码如下:


BOOLEAN decode360mipan(LPCSTR sourcefile,LPCSTR destfile)


{


   HMODULE hModule;


   BOOLEAN result=FALSE;


   DWORD dwFileAttributes;


   HANDLE sourcehandle;


   HANDLE desthandle;


   LARGE_INTEGER fileSize={0};


   LARGE_INTEGER filepos={0};


   LONGLONG  MinSize=0x100000;


   HANDLE maphandle;


   ULONG  tmpsize;


   DWORD dwNumberOfBytesToMap = 0x1000000;


   PVOID mapAddress = NULL;


   PDWORD  contrastpos1,contrastpos2;


   int num;


   BOOL different;


   PCHAR MiPanKeyOffset;


   ULONG i;


   BYTE Viscera;


   DWORD NumberOfBytesWritten;


   LARGE_INTEGER remainbytes={0};


   LARGE_INTEGER useedbytes={0};


   float percent;



   dwFileAttributes = GetFileAttributesA(sourcefile);


   SetFileAttributesA(sourcefile, 0x80u);


   sourcehandle = CreateFileA(sourcefile,GENERIC_READ,FILE_SHARE_READ, NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);


   if (sourcehandle == INVALID_HANDLE_VALUE)


   {


      SetFileAttributesA(sourcefile, dwFileAttributes);


   }


   else


   {


       hModule = LoadLibraryA("kernel32.dll");


           if (!hModule)


           {


              printf("LoadDll kernel32.dll failed!\n ");


                  FreeLibrary(hModule);


                  return FALSE;


           }


          DWORD _GetFileSizeEx=(DWORD)GetProcAddress(hModule,"GetFileSizeEx");



          _asm{


            push esi


                        lea esi,fileSize


                        push esi


                        push sourcehandle


                        call _GetFileSizeEx  


            pop esi


          }



         //至少文件大小要大于1M


         if (fileSize.QuadPart > MinSize)


         {


            maphandle = CreateFileMapping(sourcehandle,NULL,PAGE_READONLY,0,0,NULL);


        


                if (maphandle)


                {


                    //解密的文件句柄


                        desthandle  = CreateFileA(destfile,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);


                        if (desthandle != INVALID_HANDLE_VALUE)


                        {


               //1M大小


                                tmpsize =  1048576;


                            //从文件起始偏移的位置开始读取文件


                                filepos.QuadPart = 1048576i64;



                       while(1)


                       {


                          if (filepos.HighPart >fileSize.HighPart)


                             break;


                              if (filepos.HighPart >=fileSize.HighPart && tmpsize >= fileSize.LowPart)


                                 break;


                             //从已加密的360密盘文件中每次读取16M内容来解密


mapAddress=  MapViewOfFile(maphandle,FILE_MAP_READ,filepos.HighPart,filepos.LowPart,dwNumberOfBytesToMap);


                             if (mapAddress)


                             {


                                //得到360密盘的密钥,起始很简单,xor算法中任何数跟0异或得到的是自己,这就是获取360密钥原因,主要是ntfs稀疏文件存在的问题,这不是密码的问题,而是设计上的不足


                                        if (filepos.LowPart == 1048576 && !filepos.HighPart)


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 7
支持
分享
最新回复 (26)
雪    币: 1693
活跃值: (797)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
支持,学习,膜拜
2011-5-9 10:43
0
雪    币: 26
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
坐下来慢慢学习
2011-5-9 10:55
0
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
不错,手机上的 留名
2011-5-9 10:56
0
雪    币: 245
活跃值: (24)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
不错,学习!!!
2011-5-9 11:24
0
雪    币: 615
活跃值: (212)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
6
楼  主     v5
2011-5-9 11:57
0
雪    币: 58
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
非常好 学习
2011-5-9 12:26
0
雪    币: 251
活跃值: (1326)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
楼主真是太牛了,围观下
2011-5-9 12:32
0
雪    币: 197
活跃值: (87)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
楼主厉害,佩服楼主的学识和钻研精神
2011-5-9 12:32
0
雪    币: 9
活跃值: (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
Jiw
10
膜拜楼主!等待提升为精华
2011-5-9 12:34
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
11
话说这玩意~~蛋蛋~
2011-5-9 14:22
0
雪    币: 254
活跃值: (37)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
eggache
2011-5-9 20:07
0
雪    币: 564
活跃值: (42)
能力值: ( LV12,RANK:230 )
在线值:
发帖
回帖
粉丝
13
好像现在没有了
2011-5-10 18:11
0
雪    币: 2529
活跃值: (5802)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
14
学习................
2011-5-11 00:08
0
雪    币: 13
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
很强大
楼主研究好深入
无限膜拜
2011-5-11 11:04
0
雪    币: 773
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
"因为我无聊,所以把它给逆了"
LZ真牛B
2011-5-12 08:42
0
雪    币: 266
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
很强大
楼主研究好深入
无限膜拜
2011-11-30 15:42
0
雪    币: 209
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
很强大
楼主研究好深入
2012-2-24 15:07
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
对楼主只能膜拜了,什么都看不懂
楼主做我师傅吧。
QQ 785150915
2012-2-26 13:52
0
雪    币: 329
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
膜拜下  呵呵
2012-9-16 21:13
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
向高手学习ing...........................
2012-9-25 21:34
0
雪    币: 158
活跃值: (18)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
22
不错不错,感谢楼主分享
2012-10-14 21:37
0
雪    币: 168
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
MARK,先把你黑客防线上的文章下载下来
2013-2-2 22:27
0
雪    币: 114
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
坐下来慢慢学习
2013-2-3 08:56
0
雪    币: 353
活跃值: (57)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
25
谢谢!某公司咋这么无聊,给人虚假的安全感。俺要加密就truecrypt了。
2013-2-5 19:32
0
游客
登录 | 注册 方可回帖
返回