cyane 发表于 2011-2-20 22:31:15

宝宝取名软件V10注册算法分析

本帖最后由 cyane 于 2011-2-22 21:06 编辑

OD载入程序,F9运行,注册码:1234567890,点击注册,提示注册码无效,下断MessageBoxA函数,可回溯到验证函数的入口。
00405F21/.55            push    ebp
00405F22|.8BEC          mov   ebp, esp
00405F24|.81EC 0C000000 sub   esp, 0C
00405F2A|.6A FF         push    -1
00405F2C|.6A 08         push    8
00405F2E|.68 740C0116   push    16010C74
00405F33|.68 6E0C0152   push    52010C6E
00405F38|.E8 16C70100   call    00422653                         ;获取注册码
.....
00405F71|>837D F8 00    cmp   dword ptr , 0
00405F75|.0F84 8E000000 je      00406009                         ;注册码不能为空
00405F7B|.C745 FC 00000>mov   dword ptr , 0
00405F82|.6A 00         push    0
00405F84|.8D45 FC       lea   eax, dword ptr
00405F87|.50            push    eax
00405F88|.B8 35FC5200   mov   eax, 0052FC35                  ;ASCII "Z2dRqSh2JZr2tRE3LZb1R3lRC1W36B"
.....                                                                     ;字符串解码[注册码不能为空]
0040602C|.6A 00         push    0
0040602E|.8D45 FC       lea   eax, dword ptr
00406031|.50            push    eax
00406032|.B8 54FC5200   mov   eax, 0052FC54                  ;ASCII "10cQxVf0RZdUrR53jBK1q3GZjTQ3uR31b3UZ81A3SZuTDbcRcT"
.....                                                                     ;字符串解码[注册失败,请联系客服]
004060CD|.83C4 18       add   esp, 18
004060D0|.E8 04000000   call    004060D9                             ;判断注册函数,F7跟进
004060D5|>8BE5          mov   esp, ebp
004060D7|.5D            pop   ebp
004060D8\.C3            retn
//////////////////////////////////////////////////////////////////////
004060D9   $55            push    ebp
004060DA   .8BEC          mov   ebp, esp
004060DC   .81EC 28000000 sub   esp, 28
004060E2   .C745 FC 00000>mov   dword ptr , 0
004060E9   .C745 F8 00000>mov   dword ptr , 0
004060F0   .C745 F4 00000>mov   dword ptr , 0
004060F7   .C745 F0 00000>mov   dword ptr , 0
004060FE   .6A FF         push    -1
00406100   .6A 08         push    8
00406102   .68 730C0116   push    16010C73
00406107   .68 6E0C0152   push    52010C6E
0040610C   .E8 42C50100   call    00422653                         ;获取机器码
00406111   .83C4 10       add   esp, 10
00406114   .8945 EC       mov   dword ptr , eax
00406117   .6A FF         push    -1
00406119   .6A 08         push    8
0040611B   .68 740C0116   push    16010C74
00406120   .68 6E0C0152   push    52010C6E
00406125   .E8 29C50100   call    00422653                         ;获取注册码
0040612A   .83C4 10       add   esp, 10
0040612D   .8945 E8       mov   dword ptr , eax
00406130   .68 87FC5200   push    0052FC87                         ;ASCII "&caozuo=1"
00406135   .FF75 E8       push    dword ptr
00406138   .68 91FC5200   push    0052FC91                         ;ASCII "&code="
0040613D   .FF75 EC       push    dword ptr
00406140   .68 98FC5200   push    0052FC98                         ;ASCII "?name="
00406145   .FF35 D02F6C00 push    dword ptr
.....
0040619E   .E8 AAC40100   call    0042264D                         ;网络验证
//验证地址http://xxx.com/more_txt/reg.php?name=[机器码]&code=1234567890&caozuo=1
//返回数据:text[对不起,您输入的注册码无效!]int
.....
004062CA   .68 17E94D00   push    004DE917
004062CF   .FF75 F4       push    dword ptr                
004062D2   .E8 DCAFFFFF   call    004012B3                         ;判断数据
004062D7   .83C4 08       add   esp, 8
004062DA   .83F8 00       cmp   eax, 0
004062DD   .0F84 20000000 je      00406303                             ;必须跳转
.....
0040637F   .0F84 1A020000 je      0040659F                             ;不能跳转
//上面2个跳转是根据网络验证返回的数据进行判断,所以这里必须强制操作
.....
004063A6   .50            push    eax
004063A7   .B8 ADFC5200   mov   eax, 0052FCAD                  ;ASCII "7LbJ8JfNyLkApLdIbM"
004063AC   .8945 E4       mov   dword ptr , eax             ;字符串解码[\baby.reg]
.....
00406494   >E8 A4040000   call    0040693D                             ;F7跟进
//////////////////////////////////////////////////////////////////////
0040693D/$55            push    ebp
0040693E|.8BEC          mov   ebp, esp
00406940|.81EC 10000000 sub   esp, 10
00406946|.E8 05AAFFFF   call    00401350                             ;F7跟进
0040694B|.8945 F8       mov   dword ptr , eax
//////////////////////////////////////////////////////////////////////
00401476   .E8 08060000   call    00401A83                         ;计算注册码函数,F7跟进
//////////////////////////////////////////////////////////////////////
00401A83/$55            push    ebp
00401A84|.8BEC          mov   ebp, esp
00401A86|.81EC 38000000 sub   esp, 38
00401A8C|.C745 FC 00000>mov   dword ptr , 0
00401A93|.C745 F8 00000>mov   dword ptr , 0
00401A9A|.E8 12030000   call    00401DB1                         ;获取硬盘型号函数
00401A9F|.8945 F4       mov   dword ptr , eax
00401AA2|.E8 DE0B0000   call    00402685
00401AA7|.8945 F0       mov   dword ptr , eax
00401AAA|.FF75 F0       push    dword ptr
00401AAD|.FF75 F4       push    dword ptr
00401AB0|.B9 02000000   mov   ecx, 2
00401AB5|.E8 9DF7FFFF   call    00401257                         ;temp1=硬盘[修订版本后2位+硬盘型号+序列号后4位]
.....
00401B23|.E8 1F0B0200   call    00422647                             ;temp2=获取磁盘信息并进行部分运算,省略
.....                                                                     ;有兴趣的可以自己跟
00401B55|.B8 9DE94D00   mov   eax, 004DE99D                  ;ASCII "RKuLoLsI6AoLsJ8LeNcJeL9N"
00401B5A|.8945 D8       mov   dword ptr , eax             ;temp3=字符串解码
00401B5D|.8D45 D8       lea   eax, dword ptr
.....                                                                     ;temp=temp1+temp2+temp3
00401C2E|.E8 1A0A0200   call    0042264D                         ;MD5(temp)函数,跟进
00401C33|.83C4 10       add   esp, 10                             ;我的temp为K0Maxtor4D040H2LZPE1347721313Must succeed
.....
004A73D6   .E8 95000000   call    004A7470                         ;MD5(temp),跟进
//////////////////////////////////////////////////////////////////////
004A7470/$6A FF         push    -1
004A7472|.68 388E4D00   push    004D8E38                         ;SE 处理程序安装
004A7477|.64:A1 0000000>mov   eax, dword ptr fs:
004A747D|.50            push    eax
004A747E|.64:8925 00000>mov   dword ptr fs:, esp
004A7485|.83EC 5C       sub   esp, 5C
004A7488|.8D4C24 00   lea   ecx, dword ptr
004A748C|.E8 4F000000   call    004A74E0                         ;MD5Init
004A7491|.8B4424 70   mov   eax, dword ptr
004A7495|.8B4C24 6C   mov   ecx, dword ptr
004A7499|.50            push    eax
004A749A|.51            push    ecx
004A749B|.8D4C24 08   lea   ecx, dword ptr
004A749F|.C74424 6C 000>mov   dword ptr , 0
004A74A7|.E8 64010000   call    004A7610                         ;MD5Update
004A74AC|.8B5424 74   mov   edx, dword ptr
004A74B0|.8D4C24 00   lea   ecx, dword ptr
004A74B4|.52            push    edx
004A74B5|.E8 66000000   call    004A7520                         ;MD5Final
004A74BA|.8B4C24 5C   mov   ecx, dword ptr
004A74BE|.64:890D 00000>mov   dword ptr fs:, ecx
004A74C5|.83C4 68       add   esp, 68
004A74C8\.C3            retn
//通过MD5Init函数可以看到A/B/C/D为标准的MD5数据。
//MD5算法部分说明可以在论坛中搜索到,所以此处省略了。
//这里是对得到的硬件码部分进行MD5,得到的32位数据就是软件的机器码了。
//我的机器得到的数据为f474d14e99a8ca601022afbe4d4ddafb
//然后到了下面得函数
00401C68|> /41            /inc   ecx
00401C69|. |51            |push    ecx
00401C6A|. |53            |push    ebx
00401C6B|. |890B          |mov   dword ptr , ecx
00401C6D|. |83F9 08       |cmp   ecx, 8
00401C70|. |0F8F 01010000 |jg      00401D77
00401C76|. |68 01030080   |push    80000301
00401C7B|. |6A 00         |push    0
00401C7D|. |FF75 F8       |push    dword ptr
00401C80|. |68 01000000   |push    1
00401C85|. |BB 70374200   |mov   ebx, 00423770
00401C8A|. |E8 B8090200   |call    00422647
00401C8F|. |83C4 10       |add   esp, 10
00401C92|. |8945 F4       |mov   dword ptr , eax
00401C95|. |FF75 F4       |push    dword ptr
00401C98|. |FF75 FC       |push    dword ptr
00401C9B|. |B9 02000000   |mov   ecx, 2
00401CA0|. |E8 B2F5FFFF   |call    00401257
00401CA5|. |83C4 08       |add   esp, 8
00401CA8|. |8945 F0       |mov   dword ptr , eax
00401CAB|. |8B5D F4       |mov   ebx, dword ptr
00401CAE|. |85DB          |test    ebx, ebx
00401CB0|. |74 09         |je      short 00401CBB
00401CB2|. |53            |push    ebx
00401CB3|. |E8 83090200   |call    0042263B
00401CB8|. |83C4 04       |add   esp, 4
00401CBB|> |68 04000080   |push    80000004
00401CC0|. |6A 00         |push    0
00401CC2|. |8B45 F0       |mov   eax, dword ptr
00401CC5|. |85C0          |test    eax, eax
00401CC7|. |75 05         |jnz   short 00401CCE
00401CC9|. |B8 17E94D00   |mov   eax, 004DE917
00401CCE|> |50            |push    eax
00401CCF|. |68 01000000   |push    1
00401CD4|. |BB C0354200   |mov   ebx, 004235C0
00401CD9|. |E8 69090200   |call    00422647
00401CDE|. |83C4 10       |add   esp, 10
00401CE1|. |8945 EC       |mov   dword ptr , eax
00401CE4|. |8B5D F0       |mov   ebx, dword ptr
00401CE7|. |85DB          |test    ebx, ebx
00401CE9|. |74 09         |je      short 00401CF4
00401CEB|. |53            |push    ebx
00401CEC|. |E8 4A090200   |call    0042263B
00401CF1|. |83C4 04       |add   esp, 4
00401CF4|> |68 05000080   |push    80000005
00401CF9|. |6A 00         |push    0
00401CFB|. |8B45 EC       |mov   eax, dword ptr
00401CFE|. |85C0          |test    eax, eax
00401D00|. |75 05         |jnz   short 00401D07
00401D02|. |B8 46E94D00   |mov   eax, 004DE946
00401D07|> |50            |push    eax
00401D08|. |68 01000000   |push    1
00401D0D|. |B8 09000000   |mov   eax, 9
00401D12|. |BB C0734A00   |mov   ebx, 004A73C0
00401D17|. |E8 31090200   |call    0042264D                        ;分组计算注册码
00401D1C|. |83C4 10       |add   esp, 10
00401D1F|. |8945 E8       |mov   dword ptr , eax
00401D22|. |8B5D EC       |mov   ebx, dword ptr
00401D25|. |85DB          |test    ebx, ebx
00401D27|. |74 09         |je      short 00401D32
00401D29|. |53            |push    ebx
00401D2A|. |E8 0C090200   |call    0042263B
00401D2F|. |83C4 04       |add   esp, 4
00401D32|> |FF75 E8       |push    dword ptr
00401D35|. |FF75 FC       |push    dword ptr
00401D38|. |B9 02000000   |mov   ecx, 2
00401D3D|. |E8 15F5FFFF   |call    00401257
00401D42|. |83C4 08       |add   esp, 8
00401D45|. |8945 E4       |mov   dword ptr , eax
00401D48|. |8B5D E8       |mov   ebx, dword ptr
00401D4B|. |85DB          |test    ebx, ebx
00401D4D|. |74 09         |je      short 00401D58
00401D4F|. |53            |push    ebx
00401D50|. |E8 E6080200   |call    0042263B
00401D55|. |83C4 04       |add   esp, 4
00401D58|> |8B45 E4       |mov   eax, dword ptr
00401D5B|. |50            |push    eax
00401D5C|. |8B5D FC       |mov   ebx, dword ptr
00401D5F|. |85DB          |test    ebx, ebx
00401D61|. |74 09         |je      short 00401D6C
00401D63|. |53            |push    ebx
00401D64|. |E8 D2080200   |call    0042263B
00401D69|. |83C4 04       |add   esp, 4
00401D6C|> |58            |pop   eax
00401D6D|. |8945 FC       |mov   dword ptr , eax
00401D70|. |5B            |pop   ebx
00401D71|. |59            |pop   ecx
00401D72|.^\E9 F1FEFFFF   \jmp   00401C68
//上面函数段可理解伪C       
serial=temp=temp1+temp2+temp3                       
for(i=1;i<=8;i++)
{
    temp=md5(serial)+i;
    strcat(serial, temp);
}
//这里可以知道注册码是288位。
.....
00401481   .50            push    eax                                     ;真注册码
00401482   .FF75 FC       push    dword ptr                      ;假注册码
00401485   .E8 29FEFFFF   call    004012B3                       
//这里如果验证成功,会在软件目录下建立baby.reg的注册文件,并向server.ini文件写入注册码,以下分析就省略了。
//baby.reg内的注册码就是我们得到的288位注册码了。通过输入注册码进行注册,首先要通过网络验证,这里有些麻烦。
//软件一开始运行的时候就会扫描目录下的baby.reg文件,并且明码比较,所以是很容易就找到注册码的。
//这里给出的伪C代码可通过软件提供的机器码直接算出注册码。
//例如本机机器码为f474d14e99a8ca601022afbe4d4ddafb
注册码算法:
n1=MD5(f474d14e99a8ca601022afbe4d4ddafb1)=3a2b5e4ac44dbe8978ead18383aa0e3f
n2=MD5(f474d14e99a8ca601022afbe4d4ddafb3a2b5e4ac44dbe8978ead18383aa0e3f2).....
以此类推循环8次得到的288位字符串就是注册码了。

316325 发表于 2011-2-22 00:30:23

厉害!支持一个。

cjteam 发表于 2011-2-23 13:25:25

不错啊,分析的很好

Nisy 发表于 2011-2-23 13:34:18

不错 ~ 网络验证只是纸老虎

cyane 发表于 2011-2-23 17:16:14

我觉得这软件很好,可以学到很多知识

shieep 发表于 2011-2-23 20:07:54

不错,V11注册算法未变

speedboy 发表于 2011-2-24 09:23:59

请得很清楚

kk378 发表于 2011-2-24 19:41:41

liuqiangni 发表于 2011-2-24 23:21:36

哎呀,我没看你的算法,今天分析了半天,总算搞定了

月之精灵 发表于 2011-2-24 23:46:06

哎呀,我没看你的算法,今天分析了半天,总算搞定了
liuqiangni 发表于 2011-2-24 23:21 https://www.chinapyg.com/images/common/back.gif


    哈哈,恭喜你,哈哈
页: [1] 2 3
查看完整版本: 宝宝取名软件V10注册算法分析