Sendige 发表于 2016-7-20 13:17

某音频格式转换器算法分析

本帖最后由 Sendige 于 2016-7-20 15:49 编辑

【软件名称】: 蒲公英WMA/MP3格式转换器 3.9.7.0这里就不提供链接了,自己百度一下就能找到。
最近也是到一些软件站找软件练习算法分析,刚好找到一个挺符合我的,但是分析的时候真的是一波三折,最后可以算是成功计算出该软件的算法吧!!!⊙﹏⊙b汗!!先来看看软件界面
非注册用户提示转换的时候有限制

软件查壳得出是Borland Delphi 2009-2010 - www.borland.com哈哈,又是Delphi的软件,之前分析的几个也是delphi,所以我对这个语言编写的软件还算比较熟悉吧!O(∩_∩)O哈哈~好了,既然是Delphi 写的,我们按老规矩,继续使用那个Delphi的按钮事件脚本输入以下注册信息
点确定后断在这里
007647A4   .55            push ebp                                 ;注册验证
007647A5   .8BEC          mov ebp,esp
007647A7   .B9 07000000   mov ecx,0x7
007647AC   >6A 00         push 0x0
007647AE   .6A 00         push 0x0
007647B0   .49            dec ecx
007647B1   .^ 75 F9         jnz short wma-conv.007647AC
007647B3   .53            push ebx
007647B4   .56            push esi
007647B5   .57            push edi
007647B6   .8BD8          mov ebx,eax
007647B8   .33C0          xor eax,eax
007647BA   .55            push ebp
007647BB   .68 D5497600   push wma-conv.007649D5
007647C0   .64:FF30       push dword ptr fs:
007647C3   .64:8920       mov dword ptr fs:,esp
007647C6   .33D2          xor edx,edx
007647C8   .55            push ebp
007647C9   .68 45497600   push wma-conv.00764945
007647CE   .64:FF32       push dword ptr fs:
007647D1   .64:8922       mov dword ptr fs:,esp
007647D4   .8D55 F8       lea edx,dword ptr ss:
007647D7   .8B83 A4030000 mov eax,dword ptr ds:
007647DD   .E8 2E4FDFFF   call wma-conv.00559710
007647E2   .8B45 F8       mov eax,dword ptr ss:         ;用户名
007647E5   .8D55 FC       lea edx,dword ptr ss:
007647E8   .E8 0307CBFF   call wma-conv.00414EF0
007647ED   .8B45 FC       mov eax,dword ptr ss:         ;用户名
007647F0   .BA F0497600   mov edx,wma-conv.007649F0                ;user3827
007647F5   .E8 5E3ACAFF   call wma-conv.00408258                   ;用户名
007647FA   .0F84 A0000000 je wma-conv.007648A0
00764800   .8D55 F0       lea edx,dword ptr ss:          ;user3827
00764803   .8B83 A0030000 mov eax,dword ptr ds:         ;用户名
00764809   .E8 024FDFFF   call wma-conv.00559710
0076480E   .8B45 F0       mov eax,dword ptr ss:          ;假码
00764811   .8D55 F4       lea edx,dword ptr ss:
00764814   .E8 D706CBFF   call wma-conv.00414EF0
00764819   .8B45 F4       mov eax,dword ptr ss:         ;wma-conv.005F0550
0076481C   .BA 104A7600   mov edx,wma-conv.00764A10                ;138296314
00764821   .E8 323ACAFF   call wma-conv.00408258
00764826   .74 78         je short wma-conv.007648A0
00764828   .8D55 E8       lea edx,dword ptr ss:
0076482B   .8B83 A4030000 mov eax,dword ptr ds:
00764831   .E8 DA4EDFFF   call wma-conv.00559710
00764836   .8B45 E8       mov eax,dword ptr ss:          ;用户名
00764839   .8D55 EC       lea edx,dword ptr ss:
0076483C   .E8 AF06CBFF   call wma-conv.00414EF0
00764841   .8B45 EC       mov eax,dword ptr ss:          ;用户名
00764844   .BA 304A7600   mov edx,wma-conv.00764A30                ;user3825
00764849   .E8 0A3ACAFF   call wma-conv.00408258
0076484E   .74 50         je short wma-conv.007648A0
00764850   .8D55 E0       lea edx,dword ptr ss:          ;user3825
00764853   .8B83 A4030000 mov eax,dword ptr ds:         ;用户名
00764859   .E8 B24EDFFF   call wma-conv.00559710
0076485E   .8B45 E0       mov eax,dword ptr ss:          ;用户名
00764861   .8D55 E4       lea edx,dword ptr ss:
00764864   .E8 8706CBFF   call wma-conv.00414EF0
00764869   .8B45 E4       mov eax,dword ptr ss:          ;用户名
0076486C   .BA 504A7600   mov edx,wma-conv.00764A50                ;user3826
00764871   .E8 E239CAFF   call wma-conv.00408258
00764876   .74 28         je short wma-conv.007648A0               ;ecx为用户名长度
00764878   .8D55 D8       lea edx,dword ptr ss:
0076487B   .8B83 A4030000 mov eax,dword ptr ds:
00764881   .E8 8A4EDFFF   call wma-conv.00559710
00764886   .8B45 D8       mov eax,dword ptr ss:          ;用户名
00764889   .8D55 DC       lea edx,dword ptr ss:
0076488C   .E8 5F06CBFF   call wma-conv.00414EF0
00764891   .8B45 DC       mov eax,dword ptr ss:          ;用户名
00764894   .BA 704A7600   mov edx,wma-conv.00764A70                ;user3828
00764899   .E8 BA39CAFF   call wma-conv.00408258
0076489E   .75 1F         jnz short wma-conv.007648BF
007648A0   >B8 88130000   mov eax,0x1388
007648A5   >48            dec eax
007648A6   .^ 75 FD         jnz short wma-conv.007648A5
007648A8   .A1 642A7900   mov eax,dword ptr ds:
007648AD   .E8 2ED5D9FF   call wma-conv.00501DE0
007648B2   .33C0          xor eax,eax
007648B4   .5A            pop edx                                  ;wma-conv.005EE80C
007648B5   .59            pop ecx                                  ;wma-conv.005EE80C
007648B6   .59            pop ecx                                  ;wma-conv.005EE80C
007648B7   .64:8910       mov dword ptr fs:,edx
007648BA   .E9 98000000   jmp wma-conv.00764957
007648BF   > \8D55 D0       lea edx,dword ptr ss:
007648C2   .8B83 A4030000 mov eax,dword ptr ds:
007648C8   .E8 434EDFFF   call wma-conv.00559710
007648CD   .8B45 D0       mov eax,dword ptr ss:          ;用户名
007648D0   .8D55 D4       lea edx,dword ptr ss:
007648D3   .E8 1806CBFF   call wma-conv.00414EF0
007648D8   .837D D4 00    cmp dword ptr ss:,0x0          ;对比用户名是否为空
007648DC   .75 0C         jnz short wma-conv.007648EA
007648DE   .A1 642A7900   mov eax,dword ptr ds:
007648E3   .E8 F8D4D9FF   call wma-conv.00501DE0
007648E8   .EB 51         jmp short wma-conv.0076493B
007648EA   >8D55 C8       lea edx,dword ptr ss:
007648ED   .8B83 A0030000 mov eax,dword ptr ds:         ;wma-conv.007647A4
007648F3   .E8 184EDFFF   call wma-conv.00559710
007648F8   .8B45 C8       mov eax,dword ptr ss:          ;假码
007648FB   .8D55 CC       lea edx,dword ptr ss:
007648FE   .E8 ED05CBFF   call wma-conv.00414EF0
00764903   .837D CC 00    cmp dword ptr ss:,0x0          ;对比假码长度是否等于空
00764907   .75 0C         jnz short wma-conv.00764915
00764909   .A1 642A7900   mov eax,dword ptr ds:
0076490E   .E8 CDD4D9FF   call wma-conv.00501DE0
00764913   .EB 26         jmp short wma-conv.0076493B
00764915   >8BC3          mov eax,ebx
00764917   .E8 9C040000   call wma-conv.00764DB8                   ;算法call
0076491C   .84C0          test al,al
0076491E   .74 09         je short wma-conv.00764929
00764920   .8BC3          mov eax,ebx
小结:1.检测用户名是否为“user3827”user3828、user3825、user38262.接着检测注册码是否为“138296314”3.检测这些我也不知道干什么,反正后面用不上,这个可以不用管它。4.其实分析软件分析多了,都可以一眼看出哪个是关键算法,一般经过算法call后,后面都会接着test al,al 这个应该是Delphi软件的特性吧,不知道你们有没有注意到。 00764917   .E8 9C040000   call wma-conv.00764DB8                   ;算法call好了,我们进入这个call进一步分析算法吧!!
00764DB8/$55            push ebp                                 ;关键算法00764DB9|.8BEC          mov ebp,esp
00764DBB|.83C4 E8       add esp,-0x18
00764DBE|.53            push ebx
00764DBF|.56            push esi
00764DC0|.33D2          xor edx,edx
00764DC2|.8955 E8       mov ,edx
00764DC5|.8955 EC       mov ,edx
00764DC8|.8955 FC       mov ,edx
00764DCB|.8945 F8       mov ,eax
00764DCE|.33C0          xor eax,eax
00764DD0|.55            push ebp
00764DD1|.68 D44E7600   push wma-conv.00764ED4
00764DD6|.64:FF30       push dword ptr fs:
00764DD9|.64:8920       mov dword ptr fs:,esp
00764DDC|.33DB          xor ebx,ebx
00764DDE|.8D55 FC       lea edx,
00764DE1|.8B45 F8       mov eax,
00764DE4|.8B80 A4030000 mov eax,dword ptr ds:
00764DEA|.E8 2149DFFF   call wma-conv.00559710
00764DEF|.8B45 FC       mov eax,                        ;用户名
00764DF2|.85C0          test eax,eax
00764DF4|.74 16         je short wma-conv.00764E0C               ;检测用户名是否为空
00764DF6|.8BD0          mov edx,eax
00764DF8|.83EA 0A       sub edx,0xA
00764DFB|.66:833A 02    cmp word ptr ds:,0x2                ;2和2比较
00764DFF|.74 0B         je short wma-conv.00764E0C
00764E01|.8D45 FC       lea eax,
00764E04|.8B55 FC       mov edx,
00764E07|.E8 941ECAFF   call wma-conv.00406CA0
00764E0C|>85C0          test eax,eax
00764E0E|.74 05         je short wma-conv.00764E15
00764E10|.83E8 04       sub eax,0x4
00764E13|.8B00          mov eax,dword ptr ds:               ;用户名长度
00764E15|>8BF0          mov esi,eax
00764E17|.85F6          test esi,esi
00764E19|.7E 37         jle short wma-conv.00764E52
00764E1B|.C745 F0 01000>mov ,0x1
00764E22|>8D45 EC       /lea eax,
00764E25|.50            |push eax
00764E26|.B9 01000000   |mov ecx,0x1
00764E2B|.8B55 F0       |mov edx,
00764E2E|.8B45 FC       |mov eax,                     ;用户名
00764E31|.E8 8A34CAFF   |call wma-conv.004082C0
00764E36|.8B45 EC       |mov eax,                     ;用户名各字符串
00764E39|.E8 2E2DCAFF   |call wma-conv.00407B6C
00764E3E|.0FB700      |movzx eax,word ptr ds:             ;字符串转16进制
00764E41|.0FB7C0      |movzx eax,ax
00764E44|.03D8          |add ebx,eax                           ;所有字符串相加结果存在ebx
00764E46|.81F3 05FA0B00 |xor ebx,0xBFA05                         ;ebx=000BFCC6
00764E4C|.FF45 F0       |inc
00764E4F|.4E            |dec esi
00764E50|.^ 75 D0         \jnz short wma-conv.00764E22
00764E52|>A1 702A7900   mov eax,dword ptr ds:          ;特殊数据 051D05E6
00764E57|.8BD0          mov edx,eax
00764E59|.C1E0 04       shl eax,0x4
00764E5C|.03C2          add eax,edx
00764E5E|.03D8          add ebx,eax
00764E60|.81C3 D4A31300 add ebx,0x13A3D4
00764E66|.81F3 8DED5900 xor ebx,0x59ED8D
00764E6C|.8D55 E8       lea edx,
00764E6F|.8B45 F8       mov eax,
00764E72|.8B80 A0030000 mov eax,dword ptr ds:
00764E78|.E8 9348DFFF   call wma-conv.00559710
00764E7D|.8B45 E8       mov eax,                        ;假码
00764E80|.E8 470ACBFF   call wma-conv.004158CC                   ;关键算法 计算注册码的结果
00764E85|.8BF3          mov esi,ebx                              ;ebx=5754E96D
00764E87|.81F6 2473C400 xor esi,0xC47324                         ;esi=57909A49
00764E8D|.3BC6          cmp eax,esi                              ;eax为注册码计算出来的结果 esi是用户名计算出来的结果
00764E8F|.75 19         jnz short wma-conv.00764EAA            ;跳了就over
00764E91|.C645 F7 01    mov byte ptr ss:,0x1
00764E95|.B8 682A7900   mov eax,wma-conv.00792A68
00764E9A|.8B55 FC       mov edx,                        ;用户名
00764E9D|.E8 3E2CCAFF   call wma-conv.00407AE0
00764EA2|.8935 6C2A7900 mov dword ptr ds:,esi
00764EA8|.EB 04         jmp short wma-conv.00764EAE
00764EAA|>C645 F7 00    mov byte ptr ss:,0x0
00764EAE|>33C0          xor eax,eax
00764EB0|.5A            pop edx                                  ;wma-conv.0076491C
00764EB1|.59            pop ecx                                  ;wma-conv.0076491C
00764EB2|.59            pop ecx                                  ;wma-conv.0076491C
00764EB3|.64:8910       mov dword ptr fs:,edx
00764EB6|.68 DB4E7600   push wma-conv.00764EDB
00764EBB|>8D45 E8       lea eax,
00764EBE|.E8 0D2CCAFF   call wma-conv.00407AD0
00764EC3|.8D45 EC       lea eax,
00764EC6|.E8 052CCAFF   call wma-conv.00407AD0
00764ECB|.8D45 FC       lea eax,
00764ECE|.E8 FD2BCAFF   call wma-conv.00407AD0
00764ED3\.C3            retn
00764ED4   .^ E9 1313CAFF   jmp wma-conv.004061EC
00764ED9   .^ EB E0         jmp short wma-conv.00764EBB
00764EDB   .0FB645 F7   movzx eax,byte ptr ss:
00764EDF   .5E            pop esi                                  ;wma-conv.0076491C
00764EE0   .5B            pop ebx                                  ;wma-conv.0076491C
00764EE1   .8BE5          mov esp,ebp
00764EE3   .5D            pop ebp                                  ;wma-conv.0076491C
00764EE4   .C3            retn
小结:
1.检测用户名是否为空
2.逐个取用户名,然后把取出的字符转换为16进制,然后和ebx相加,第一个ebx=0 然后和0xBFA05异或,异或后的结果存在ebx,这样就一直循环计算
3.然后下面也是一连串计算,具体看我的例子
S=53
xor 53,0xBFA05= 000BFA56
----------------------------------
e=65
65+ BFA56 = 000BFABB
xor 000BFABB,0xBFA05= 000000BE
-------------------------------------
n=6E
6E+BE=0000012C
xor 12C,0xBFA05= 000BFB29
-------------------------------------
d=64
64+BFB29=000BFB8D
xor 000BFB8D,0xBFA05= 00000188
-------------------------------------
i=69
69+188=000001F1
xor 1F1,0xBFA05= 000BFBF4
-------------------------------------
g=67
67+BFBF4=000BFC5B
xor BFC5B,0xBFA05= 65E
-------------------------------------
e=65
65+65E=6C3
xor 6C3,0xBFA05= BFCC6
-------------------------------------
eax=051D05E6 mov edx,eax
shl eax,0x4= 51D05E60
51D05E60+051D05E6=56ED6446 add eax,edx
56ED6446+BFCC6=56F9610C
56F9610C+0x13A3D4=570D04E0
xor 570D04E0,0x59ED8D= 5754E96D
xor 5754E96D,0xC47324=57909A49这句在地址 00764E87 处

最后用户名计算得出的结果是57909A49

00764E8F|. /75 19         jnz short wma-conv.00764EAA            ;跳了就over00764E91|. |C645 F7 01    mov byte ptr ss:,0x1我们直接看这2句,可以看出如果jnz 实现了跳转的话,这样就赋值不了1给,所以前面的那句,test al,al 就会跳走,这样就会导致注册失败。好了,也不用我多说了,这样就能确定出下一个算法call是哪个了。00764E80|.E8 470ACBFF   call wma-conv.004158CC                   ;关键算法 计算注册码的结果
004158CC/$53            push ebx
004158CD|.56            push esi
004158CE|.83C4 F4       add esp,-0xC
004158D1|.8BD8          mov ebx,eax
004158D3|.8BD4          mov edx,esp
004158D5|.8BC3          mov eax,ebx
004158D7|.E8 A8F6FEFF   call wma-conv.00404F84                   ;注册码算法
004158DC|.8BF0          mov esi,eax
004158DE|.833C24 00   cmp dword ptr ss:,0x0
004158E2|.74 19         je short wma-conv.004158FD               ;一定要跳
004158E4|.895C24 04   mov dword ptr ss:,ebx
004158E8|.C64424 08 11mov byte ptr ss:,0x11
004158ED|.8D5424 04   lea edx,dword ptr ss:
004158F1|.A1 B4B47800   mov eax,dword ptr ds:
004158F6|.33C9          xor ecx,ecx
004158F8|.E8 E3EBFFFF   call wma-conv.004144E0                   ;触发异常
004158FD|>8BC6          mov eax,esi
004158FF|.83C4 0C       add esp,0xC
00415902|.5E            pop esi                                  ;wma-conv.00764E85
00415903|.5B            pop ebx                                  ;wma-conv.00764E85
00415904\.C3            retn
这段代码和以前分析的软件很相似,也是有个跳转,如果跳转不跳的话就会触发异常。 004158D7|.E8 A8F6FEFF   call wma-conv.00404F84                   ;注册码算法我们继续跟进去看看。
00404F84/$53            push ebx                                 ;关键算法
00404F85|.56            push esi
00404F86|.57            push edi
00404F87|.89C6          mov esi,eax
00404F89|.50            push eax
00404F8A|.85C0          test eax,eax
00404F8C|.0F84 83000000 je wma-conv.00405015                     ;再次检查注册码是否为空
00404F92|.31C0          xor eax,eax
00404F94|.31DB          xor ebx,ebx
00404F96|.BF CCCCCC0C   mov edi,0xCCCCCCC
00404F9B|>66:8B1E       /mov bx,word ptr ds:                ;指向每一个注册码
00404F9E|.83C6 02       |add esi,0x2
00404FA1|.66:83FB 20    |cmp bx,0x20
00404FA5|.^ 74 F4         \je short wma-conv.00404F9B            ;检测注册码是否有空格
00404FA7|.B5 00         mov ch,0x0
00404FA9|.66:83FB 2D    cmp bx,0x2D                              ;检测注册码是否有“-”
00404FAD|.74 76         je short wma-conv.00405025
00404FAF|.66:83FB 2B    cmp bx,0x2B                              ;检测注册码是否有“+”
00404FB3|.74 72         je short wma-conv.00405027
00404FB5|>66:83FB 24    cmp bx,0x24                              ;检测注册码是否有“$”
00404FB9|.74 74         je short wma-conv.0040502F
00404FBB|.66:83FB 78    cmp bx,0x78                              ;检测注册码是否有“x”
00404FBF|.74 6E         je short wma-conv.0040502F
00404FC1|.66:83FB 58    cmp bx,0x58                              ;检测注册码是否有“X”
00404FC5|.74 68         je short wma-conv.0040502F
00404FC7|.66:83FB 30    cmp bx,0x30                              ;检测注册码是否有“0”
00404FCB|.75 19         jnz short wma-conv.00404FE6            ;检测注册码是否有0是怕后面注册码-30后等于空
00404FCD|.66:8B1E       mov bx,word ptr ds:               ;指向下一个注册码
00404FD0|.83C6 02       add esi,0x2
00404FD3|.66:83FB 78    cmp bx,0x78                              ;检测注册码是否有“X”
00404FD7|.74 56         je short wma-conv.0040502F
00404FD9|.66:83FB 58    cmp bx,0x58                              ;检测注册码是否有“X”
00404FDD|.74 50         je short wma-conv.0040502F
00404FDF|.66:85DB       test bx,bx
00404FE2|.74 27         je short wma-conv.0040500B
00404FE4|.EB 05         jmp short wma-conv.00404FEB
00404FE6|>66:85DB       test bx,bx
00404FE9|.74 35         je short wma-conv.00405020
00404FEB|>66:83EB 30    /sub bx,0x30                           ;注册码第x位-30
00404FEF|.66:83FB 09    |cmp bx,0x9                              ;这句证明注册码为全数字 注册码的数字不能大于9
00404FF3|.77 2B         |ja short wma-conv.00405020            ;比较标志位C和Z,意思是高于转移
00404FF5|.39F8          |cmp eax,edi                           ;相加后的结果eax和作者指定的数据进行对比 不能大于它指定的数据否则错误
00404FF7|.77 27         |ja short wma-conv.00405020
00404FF9|.8D0480      |lea eax,dword ptr ds:      ;5eax
00404FFC|.01C0          |add eax,eax                           ;eax+eax
00404FFE|.01D8          |add eax,ebx
00405000|.66:8B1E       |mov bx,word ptr ds:                ;指向下一个注册码
00405003|.83C6 02       |add esi,0x2
00405006|.66:85DB       |test bx,bx
00405009|.^ 75 E0         \jnz short wma-conv.00404FEB             ;注册码开头是0的话0不参与计算
0040500B|>FECD          dec ch
0040500D|.74 0B         je short wma-conv.0040501A
0040500F|.85C0          test eax,eax
00405011|.7D 68         jge short wma-conv.0040507B
00405013|.EB 0B         jmp short wma-conv.00405020
00405015|>83C6 02       add esi,0x2
00405018|.EB 06         jmp short wma-conv.00405020
0040501A|>F7D8          neg eax
0040501C|.7E 5D         jle short wma-conv.0040507B
0040501E|.78 5B         js short wma-conv.0040507B
00405020|>5B            pop ebx                                  ;wma-conv.004158DC
00405021|.29DE          sub esi,ebx
00405023|.EB 59         jmp short wma-conv.0040507E
00405025|>FEC5          inc ch
00405027|>66:8B1E       mov bx,word ptr ds:
0040502A|.83C6 02       add esi,0x2
0040502D|.^ EB 86         jmp short wma-conv.00404FB5
0040502F|>BF FFFFFF0F   mov edi,0xFFFFFFF
00405034|.66:8B1E       mov bx,word ptr ds:
00405037|.83C6 02       add esi,0x2
0040503A|.66:85DB       test bx,bx
0040503D|.^ 74 D6         je short wma-conv.00405015
0040503F|>66:83FB 61    /cmp bx,0x61
00405043|.72 04         |jb short wma-conv.00405049
00405045|.66:83EB 20    |sub bx,0x20
00405049|>66:83EB 30    |sub bx,0x30
0040504D|.66:83FB 09    |cmp bx,0x9
00405051|.76 0E         |jbe short wma-conv.00405061
00405053|.66:83EB 11    |sub bx,0x11
00405057|.66:83FB 05    |cmp bx,0x5
0040505B|.^ 77 C3         |ja short wma-conv.00405020
0040505D|.66:83C3 0A    |add bx,0xA
00405061|>39F8          |cmp eax,edi
00405063|.^ 77 BB         |ja short wma-conv.00405020
00405065|.C1E0 04       |shl eax,0x4
00405068|.01D8          |add eax,ebx
0040506A|.66:8B1E       |mov bx,word ptr ds:
0040506D|.83C6 02       |add esi,0x2
00405070|.66:85DB       |test bx,bx
00405073|.^ 75 CA         \jnz short wma-conv.0040503F
00405075|.FECD          dec ch
00405077|.75 02         jnz short wma-conv.0040507B
00405079|.F7D8          neg eax
0040507B|>59            pop ecx                                  ;wma-conv.004158DC
0040507C|.31F6          xor esi,esi
0040507E|>D1EE          shr esi,1
00405080|.8932          mov dword ptr ds:,esi
00405082|.5F            pop edi                                  ;wma-conv.004158DC
00405083|.5E            pop esi                                  ;wma-conv.004158DC
00405084|.5B            pop ebx                                  ;wma-conv.004158DC
00405085\.C3            retn                     
小结:1.检测注册码是否为空2.检测注册码是否有空格3.检测注册码是否有“-”4.检测注册码是否有“+”5.检测注册码是否有“$”我这里省略一下,其实就是检测是否有特殊字符6. 注意一下:00404FBB 和00404FC1 这两个检测不是同一个字符“X”来的,我为了方便理解,直接填了“X”,其实这两个的“X”是不一样的,大家可以去OD看就知道了。7.检测注册码开头是否有0,因为后面有一个和30相减的,这个是我自己猜测的,不知道对不对。8.拿出注册码的每一位字符减去30,然后得出的结果和9对比,这里就可以证明,注册码必须是0-9的数字,不能含有英文和特殊字符。9.算法分析看下面的例子例子:1=3131-30=1 ebx0+0*4=0 eax+eax*40+0=0 add eax,eax1+0=1add eax,ebx 2=3232-30=24*eax+eax 4*1+1=55+5=A A+2=C 3=3333-30=34*C+C=3C3C+3C=7878+3=7B 4=3434-30=44*7B+7B=267267+267=4CE4CE+4=4D2。。。最后结果等于 075BCD15 00764E8D|.3BC6          cmp eax,esi                              ;eax为注册码计算出来的结果 esi是用户名计算出来的结果00764E8F|.75 19         jnz short wma-conv.00764EAA            ;跳了就over
Esi=075BCD15   eax=57909A49很明显了,这两个得出的结果必须是要相等的,那这里我们怎么办呢???其实我思考这个问题想了我差不多有一小时,究竟是怎么相等的呢?自己不断的举例子,比如用户名为“1” 我可以经过自己的计算得出一个结果,因为举例子,所以肯定要简单的,就1+1=2吧然后对应的注册码举个例子为3吧算法是3-1=2 这样就能判断出是有关系了。卧槽,这样不就是有两边都有一个“1”吗?是不是用户名经过某种转换得出注册码,这样才能相等啊。就在自己百思不得求解的时候,我把 075BCD15 转换为10进制惊喜的得出:123456789 这不就是我刚才输入的假码吗。所以这里已经很明显了,注册码那里的算法,我想高手应该是能看得出只不过转换了进制而已。。。。。 所以得出注册码就是用户名计算出来的一个16进制数据,即57909A49 转换10进制后就是我们真正的注册码!! 用户名:Sendige最后的注册码为:1469094473


不过这里有个小问题,希望能有大神帮我解决下。软件确实是注册成功了,但是注册表写不进相关的注册信息,所以打开软件后还是显示为未注册版本,但是,当我按添加按钮添加一个音乐进去后,点击开始转换,他还是提示我注册,但是我关闭那个注册的窗口,软件又继续检测我刚才输入的用户名和注册码,当然肯定是注册成功的。

软件开始检测注册信息代码段00775108   .53            push ebx                                 ;未注册
00775109   .8BD8          mov ebx,eax
0077510B   .C705 8C2A7900>mov dword ptr ds:,0x51D05E6
00775115   .BA 3C517700   mov edx,wma-conv.0077513C                ;UNICODE "蒲公英WMA/MP3格式转换器 - 未注册"
0077511A   .A1 802A7900   mov eax,dword ptr ds:
0077511F   .E8 8020D6FF   call wma-conv.004D71A4
00775124   .8BC3          mov eax,ebx
00775126   .E8 A5E5FFFF   call wma-conv.007736D0                     验证注册码是否正确
0077512B   .5B            pop ebx                                  ;wma-conv.0077512B
0077512C   .C3            retn
007736D0/$55            push ebp
007736D1|.8BEC          mov ebp,esp
007736D3|.33C9          xor ecx,ecx
007736D5|.51            push ecx
007736D6|.51            push ecx
007736D7|.51            push ecx
007736D8|.51            push ecx
007736D9|.51            push ecx
007736DA|.51            push ecx
007736DB|.53            push ebx
007736DC|.56            push esi                                 ;wma-conv.005004C4
007736DD|.57            push edi
007736DE|.8BF0          mov esi,eax
007736E0|.33C0          xor eax,eax
007736E2|.55            push ebp
007736E3|.68 66387700   push wma-conv.00773866
007736E8|.64:FF30       push dword ptr fs:
007736EB|.64:8920       mov dword ptr fs:,esp
007736EE|.B2 01         mov dl,0x1
007736F0|.A1 B0FC4400   mov eax,dword ptr ds:
007736F5|.E8 12E7CDFF   call wma-conv.00451E0C
007736FA|.8BF8          mov edi,eax
007736FC|.BA 01000080   mov edx,0x80000001
00773701|.8BC7          mov eax,edi
00773703|.E8 ECE7CDFF   call wma-conv.00451EF4
00773708|.33C9          xor ecx,ecx
0077370A|.BA 80387700   mov edx,wma-conv.00773880                ;\Software\Microsoft\Windows\CurrentVersion\Explorer\Superbgestive
0077370F|.8BC7          mov eax,edi
00773711|.E8 26E9CDFF   call wma-conv.0045203C
00773716|.84C0          test al,al
00773718|.0F84 06010000 je wma-conv.00773824
0077371E|.8D45 F8       lea eax,
00773721|.33D2          xor edx,edx
00773723|.E8 0C44C9FF   call wma-conv.00407B34
00773728|.8D4D FC       lea ecx,
0077372B|.BA 10397700   mov edx,wma-conv.00773910                ;FN ame
00773730|.8BC7          mov eax,edi
00773732|.E8 35F3CDFF   call wma-conv.00452A6C
00773737|.8B45 FC       mov eax,                        ;wma-conv.008D540A
0077373A|.85C0          test eax,eax
0077373C|.74 16         je short wma-conv.00773754
0077373E|.8BD0          mov edx,eax
00773740|.83EA 0A       sub edx,0xA
00773743|.66:833A 02    cmp word ptr ds:,0x2
00773747|.74 0B         je short wma-conv.00773754
00773749|.8D45 FC       lea eax,
0077374C|.8B55 FC       mov edx,                        ;wma-conv.008D540A
0077374F|.E8 4C35C9FF   call wma-conv.00406CA0
00773754|>85C0          test eax,eax
00773756|.74 05         je short wma-conv.0077375D
00773758|.83E8 04       sub eax,0x4
0077375B|.8B00          mov eax,dword ptr ds:               ;wma-conv.00765328
0077375D|>8BD8          mov ebx,eax
0077375F|.85DB          test ebx,ebx
00773761|.7E 42         jle short wma-conv.007737A5
00773763|.C745 F4 01000>mov ,0x1
0077376A|>8D45 EC       /lea eax,
0077376D|.50            |push eax
0077376E|.B9 01000000   |mov ecx,0x1
00773773|.8B55 F4       |mov edx,
00773776|.8B45 FC       |mov eax,                     ;wma-conv.008D540A
00773779|.E8 424BC9FF   |call wma-conv.004082C0
0077377E|.8B45 EC       |mov eax,
00773781|.E8 E643C9FF   |call wma-conv.00407B6C
00773786|.0FB710      |movzx edx,word ptr ds:
00773789|.83EA 05       |sub edx,0x5
0077378C|.8D45 F0       |lea eax,
0077378F|.E8 B844C9FF   |call wma-conv.00407C4C
00773794|.8B55 F0       |mov edx,                     ;wma-conv.008B101B
00773797|.8D45 F8       |lea eax,
0077379A|.E8 5547C9FF   |call wma-conv.00407EF4
0077379F|.FF45 F4       |inc
007737A2|.4B            |dec ebx
007737A3|.^ 75 C5         \jnz short wma-conv.0077376A
007737A5|>8B55 F8       mov edx,
007737A8|.8B86 0C060000 mov eax,dword ptr ds:
007737AE|.E8 F139D6FF   call wma-conv.004D71A4
007737B3|.BA 2C397700   mov edx,wma-conv.0077392C                ;FP ass
007737B8|.8BC7          mov eax,edi
007737BA|.E8 2DF5CDFF   call wma-conv.00452CEC
007737BF|.35 0AB30000   xor eax,0xB30A
007737C4|.8D55 E8       lea edx,
007737C7|.E8 6C1ECAFF   call wma-conv.00415638
007737CC|.8B55 E8       mov edx,
007737CF|.8B86 10060000 mov eax,dword ptr ds:
007737D5|.E8 CA39D6FF   call wma-conv.004D71A4
007737DA|.8BC7          mov eax,edi
007737DC|.E8 1320C9FF   call wma-conv.004057F4
007737E1|.8BC6          mov eax,esi                              ;wma-conv.005004C4
007737E3|.E8 54010000   call wma-conv.0077393C                  验证注册信息
007737E8|.84C0          test al,al
007737EA|.74 1C         je short wma-conv.00773808
007737EC|.33D2          xor edx,edx
007737EE|.8B86 0C060000 mov eax,dword ptr ds:
007737F4|.E8 AB39D6FF   call wma-conv.004D71A4
007737F9|.33D2          xor edx,edx
007737FB|.8B86 10060000 mov eax,dword ptr ds:
00773801|.E8 9E39D6FF   call wma-conv.004D71A4
00773806|.EB 36         jmp short wma-conv.0077383E
00773808|>33D2          xor edx,edx
0077380A|.8B86 0C060000 mov eax,dword ptr ds:
00773810|.E8 8F39D6FF   call wma-conv.004D71A4
00773815|.33D2          xor edx,edx
00773817|.8B86 10060000 mov eax,dword ptr ds:
0077381D|.E8 8239D6FF   call wma-conv.004D71A4
00773822|.EB 1A         jmp short wma-conv.0077383E
00773824|>33D2          xor edx,edx
00773826|.8B86 0C060000 mov eax,dword ptr ds:
0077382C|.E8 7339D6FF   call wma-conv.004D71A4
00773831|.33D2          xor edx,edx
00773833|.8B86 10060000 mov eax,dword ptr ds:
00773839|.E8 6639D6FF   call wma-conv.004D71A4
0077383E|>33C0          xor eax,eax
00773840|.5A            pop edx                                  ;wma-conv.0077512B
00773841|.59            pop ecx                                  ;wma-conv.0077512B
00773842|.59            pop ecx                                  ;wma-conv.0077512B
00773843|.64:8910       mov dword ptr fs:,edx
00773846|.68 6D387700   push wma-conv.0077386D
0077384B|>8D45 E8       lea eax,
0077384E|.BA 03000000   mov edx,0x3
00773853|.E8 8042C9FF   call wma-conv.00407AD8
00773858|.8D45 F8       lea eax,
0077385B|.BA 02000000   mov edx,0x2
00773860|.E8 7342C9FF   call wma-conv.00407AD8
00773865\.C3            retn
为了保障该软件作者的合法权益,注册机就不写了,想写的话也是很简单的,此文仅供研究,请勿用于非法用途,请支持正版!!!本文如有失误,欢迎各位看官指正!!谢谢!

leroy特洛伊 发表于 2016-7-20 13:43

不错我现在还在爆破追码阶段所以很多还是看不太懂学习了

LoongKing 发表于 2016-7-20 13:46

汇编是基础{:17_1068:}

KaQqi 发表于 2016-7-20 14:01

楼主您既然用的是call算法分析,又没有改动任何代码,软件理论上不会出现您所提出的问题啊。。。
然后,麻烦楼主把算法call当时6个寄存器的值发一下,谢谢。。

触摸天空 发表于 2016-7-20 14:14


这个好像不错!长姿势

q3125418 发表于 2016-7-20 15:17

说明有BUG 联系作者吧

Sendige 发表于 2016-7-20 15:48

cqr2287 发表于 2016-7-20 14:01
楼主您既然用的是call算法分析,又没有改动任何代码,软件理论上不会出现您所提出的问题啊。。。
然后,麻 ...

你试下用我的用户名和注册码测试下能不能注册成功,我在xp测试也是这样,我也不知道什么原因,我找到检查是否注册正确那里看过了也是没问题的 确实是注册了上去或者你可以根据我的文章自己研究下,谢谢你的反馈

KaQqi 发表于 2016-7-20 16:44

Sendige 发表于 2016-7-20 15:48
你试下用我的用户名和注册码测试下能不能注册成功,我在xp测试也是这样,我也不知道什么原因,我找到检查 ...

既然能追出算法,软件应该利用这一信息决定某些跳转该不该跳。而你那输入了却不能用,应该是软件的bug。我把这软件爆破了,也有同样的问题。。我又追码了一下,还是不可以。。。。

zhshdaan168 发表于 2016-7-21 16:42

好东西,学习一下

朱朱你堕落了 发表于 2016-8-30 18:43

很不错,学习了。
页: [1]
查看完整版本: 某音频格式转换器算法分析