WAKU 发表于 2006-10-13 21:21:45

音速启动密码全分析

【文章标题】: 音速启动密码全分析
【文章作者】: WAKU
【作者邮箱】: [email protected]
【软件名称】: 音速启动
【软件版本】: 5.0 Build 2006.9.25
【加壳方式】: UPX
【编写语言】: VB
【使用工具】: FileMon VBExplorer OD等
【操作平台】: XP SP2
【软件介绍】: 音速启动是WAKU非常喜欢的软件,可以方便地管理应用程序、文件夹、网址.此处省略1G的赞美之词,最重要的是她是一个国产的,免费的软件.
【作者声明】: 本文主要用于技术研究,WAKU并不想因为本文的存在而使音速启动的使用受到影响,请大家尊重他人的隐私.
--------------------------------------------------------------------------------
【详细过程】
音速启动的安全性主要体现在下面三个方面:
1.登录验证
2.文件夹保护
3.栏目加密
下面将会分别介绍它们的保护措施及对应的破解方法.

1.登录验证
防:登录验证也就是音速启动启动的时候要输入的密码,如密码不正确将不能使用音速启动
破:用FileMon可以监视到音速启动启动的时候打开了Files\Config.ini文件,在组里有PassWord一项,后面是明文存储的登录密码经过MD5后的值,如删除掉该值,就移除了启动密码(这个...有点简单哈~)

2.文件夹保护
防:文件夹保护是一个比较实用的功能,可以阻止他人浏览你想保密的文件夹.启用文件夹保护后,就会运行一个vsEnFolder.exe的隐藏进程,用普通双击是不能打开受保护的文件夹的,只能点右键>访问此文件夹,然后输入正确的密码才能进入.
破:文件夹保护相关的文件是User50\enFolder.vsf,打开看一下,会发现类似qEJMtDsFtEwDEMEICMDMtCvBrECJnCJMrCwDxCwCINtEsEELmFCMsCyEtBtCnBm等字符,很明显,这些是经过加密的.看一下User50文件夹下的其他文件,比如在WAKU的User50文件夹下就有"我的程序.vst","我的文件夹.vst"等,都是以这种方式加密的.而这些加密的内容肯定会有逆运算还原成明文给用户查看,看来有必要研究一下它的还原算法了~
点击音速启动的菜单>文件夹保护,会弹出一个InputBox要求输入口令(默认密码为12345),输入错了会弹出口令错误的消息框.
用PEID探一下音速启动的主程序VStart.exe,UPX的壳,轻松脱掉.再查,VB6写的,讨厌...
用OD载入脱壳后的文件unpacked.exe,在命令行输入bp rtcMsgBox下断,再输入口令,结果...没断下来,现在还不知道为啥,请高人指教.
这招不行咱换一招,用VBExplorer.exe加载unpacked.exe,在工程窗口找到frmInputBox窗体,在属性窗口找到frmInputBox窗体的事件,其中cmdOK有一个Click事件,记下该事件的地址为0x004EE520,在OD用CTRL+G来到该地址,下断.运行程序,再随便输入口令,果然断下来了,我F8啊F8,F8了半天发现自己进到了MSVBVM60.DLL里,可能这个确定按钮离验证过程实在是太远了...咱再换一招.
字符串搜索~要注意VB用的是UNICODE,所以搜索时也要FIND UNICODE,搜索完后翻翻,发现这个字符串user50\enFolder.vsf,这不就是文件夹保护的那个文件么,啥也别说了终于找到组织了,双击,F2下断,附近的代码节选如下:

0055DF5A    68 74D04300   push    0043D074                              ; user50\enFolder.vsf
0055DF5F    FF15 98104000   call    [<&MSVBVM60.__vbaStrCat>]               ; MSVBVM60.__vbaStrCat
0055DF65    8BD0            mov   edx, eax
0055DF67    8D4D D0         lea   ecx,
0055DF6A    FF15 BC134000   call    [<&MSVBVM60.__vbaStrMove>]            ; MSVBVM60.__vbaStrMove
0055DF70    C745 FC 0900000>mov   dword ptr , 9
0055DF77    8B55 D0         mov   edx,
0055DF7A    52            push    edx
0055DF7B    6A 01         push    1
0055DF7D    6A FF         push    -1
0055DF7F    6A 01         push    1
0055DF81    FF15 F8124000   call    [<&MSVBVM60.__vbaFileOpen>]             ; 读取enFolder.vsf
0055DF87    C745 FC 0A00000>mov   dword ptr , 0A
0055DF8E    6A 01         push    1
0055DF90    8D45 D4         lea   eax,
0055DF93    50            push    eax
0055DF94    FF15 38104000   call    [<&MSVBVM60.__vbaLineInputStr>]         ; 从enFolder.vsf中读取一行内容
0055DF9A    C745 FC 0B00000>mov   dword ptr , 0B
0055DFA1    6A 01         push    1
0055DFA3    FF15 A4114000   call    [<&MSVBVM60.__vbaFileClose>]            ; MSVBVM60.__vbaFileClose
0055DFA9    C745 FC 0C00000>mov   dword ptr , 0C
0055DFB0    8B4D D4         mov   ecx,                            ; 读取的内容 > ECX
0055DFB3    51            push    ecx
0055DFB4    E8 77C4FDFF   call    <转换成明文>                            ; (Initial CPU selection)

从0055DF94处的CALL返回的EAX中就可以看到读取的内容正是enFolder.vsf里的密文.经过0055DF84的CALL,该密文就被还原成明文,看来这个CALL,就是还原明文的CALL了,F7跟进.
先等一下,我先说明几点,众所周知,VB编译的程序有很多垃圾代码,就像这个还原明文的CALL里,有很多没有用的代码,在分析的时候浪费了我大量精力,本着我不入地狱谁入地狱的精神,为了避免再浪费大家的时间,我只把有用的代码加上了注释,其他的就忽略吧.

0053A430 >55            push    ebp
0053A431    8BEC            mov   ebp, esp
0053A433    83EC 14         sub   esp, 14
0053A436    68 06CB4000   push    <jmp.&MSVBVM60.__vbaExcept>
0053A43B    64:A1 00000000mov   eax, fs:
0053A441    50            push    eax
0053A442    64:8925 0000000>mov   fs:, esp
0053A449    81EC A8000000   sub   esp, 0A8
0053A44F    53            push    ebx
0053A450    56            push    esi
0053A451    57            push    edi
0053A452    8965 EC         mov   , esp
0053A455    C745 F0 806B400>mov   dword ptr , 00406B>
0053A45C    33F6            xor   esi, esi
0053A45E    8975 F4         mov   , esi
0053A461    8975 F8         mov   , esi
0053A464    8975 CC         mov   , esi
0053A467    8975 C8         mov   , esi
0053A46A    8975 C4         mov   , esi
0053A46D    8975 C0         mov   , esi
0053A470    8975 BC         mov   , esi
0053A473    8975 AC         mov   , esi
0053A476    8975 9C         mov   , esi
0053A479    8975 8C         mov   , esi
0053A47C    8B55 08         mov   edx,
0053A47F    8D4D C8         lea   ecx,
0053A482    FF15 2C134000   call    [<&MSVBVM60.__vbaStrCopy>] ; 暂存密文
0053A488    6A 01         push    1
0053A48A    FF15 10114000   call    [<&MSVBVM60.__vbaOnError>] ; MSVBVM60.__vbaOnError
0053A490    8975 D0         mov   , esi
0053A493    8B45 C8         mov   eax,
0053A496    50            push    eax
0053A497    FF15 40104000   call    [<&MSVBVM60.__vbaLenBstr>] ; 求得密文长度(UNICODE*2)
0053A49D    8985 6CFFFFFF   mov   , eax            ; 长度 >
0053A4A3    BB 01000000   mov   ebx, 1
0053A4A8    8B3D 54124000   mov   edi, [<&MSVBVM60.__vbaUI1I>; MSVBVM60.__vbaUI1I4
0053A4AE    3B9D 6CFFFFFF   cmp   ebx,
0053A4B4    0F8F C2020000   jg      0053A77C                   ; 还有字符吗?
0053A4BA    C745 B4 0100000>mov   dword ptr , 1
0053A4C1    C745 AC 0200000>mov   dword ptr , 2
0053A4C8    8D4D C8         lea   ecx,
0053A4CB    894D 94         mov   , ecx
0053A4CE    C745 8C 0840000>mov   dword ptr , 4008
0053A4D5    8D55 AC         lea   edx,
0053A4D8    52            push    edx
0053A4D9    53            push    ebx
0053A4DA    8D45 8C         lea   eax,
0053A4DD    50            push    eax
0053A4DE    8D4D 9C         lea   ecx,
0053A4E1    51            push    ecx
0053A4E2    FF15 8C114000   call    [<&MSVBVM60.rtcMidCharVar>>; MSVBVM60.rtcMidCharVar
0053A4E8    8D55 9C         lea   edx,
0053A4EB    52            push    edx
0053A4EC    FF15 44104000   call    [<&MSVBVM60.__vbaStrVarMov>; MSVBVM60.__vbaStrVarMove
0053A4F2    8BD0            mov   edx, eax
0053A4F4    8D4D CC         lea   ecx,
0053A4F7    8B35 BC134000   mov   esi, [<&MSVBVM60.__vbaStrM>; MSVBVM60.__vbaStrMove
0053A4FD    FFD6            call    esi
0053A4FF    8D45 9C         lea   eax,
0053A502    50            push    eax
0053A503    8D4D AC         lea   ecx,
0053A506    51            push    ecx
0053A507    6A 02         push    2
0053A509    FF15 50104000   call    [<&MSVBVM60.__vbaFreeVarLi>; MSVBVM60.__vbaFreeVarList
0053A50F    83C4 0C         add   esp, 0C
0053A512    C745 B4 0100000>mov   dword ptr , 1
0053A519    C745 AC 0200000>mov   dword ptr , 2
0053A520    8D55 C8         lea   edx,
0053A523    8955 94         mov   , edx
0053A526    C745 8C 0840000>mov   dword ptr , 4008
0053A52D    8D45 AC         lea   eax,
0053A530    50            push    eax
0053A531    8BCB            mov   ecx, ebx
0053A533    83C1 01         add   ecx, 1
0053A536    0F80 06030000   jo      0053A842
0053A53C    51            push    ecx
0053A53D    8D55 8C         lea   edx,
0053A540    52            push    edx
0053A541    8D45 9C         lea   eax,
0053A544    50            push    eax
0053A545    FF15 8C114000   call    [<&MSVBVM60.rtcMidCharVar>>; 2个字符一组依次取密文中的字符,取得的字符记为c1和c2
0053A54B    8D4D 9C         lea   ecx,
0053A54E    51            push    ecx
0053A54F    FF15 44104000   call    [<&MSVBVM60.__vbaStrVarMov>; MSVBVM60.__vbaStrVarMove
0053A555    8BD0            mov   edx, eax
0053A557    8D4D C0         lea   ecx,
0053A55A    FFD6            call    esi
0053A55C    8D55 9C         lea   edx,
0053A55F    52            push    edx
0053A560    8D45 AC         lea   eax,
0053A563    50            push    eax
0053A564    6A 02         push    2
0053A566    FF15 50104000   call    [<&MSVBVM60.__vbaFreeVarLi>; MSVBVM60.__vbaFreeVarList
0053A56C    83C4 0C         add   esp, 0C
0053A56F    6A 01         push    1
0053A571    68 080E4300   push    00430E08                   ; ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz
0053A576    8B4D CC         mov   ecx,
0053A579    51            push    ecx
0053A57A    6A 00         push    0
0053A57C    8B35 14134000   mov   esi, [<&MSVBVM60.__vbaInSt>; MSVBVM60.__vbaInStr
0053A582    FFD6            call    esi                        ; 返回c1在上面的字符串中的位置
0053A584    8BC8            mov   ecx, eax
0053A586    83E9 01         sub   ecx, 1
0053A589    0F80 B3020000   jo      0053A842
0053A58F    FFD7            call    edi                        ; 位置-1,记为a
0053A591    8845 D8         mov   , al               ; a放到中
0053A594    6A 01         push    1
0053A596    68 080E4300   push    00430E08                   ; ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz
0053A59B    8B55 C0         mov   edx,
0053A59E    52            push    edx
0053A59F    6A 00         push    0
0053A5A1    FFD6            call    esi                        ; 返回c2在上面的字符串中的位置
0053A5A3    8BC8            mov   ecx, eax
0053A5A5    83E9 01         sub   ecx, 1
0053A5A8    0F80 94020000   jo      0053A842
0053A5AE    FFD7            call    edi                        ; 位置-1,记为b
0053A5B0    8845 D4         mov   , al               ; b放到中
0053A5B3    8B75 D4         mov   esi,             ; b再放到ESI中
0053A5B6    81E6 FF000000   and   esi, 0FF                   ; 取低字节,其实还是b
0053A5BC    89B5 58FFFFFF   mov   , esi
0053A5C2    68 00000840   push    40080000
0053A5C7    6A 00         push    0
0053A5C9    68 00000040   push    40000000
0053A5CE    6A 00         push    0
0053A5D0    FF15 44134000   call    [<&MSVBVM60.__vbaPowerR8>] ; MSVBVM60.__vbaPowerR8
0053A5D6    FF15 9C134000   call    [<&MSVBVM60.__vbaFpI4>]    ; MSVBVM60.__vbaFpI4
0053A5DC    8BC8            mov   ecx, eax                   ; EAX总是等于8
0053A5DE    8BC6            mov   eax, esi                   ; esi中还是b > EAX
0053A5E0    99            cdq
0053A5E1    F7F9            idiv    ecx                        ; b / 8
0053A5E3    8BC8            mov   ecx, eax
0053A5E5    FFD7            call    edi
0053A5E7    8845 DC         mov   , al               ; 商 > 记为d1
0053A5EA    DB85 58FFFFFF   fild    dword ptr
0053A5F0    DD9D 50FFFFFF   fstp    qword ptr
0053A5F6    68 00000840   push    40080000
0053A5FB    6A 00         push    0
0053A5FD    68 00000040   push    40000000
0053A602    6A 00         push    0
0053A604    FF15 44134000   call    [<&MSVBVM60.__vbaPowerR8>] ; MSVBVM60.__vbaPowerR8
0053A60A    8B55 DC         mov   edx,
0053A60D    81E2 FF000000   and   edx, 0FF
0053A613    8995 4CFFFFFF   mov   , edx            ; 余数 >
0053A619    DB85 4CFFFFFF   fild    dword ptr
0053A61F    DD9D 44FFFFFF   fstp    qword ptr
0053A625    DC8D 44FFFFFF   fmul    qword ptr
0053A62B    DCAD 50FFFFFF   fsubr   qword ptr
0053A631    DFE0            fstsw   ax
0053A633    A8 0D         test    al, 0D                     ; 经过一顿浮点运算,AL中又是余数了....
0053A635    0F85 02020000   jnz   0053A83D
0053A63B    FF15 F0114000   call    [<&MSVBVM60.__vbaFpUI1>]   ; MSVBVM60.__vbaFpUI1
0053A641    8845 D4         mov   , al               ; 余数 > 记为d2
0053A644    6A 00         push    0
0053A646    8B75 D0         mov   esi,
0053A649    56            push    esi
0053A64A    6A 01         push    1
0053A64C    6A 11         push    11
0053A64E    8D45 BC         lea   eax,
0053A651    50            push    eax
0053A652    6A 01         push    1
0053A654    68 80000000   push    80
0053A659    FF15 00124000   call    [<&MSVBVM60.__vbaRedimPres>; MSVBVM60.__vbaRedimPreserve
0053A65F    83C4 1C         add   esp, 1C
0053A662    8B45 BC         mov   eax,
0053A665    85C0            test    eax, eax
0053A667    74 2A         je      short 0053A693
0053A669    66:8338 01      cmp   word ptr , 1
0053A66D    75 24         jnz   short 0053A693
0053A66F    8BCE            mov   ecx, esi
0053A671    2B48 14         sub   ecx,
0053A674    898D 78FFFFFF   mov   , ecx
0053A67A    3B48 10         cmp   ecx,
0053A67D    72 0C         jb      short 0053A68B
0053A67F    FF15 B0114000   call    [<&MSVBVM60.__vbaGenerateB>; MSVBVM60.__vbaGenerateBoundsError
0053A685    8B8D 78FFFFFF   mov   ecx,
0053A68B    898D 40FFFFFF   mov   , ecx
0053A691    EB 0C         jmp   short 0053A69F
0053A693    FF15 B0114000   call    [<&MSVBVM60.__vbaGenerateB>; MSVBVM60.__vbaGenerateBoundsError
0053A699    8985 40FFFFFF   mov   , eax
0053A69F    66:0FB64D DC    movzx   cx, byte ptr       ; d1 > CX
0053A6A4    66:6BC9 3E      imul    cx, cx, 3E               ; CX *= 3Eh
0053A6A8    0F80 94010000   jo      0053A842
0053A6AE    66:0FB655 D8    movzx   dx, byte ptr       ; a > DX
0053A6B3    66:03CA         add   cx, dx                     ; CX += a,记结果为e
0053A6B6    0F80 86010000   jo      0053A842
0053A6BC    FF15 34124000   call    [<&MSVBVM60.__vbaUI1I2>]   ; MSVBVM60.__vbaUI1I2
0053A6C2    8B4D BC         mov   ecx,
0053A6C5    8B51 0C         mov   edx,
0053A6C8    8B8D 40FFFFFF   mov   ecx,
0053A6CE    88040A          mov   , al
0053A6D1    8B4D BC         mov   ecx,
0053A6D4    85C9            test    ecx, ecx
0053A6D6    74 2D         je      short 0053A705
0053A6D8    66:8339 01      cmp   word ptr , 1
0053A6DC    75 27         jnz   short 0053A705
0053A6DE    8BC6            mov   eax, esi
0053A6E0    2B41 14         sub   eax,
0053A6E3    8985 74FFFFFF   mov   , eax
0053A6E9    3B41 10         cmp   eax,
0053A6EC    72 0F         jb      short 0053A6FD
0053A6EE    FF15 B0114000   call    [<&MSVBVM60.__vbaGenerateB>; MSVBVM60.__vbaGenerateBoundsError
0053A6F4    8B4D BC         mov   ecx,
0053A6F7    8B85 74FFFFFF   mov   eax,
0053A6FD    8985 3CFFFFFF   mov   , eax
0053A703    EB 0F         jmp   short 0053A714
0053A705    FF15 B0114000   call    [<&MSVBVM60.__vbaGenerateB>; MSVBVM60.__vbaGenerateBoundsError
0053A70B    8985 3CFFFFFF   mov   , eax
0053A711    8B4D BC         mov   ecx,
0053A714    85C9            test    ecx, ecx
0053A716    74 27         je      short 0053A73F
0053A718    66:8339 01      cmp   word ptr , 1
0053A71C    75 21         jnz   short 0053A73F
0053A71E    8BC6            mov   eax, esi
0053A720    2B41 14         sub   eax,
0053A723    8985 78FFFFFF   mov   , eax
0053A729    3B41 10         cmp   eax,
0053A72C    72 1A         jb      short 0053A748
0053A72E    FF15 B0114000   call    [<&MSVBVM60.__vbaGenerateB>; MSVBVM60.__vbaGenerateBoundsError
0053A734    8B4D BC         mov   ecx,
0053A737    8B85 78FFFFFF   mov   eax,
0053A73D    EB 09         jmp   short 0053A748
0053A73F    FF15 B0114000   call    [<&MSVBVM60.__vbaGenerateB>; MSVBVM60.__vbaGenerateBoundsError
0053A745    8B4D BC         mov   ecx,
0053A748    8B49 0C         mov   ecx,
0053A74B    8B95 3CFFFFFF   mov   edx,
0053A751    8A1411          mov   dl,             ; 中就是e
0053A754    3255 D4         xor   dl,                ; e ^ d2
0053A757    881401          mov   , dl            ; DL中得到的结果就是还原后的字符了
0053A75A    83C6 01         add   esi, 1
0053A75D    0F80 DF000000   jo      0053A842
0053A763    8975 D0         mov   , esi
0053A766    B8 02000000   mov   eax, 2
0053A76B    03C3            add   eax, ebx
0053A76D    0F80 CF000000   jo      0053A842
0053A773    8BD8            mov   ebx, eax
0053A775    33F6            xor   esi, esi
0053A777^ E9 32FDFFFF   jmp   0053A4AE                   ; 继续取下两个字符
0053A77C    8D45 BC         lea   eax,             ; ECX中就是还原的明文
0053A77F    8945 94         mov   , eax
0053A782    C745 8C 1160000>mov   dword ptr , 6011
0053A789    56            push    esi
0053A78A    6A 40         push    40
0053A78C    8D4D 8C         lea   ecx,
0053A78F    51            push    ecx
0053A790    8D55 AC         lea   edx,
0053A793    52            push    edx
0053A794    FF15 C0124000   call    [<&MSVBVM60.rtcStrConvVar2>; MSVBVM60.rtcStrConvVar2
0053A79A    8D45 AC         lea   eax,
0053A79D    50            push    eax
0053A79E    FF15 44104000   call    [<&MSVBVM60.__vbaStrVarMov>; MSVBVM60.__vbaStrVarMove
0053A7A4    8BD0            mov   edx, eax
0053A7A6    8D4D C4         lea   ecx,
0053A7A9    FF15 BC134000   call    [<&MSVBVM60.__vbaStrMove>] ; MSVBVM60.__vbaStrMove
0053A7AF    8D4D AC         lea   ecx,
0053A7B2    FF15 30104000   call    [<&MSVBVM60.__vbaFreeVar>] ; MSVBVM60.__vbaFreeVar
0053A7B8    FF15 00114000   call    [<&MSVBVM60.__vbaExitProc>>; MSVBVM60.__vbaExitProc
0053A7BE    9B            wait
0053A7BF    68 27A85300   push    0053A827
0053A7C4    EB 3F         jmp   short 0053A805
0053A7C6    BA B00D4300   mov   edx, 00430DB0
0053A7CB    8D4D C4         lea   ecx,
0053A7CE    FF15 2C134000   call    [<&MSVBVM60.__vbaStrCopy>] ; MSVBVM60.__vbaStrCopy
0053A7D4    FF15 00114000   call    [<&MSVBVM60.__vbaExitProc>>; MSVBVM60.__vbaExitProc
0053A7DA    9B            wait
0053A7DB    68 27A85300   push    0053A827
0053A7E0    EB 23         jmp   short 0053A805
0053A7E2    F645 F4 04      test    byte ptr , 4
0053A7E6    74 09         je      short 0053A7F1
0053A7E8    8D4D C4         lea   ecx,
0053A7EB    FF15 1C144000   call    [<&MSVBVM60.__vbaFreeStr>] ; MSVBVM60.__vbaFreeStr
0053A7F1    8D4D 9C         lea   ecx,
0053A7F4    51            push    ecx
0053A7F5    8D55 AC         lea   edx,
0053A7F8    52            push    edx
0053A7F9    6A 02         push    2
0053A7FB    FF15 50104000   call    [<&MSVBVM60.__vbaFreeVarLi>; MSVBVM60.__vbaFreeVarList
0053A801    83C4 0C         add   esp, 0C
0053A804    C3            retn
0053A805    8D4D CC         lea   ecx,
0053A808    8B35 1C144000   mov   esi, [<&MSVBVM60.__vbaFree>; MSVBVM60.__vbaFreeStr
0053A80E    FFD6            call    esi
0053A810    8D4D C8         lea   ecx,
0053A813    FFD6            call    esi
0053A815    8D4D C0         lea   ecx,
0053A818    FFD6            call    esi
0053A81A    8D45 BC         lea   eax,
0053A81D    50            push    eax
0053A81E    6A 00         push    0
0053A820    FF15 E0104000   call    [<&MSVBVM60.__vbaAryDestru>; MSVBVM60.__vbaAryDestruct
0053A826    C3            retn

上面的还原算法如果用C++来写,只需要大约10行代码:
char* str = "GJxB0MJIbKhMcJrI0MIKLLQLaLzL6KHJKKKN8JxJQLaLiLlLLN8JsJiM9KjL8NoKjD9MwIfK";//密文
int i;
int a, b, d1, d2;

for (i = 0; i < strlen(str); i += 2)
{
    a = GetIndex(str);      //获得str在ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz中的位置
    b = GetIndex(str);
    d1 = b / 8;
    d2 = b % 8;
    cout<<char(d1*0x3e + a ^ d2);//输出还原后的字符
}

经还原后的明文看,前32位存放的是密码经过MD5加密后的值,之后放的是加密的文件夹路径,之间用|隔开.
知道了存放格式,破解就好办了,直接把enFolder.vsf的前64个字符改为zFsEqDFIJMIMrFGJDMHMxDFKpEnBrDJMsCJMmDtDDIrEoExDvAqFGKyEsCJKrCDL,这个密文还原后是827CCB0EEA8A706C4C34A16891F84E7B,也就是12345经过MD5加密后的值.所以这么改后,密码就变成了12345,不错吧?

3.栏目加密
防:音速启动可以针对每个栏目分别加密,这样切换到加密后的栏目不输入密码是看不到里面有什么程序的.
破:为了分析方便,WAKU在自己的音速启动"我的程序"类别下新加了一个栏目,名字叫"test",打开user50\我的程序.vst,最后一行是+uKeLoLoM,不算前面的+号,KeLoLoM经过还原算法正好是test.可见+号是栏目名称的标记.(注意test的密文却可以有多个,比如tJfKqJvL还原后也是test,密文是随机生成的)
随便往里扔一个东西,比如我把桌面上的1.exe扔进test栏目,发现我的程序.vst最后的内容变成如下模样:

+uKeLoLoM
oD,DKxB6KDNmJaJuLmLeLkKpNqJ7BdMkKfLbFTKeLoMsIjKlLdKqJ7LYJDIKLWJ7L10I0M3g07LoDgE9MxJeL,ejbn1nhjlkfmsjgncjllukri6aalmidj8cuj9mpnpnlmjndkol0myjelkltm1ny3k2izh16kmbge9mxj9m,,,qE,nBiA,
其中逗号起分隔作用,那么我们把它还原看看,原来是这个样子:
+test
1,C:\Documents and Settings\WAKU\桌面\1.exe,C:\Documents and Settings\WAKU\桌面\1.exe,,,0,0,

大体上是名称,路径之类的,不必过于研究.
如果我们给栏目加密,密码还用12345,之后密文变成这样:

+sI8NqJtJ,xDtFtAEJDKFJqEGJILHMvBCJoFpDoEJMmEJMmDsCELmBqCwCwDrEEMxDqAJKsBJN
xDoAqDILoFFJlDjMJL,EJAM5JHJjM9KpMnKeLmIvLvM9DcNjNeKaEUJcJsItJiLiMeJrI5JWLELMJWJ0M2ZI0H0jZ0MnAkAdIxJeL,CLAM6KJLkLeNtIlI8NkKoMoL7BcNjNeKaEYNcJtJoMgJlLcLqJ5JWLDILKXI7LZ2I0N2iY1NpChFfKxJfK,,,oC,oClD,
再翻译一下,是这样:
+test,827CCB0EEA8A706C4C34A16891F84E7B
827E7B,oD,C:\Documents and Settings\WAKU\桌面\1.exe,C:\Documents and Settings\WAKU\桌面\1.exe,,,0,0,

827CCB0EEA8A706C4C34A16891F84E7B还是MD5(12345)的值.
可见,在栏目名后面加一个逗号,然后放的是MD5(密码).其他都没什么变化,就是名称变成了827E7B,oD,这是什么呢?oD和没加密前的名称一样,是1的密文,只要再经过一次还原就知道原始程序名称了.那前面的827E7B呢?
仔细看MD5值的前3位和后3位,发现了吗?哈哈~~~~为了证实这不是一种巧合,我们把密码更改为54321,再来看看:

密文:
+vLfKqJtJ,nBmBFIEMFIJLrBEMtBFJvBtAqDnBEMJKCKJJDLsCnBDKDLuBnBsApEmBnEzFpBsE
rFnACLvBpBpBkCnKIM,EJAM0MCMnIbIvKhM9MjNtJrI9DcNkKfL6AYN9MuKvLiLlLcLpK5JXKGNMJWJ6K01J1H0e25JnAgEfKyK9M,DKuC0MDNlK8LvKlIeLmIsIoL7BaLnJeKaETKeLuKoMlMnJcLrI1NVMDILKYL4IZ2GYH0g01NqFjDdIxJcJ,,,mA,pDeE,
明文:
+test,01CFCD4F6B8770FEBFB40CB906715822
01C822,mB....之后还用我COPY吗?哈哈~

再怎么破解我就不多说了,相信看懂了后是件很容易的事,收工.


WAKU
2006-10-13.

bfqyygy 发表于 2006-10-13 22:06:43

不错!!支持!

网游难民 发表于 2006-10-14 21:36:28

这个强,的确需要认真学习下啊~~
页: [1]
查看完整版本: 音速启动密码全分析