首页
社区
课程
招聘
[旧帖] [邀请码已发][原创]解密FINALDATA2.0,补上序列号验证部分的算法分析和注册机源代码 0.00雪花
发表于: 2010-2-8 14:27 2486

[旧帖] [邀请码已发][原创]解密FINALDATA2.0,补上序列号验证部分的算法分析和注册机源代码 0.00雪花

2010-2-8 14:27
2486
【文章标题】: 【原创】解密FINALDATA2.0(申请邀请码)
【文章作者】: wuzhidao
【作者邮箱】: 946897109@qq.com
【作者主页】: 无
【作者QQ号】: 946897109
【软件名称】: FINALDATA2.0
【软件大小】: 1.33M
【下载地址】: 自己搜索下载
【加壳方式】: ASPack 2.12 -> Alexey Solodovnikov
【保护方式】: 加壳
【编写语言】: Microsoft Visual C++ 5.0
【使用工具】: OD PEid Restorator2007
【操作平台】: XP SP3
【软件介绍】: 好用的数据恢复工具
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教
------------------------------------------------------------------------------

【详细过程】
    这个FINALDATA2.0是番茄花园的PE中的,偶然打开发现竟然要输入序列号,就拿它来解密试试。
    进入正题。用PEid检查是 UPX 0.89.6 - 1.02 / 1.05 - 1.24 -> Markus & Laszlo [RAR SFX],注
意到后面的[RAR SFX],把它从光盘中复制出来后改后缀为RAR,解压得到三个文件:FINALDATA.EXE
INFDRV.DLL INFTHK.DLL。再用PEid检查解压出来的FINALDATA.EXE,为ASPack 2.12 -> Alexey
Solodovnikov。用AspackDie脱壳,脱壳过程很顺利。先打开FINALDATA2.0试用,一开始就提示要输入注
册码。随便输入名称和序列号后提示无效的序列号,关闭FINALDATA2.0。用OD载入脱壳后的文件,搜索“
无效的序列号”无果。Ctrl + N 找到USER32.GetDlgItemTextA  USER32.GetWindowTextA。其中
getDlgItemTextA有2处,GetWindowTextA有15处。那先下断GetDlgItemTextA,按F9运行,输入名称
和序列号没有断到。那再下断GetWindowTextA,按F9运行,未出现提示输入序列号就被断下来,我们按F8
再按F9直到出现提示输入序列号的对话框,输入名称和序列号确定后断下来,此时在006229DE。删除所有断
点,重新下断在006229DE,下次从这里开始。经跟踪发现程序会重复三次调用006229DE这里来获取我们
输入的信息。前面两次我们按F8再按F9跳过,不跟踪。第三次我们按F8粗跟踪。
  006229D9  |.  50            push    eax                                                                      ; |Buffer
  006229DA  |.  8B55 FC       mov     edx, dword ptr [ebp-4]                                     ; |
  006229DD  |.  52            push    edx                                                                       ; |hWnd
  006229DE  |.  FF15 1CDB6A00 call    dword ptr [<&USER32.GetWindowTextA>]    ; GetWindowTextA
  006229E4  |.  6A FF         push    -1
  006229E6  |.  8B4D 10       mov     ecx, dword ptr [ebp+10]
  006229E9  |.  E8 6597FEFF   call    0060C153                                                         ;  这个调用过后注意到EAX变成我们输入的序列号
006229EE  |.  EB 12         jmp     short 00622A02
  006229F0  |>  8B4D 10       mov     ecx, dword ptr [ebp+10]
  006229F3  |.  E8 62C90200   call    0064F35A
  006229F8  |.  50            push    eax
  006229F9  |.  8B45 FC       mov     eax, dword ptr [ebp-4]
  006229FC  |.  50            push    eax
  006229FD  |.  E8 C19BFFFF   call    0061C5C3
  00622A02  |>  8BE5          mov     esp, ebp
  00622A04  |.  5D            pop     ebp
  00622A05  \.  C2 0C00       retn    0C
  这里不是重点,我们一直按F8跟踪到
  0054ACBB  /.  55            push    ebp
  0054ACBC  |.  8BEC          mov     ebp, esp
  0054ACBE  |.  83EC 08       sub     esp, 8
  0054ACC1  |.  894D F8       mov     dword ptr [ebp-8], ecx
  0054ACC4  |.  E8 77F01000   call    00659D40
  0054ACC9  |.  8945 FC       mov     dword ptr [ebp-4], eax
  0054ACCC  |.  6A 01         push    1
  0054ACCE  |.  8B4D F8       mov     ecx, dword ptr [ebp-8]
  0054ACD1  |.  E8 75CE0B00   call    00607B4B
  0054ACD6  |.  68 48369300   push    00933648
  0054ACDB  |.  8B45 F8       mov     eax, dword ptr [ebp-8]
  0054ACDE  |.  83C0 64       add     eax, 64
  0054ACE1  |.  50            push    eax
  0054ACE2  |.  E8 D1481000   call    0064F5B8
  0054ACE7  |.  25 FF000000   and     eax, 0FF
  0054ACEC  |.  85C0          test    eax, eax
  0054ACEE  |.  75 1A         jnz     short 0054AD0A                         ;  这里若输入序列号为空则跳转
  0054ACF0  |.  68 4C369300   push    0093364C
  0054ACF5  |.  8B4D F8       mov     ecx, dword ptr [ebp-8]
  0054ACF8  |.  83C1 68       add     ecx, 68
  0054ACFB  |.  51            push    ecx
  0054ACFC  |.  E8 B7481000   call    0064F5B8
  0054AD01  |.  25 FF000000   and     eax, 0FF
  0054AD06  |.  85C0          test    eax, eax
  0054AD08  |.  74 13         je      short 0054AD1D
  0054AD0A  |>  6A FF         push    -1
  0054AD0C  |.  6A 30         push    30
  0054AD0E  |.  68 08C80000   push    0C808                                ;  0C808的十进制是51208,对应EXE的资源中字符串是您应该输入您的名称和序列号。
  0054AD13  |.  E8 B18C0D00   call    006239C9
  0054AD18  |.  E9 94000000   jmp     0054ADB1
  0054AD1D  |>  6A 1C         push    1C
  0054AD1F  |.  8B4D F8       mov     ecx, dword ptr [ebp-8]
  0054AD22  |.  83C1 68       add     ecx, 68
  0054AD25  |.  E8 EE120C00   call    0060C018
  0054AD2A  |.  50            push    eax
  0054AD2B  |.  E8 605AFCFF   call    00510790                             ;  关键call F7跟入
  0054AD30  |.  83C4 04       add     esp, 4
  0054AD33  |.  85C0          test    eax, eax
  0054AD35  |.  74 5F         je      short 0054AD96                         ;  关键跳转
  0054AD37  |.  8B55 F8       mov     edx, dword ptr [ebp-8]
  0054AD3A  |.  C742 5C 01000>mov     dword ptr [edx+5C], 1
  0054AD41  |.  8B4D F8       mov     ecx, dword ptr [ebp-8]
  0054AD44  |.  83C1 64       add     ecx, 64
  0054AD47  |.  E8 0E461000   call    0064F35A
  0054AD4C  |.  50            push    eax
  0054AD4D  |.  68 DCAB7100   push    0071ABDC                         ;  ASCII "Name"
  0054AD52  |.  E8 50020000   call    0054AFA7
  0054AD57  |.  83C4 08       add     esp, 8
  0054AD5A  |.  8B4D F8       mov     ecx, dword ptr [ebp-8]
  0054AD5D  |.  83C1 60       add     ecx, 60
  0054AD60  |.  E8 F5451000   call    0064F35A
  0054AD65  |.  50            push    eax
  0054AD66  |.  68 E4AB7100   push    0071ABE4                            ;  ASCII "Company"
  0054AD6B  |.  E8 37020000   call    0054AFA7
  0054AD70  |.  83C4 08       add     esp, 8
  0054AD73  |.  8B4D F8       mov     ecx, dword ptr [ebp-8]
  0054AD76  |.  83C1 68       add     ecx, 68
  0054AD79  |.  E8 DC451000   call    0064F35A
  0054AD7E  |.  50            push    eax
  0054AD7F  |.  68 ECAB7100   push    0071ABEC                            ;  ASCII "Serial"
  0054AD84  |.  E8 1E020000   call    0054AFA7
  0054AD89  |.  83C4 08       add     esp, 8
  0054AD8C  |.  8B4D F8       mov     ecx, dword ptr [ebp-8]
  0054AD8F  |.  E8 6E750B00   call    00602302
  0054AD94  |.  EB 0E         jmp     short 0054ADA4
  0054AD96  |>  6A FF         push    -1
  0054AD98  |.  6A 30         push    30
  0054AD9A  |.  68 09C80000   push    0C809                                  ;  0C809的十进制是51209,对应EXE的资源中字符串是无效的序列号。
  0054AD9F  |.  E8 258C0D00   call    006239C9
  0054ADA4  |>  6A FF         push    -1
  0054ADA6  |.  8B4D F8       mov     ecx, dword ptr [ebp-8]
  0054ADA9  |.  83C1 68       add     ecx, 68
  0054ADAC  |.  E8 A2130C00   call    0060C153
  0054ADB1  |>  8BE5          mov     esp, ebp
  0054ADB3  |.  5D            pop     ebp
  0054ADB4  \.  C3            retn
  
  注意到OD给出的注释ASCII "Name"    ASCII "Company"    ASCII "Serial",这里应该
是程序判断序列号正确就把公司、名称和序列号保存的地方。还有是0C809H和0C808H这两
个对应的意义是在这次分析过程中做了爆破(不完全爆破,主要的功能不能用),发现这个软
件已经被汉化过,所以拿出Restorator2007打开EXE在字符串里找到51208(0C808H)对
应“您应该输入您的名称和序列号。”51209(0C809H)对应“无效的序列号。”。
  下面是关键call F7跟入
00510790  /$  55            push    ebp
  00510791  |.  8BEC          mov     ebp, esp
  00510793  |.  83EC 50       sub     esp, 50
  00510796  |.  6A 03         push    3
  00510798  |.  8B45 08       mov     eax, dword ptr [ebp+8]
  0051079B  |.  50            push    eax
  0051079C  |.  8D4D C8       lea     ecx, dword ptr [ebp-38]
  0051079F  |.  51            push    ecx
  005107A0  |.  E8 8B200A00   call    005B2830
  005107A5  |.  83C4 0C       add     esp, 0C
  005107A8  |.  C645 CB 00    mov     byte ptr [ebp-35], 0
  005107AC  |.  68 34867100   push    00718634                               ; ASCII "NTC"
  005107B1  |.  8D55 C8       lea     edx, dword ptr [ebp-38]
  005107B4  |.  52            push    edx
  005107B5  |.  E8 C6A00B00   call    005CA880
  005107BA  |.  83C4 08       add     esp, 8
  005107BD  |.  85C0          test    eax, eax                                        ;  前面这段应该是判断输入的注册码的前三位是否NTC
  005107BF  |.  74 07         je      short 005107C8                              ;  跳转就完
005107C1  |.  33C0          xor     eax, eax
  005107C3  |.  E9 D7020000   jmp     00510A9F
  005107C8  |>  8B45 08       mov     eax, dword ptr [ebp+8]
  005107CB  |.  0FBE48 08     movsx   ecx, byte ptr [eax+8]
  005107CF  |.  83F9 2D       cmp     ecx, 2D
  005107D2  |.  75 1B         jnz     short 005107EF                             ;  跳转就完
  005107D4  |.  8B55 08       mov     edx, dword ptr [ebp+8]            ;  后面很长一段应该是判断输入注册码后面的是否正确,此次是爆破就不分析算法。留着以后再分析。
005107D7  |.  0FBE42 0D     movsx   eax, byte ptr [edx+D]
  005107DB  |.  83F8 2D       cmp     eax, 2D
  005107DE  |.  75 0F         jnz     short 005107EF
                  
                   :
                   :
                   :  这里省略了很长一段验证算法,在2楼会详细分析到,具体参见2楼。
                   :
                   :

  00510A94  |.  74 04         je      short 00510A9A
  00510A96  |>  33C0          xor     eax, eax
  00510A98  |.  EB 05         jmp     short 00510A9F
  00510A9A  |>  B8 01000000   mov     eax, 1                       ;  若跳转到这就激活
  00510A9F  |>  8BE5          mov     esp, ebp                        ;  若跳转到这就完
  00510AA1  |.  5D            pop     ebp
   00510AA2  \.  C3            retn
  
    我们把005107C3  |. /E9 D7020000   jmp     00510A9F
    改成  005107C3  |. /E9 D7020000   jmp     00510A9A就爆破成功。
  
  第一次写破文(其实还是第二次解密软件,第一个是爆破【原创】本人原创CRACKME系列 难度由0--9,
看你属于哪一级?(更新CRACKME 7的程序实现,附源码)的Crackeme0),写的有点啰嗦,大家多多包
涵。注册码的算法我会加紧时间再好好分析,到时再发上来。
  
  
  
--------------------------------------------------------------------------------
【经验总结】
  如直接搜索不到字符串,通过查看资源而找到对应的编号(51209),换成十六进制再搜索。
  
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!

                                                       2010年02月08日 14:14:22

[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (16)
雪    币: 351
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
补上序列号验证部分的算法分析
                解密FINALDATA2.0算法分析

00510790  /$  55            push    ebp                              ;  (initial cpu selection)
00510791  |.  8BEC          mov     ebp, esp
00510793  |.  83EC 50       sub     esp, 50
00510796  |.  6A 03         push    3
00510798  |.  8B45 08       mov     eax, dword ptr [ebp+8]
0051079B  |.  50            push    eax
0051079C  |.  8D4D C8       lea     ecx, dword ptr [ebp-38]
0051079F  |.  51            push    ecx
005107A0  |.  E8 8B200A00   call    005B2830
005107A5  |.  83C4 0C       add     esp, 0C
005107A8  |.  C645 CB 00    mov     byte ptr [ebp-35], 0
005107AC  |.  68 34867100   push    00718634                         ;  ntc
005107B1  |.  8D55 C8       lea     edx, dword ptr [ebp-38]
005107B4  |.  52            push    edx
005107B5  |.  E8 C6A00B00   call    005CA880
005107BA  |.  83C4 08       add     esp, 8
005107BD  |.  85C0          test    eax, eax                         ;  前面这段应该是判断输入的注册码的前三位是否NTC
005107BF  |.  74 07         je      short 005107C8                   ;  跳转就完
005107C1  |.  33C0          xor     eax, eax
005107C3  |.  E9 D7020000   jmp     00510A9F
005107C8  |>  8B45 08       mov     eax, dword ptr [ebp+8]           ;  注意EAX
005107CB  |.  0FBE48 08     movsx   ecx, byte ptr [eax+8]
005107CF  |.  83F9 2D       cmp     ecx, 2D                          ;  2D对应的ASCII "-" 判断第9位是否-
005107D2  |.  75 1B         jnz     short 005107EF                   ;  跳转就完
005107D4  |.  8B55 08       mov     edx, dword ptr [ebp+8]           ;  
005107D7  |.  0FBE42 0D     movsx   eax, byte ptr [edx+D]            ;  注意EAX
005107DB  |.  83F8 2D       cmp     eax, 2D                          ;  2D对应的ASCII "-" 判断第14位是否-
005107DE  |.  75 0F         jnz     short 005107EF
005107E0  |.  8B4D 08       mov     ecx, dword ptr [ebp+8]
005107E3  |.  51            push    ecx                              ; /String
005107E4  |.  FF15 90D56A00 call    dword ptr [<&KERNEL32.lstrlenA>] ; \lstrlenA
005107EA  |.  83F8 1A       cmp     eax, 1A                          ;  这两句是比较我们输入的序列号长度是否为26
005107ED  |.  74 07         je      short 005107F6
005107EF  |>  33C0          xor     eax, eax
005107F1  |.  E9 A9020000   jmp     00510A9F
005107F6  |>  C745 E8 03000>mov     dword ptr [ebp-18], 3
005107FD  |.  EB 09         jmp     short 00510808

下面这一段构成一个循环验证4-8位是否为数字
005107FF  |>  8B55 E8       /mov     edx, dword ptr [ebp-18]
00510802  |.  83C2 01       |add     edx, 1
00510805  |.  8955 E8       |mov     dword ptr [ebp-18], edx
00510808  |>  837D E8 08     cmp     dword ptr [ebp-18], 8
0051080C  |.  7D 1F         |jge     short 0051082D
0051080E  |.  8B45 08       |mov     eax, dword ptr [ebp+8]
00510811  |.  0345 E8       |add     eax, dword ptr [ebp-18]
00510814  |.  0FBE08        |movsx   ecx, byte ptr [eax]
00510817  |.  51            |push    ecx
00510818  |.  E8 D3260A00   |call    005B2EF0                        ;  关键 按F7跟进。这里验证是否为数字的算法,后面会分析到
0051081D  |.  83C4 04       |add     esp, 4
00510820  |.  85C0          |test    eax, eax
00510822      75 07         jnz     short 0051082B                   ;  注意 不为零/不等于则跳
00510824  |.  33C0          |xor     eax, eax
00510826  |.  E9 74020000   |jmp     00510A9F
0051082B  |>^ EB D2         \jmp     short 005107FF

0051082D  |>  C745 E8 09000>mov     dword ptr [ebp-18], 9
00510834  |.  EB 09         jmp     short 0051083F

下面这一段构成一个循环验证10-13位是否为数字
00510836  |>  8B55 E8       /mov     edx, dword ptr [ebp-18]
00510839  |.  83C2 01       |add     edx, 1
0051083C  |.  8955 E8       |mov     dword ptr [ebp-18], edx
0051083F  |>  837D E8 0D     cmp     dword ptr [ebp-18], 0D
00510843  |.  7D 1F         |jge     short 00510864
00510845  |.  8B45 08       |mov     eax, dword ptr [ebp+8]
00510848  |.  0345 E8       |add     eax, dword ptr [ebp-18]
0051084B  |.  0FBE08        |movsx   ecx, byte ptr [eax]
0051084E  |.  51            |push    ecx
0051084F  |.  E8 9C260A00   |call    005B2EF0                        ;  关键 按F7跟进 。
00510854  |.  83C4 04       |add     esp, 4
00510857  |.  85C0          |test    eax, eax
00510859  |.  75 07         |jnz     short 00510862
0051085B  |.  33C0          |xor     eax, eax
0051085D  |.  E9 3D020000   |jmp     00510A9F
00510862  |>^ EB D2         \jmp     short 00510836

下面这一段构成一个循环验证余下12位位是否为数字
00510864  |>  C745 E8 0E000>mov     dword ptr [ebp-18], 0E
0051086B  |.  EB 09         jmp     short 00510876
0051086D  |>  8B55 E8       /mov     edx, dword ptr [ebp-18]
00510870  |.  83C2 01       |add     edx, 1
00510873  |.  8955 E8       |mov     dword ptr [ebp-18], edx
00510876  |>  837D E8 1A     cmp     dword ptr [ebp-18], 1A
0051087A  |.  7D 1F         |jge     short 0051089B
0051087C  |.  8B45 08       |mov     eax, dword ptr [ebp+8]
0051087F  |.  0345 E8       |add     eax, dword ptr [ebp-18]
00510882  |.  0FBE08        |movsx   ecx, byte ptr [eax]
00510885  |.  51            |push    ecx
00510886  |.  E8 65260A00   |call    005B2EF0                        ;  关键 按F7跟进 。
0051088B  |.  83C4 04       |add     esp, 4
0051088E  |.  85C0          |test    eax, eax
00510890  |.  75 07         |jnz     short 00510899
00510892  |.  33C0          |xor     eax, eax
00510894  |.  E9 06020000   |jmp     00510A9F
00510899  |>^ EB D2         \jmp     short 0051086D
至此,我们知道序列号是这样的形式:NTC12345-6789-987654321123,即第1-3位是NTC,第4-8位、10-13位和15-26位均是数字,第9和14位是-。
下面是对输入的序列号抽出部分来运算再做判断,分析下面的运算算法前,我们先看看call   005B2EF0 中如何验证是否为数字的。

005B2EF0  /$  55            push    ebp
005B2EF1  |.  8BEC          mov     ebp, esp
005B2EF3  |.  51            push    ecx
005B2EF4  |.  833D E4E87400>cmp     dword ptr [74E8E4], 1            ;  数据窗口中跟随>内存地址 可以看到ds:[0074E8E4]=00000001
005B2EFB      7E 13         jle     short 005B2F10                   ;  <= 则跳。这里一定会跳转的
005B2EFD  |.  6A 04         push    4
005B2EFF  |.  8B45 08       mov     eax, dword ptr [ebp+8]
005B2F02  |.  50            push    eax
005B2F03  |.  E8 A8C30000   call    005BF2B0
005B2F08  |.  83C4 08       add     esp, 8
005B2F0B  |.  8945 FC       mov     dword ptr [ebp-4], eax
005B2F0E  |.  EB 15         jmp     short 005B2F25
005B2F10  |>  8B4D 08       mov     ecx, dword ptr [ebp+8]           ;  (ecx)=序列号中字符的ASCII值
005B2F13  |.  8B15 D8E67400 mov     edx, dword ptr [74E6D8]          ;  数据窗口中跟随>内存地址。下面给出ds:0074E6D8附近的值
005B2F19  |.  33C0          xor     eax, eax
005B2F1B  |.  66:8B044A     mov     ax, word ptr [edx+ecx*2]         ;  (ax)一定要是***4(*号可以是任意数)
005B2F1F  |.  83E0 04       and     eax, 4
005B2F22  |.  8945 FC       mov     dword ptr [ebp-4], eax
005B2F25  |>  8B45 FC       mov     eax, dword ptr [ebp-4]           ;  (eax)若是0则完
005B2F28  |.  8BE5          mov     esp, ebp
005B2F2A  |.  5D            pop     ebp
005B2F2B  \.  C3            retn

ds:0074E6D8附近的值如下:
0074E6D8  E2 E6 74 00 E2 E6 74 00 00 00 20 00 20 00 20 00  怄t.怄t... . . .
0074E6E8  20 00 20 00 20 00 20 00 20 00 20 00 28 00 28 00   . . . . . .(.(.
0074E6F8  28 00 28 00 28 00 20 00 20 00 20 00 20 00 20 00  (.(.(. . . . . .
0074E708  20 00 20 00 20 00 20 00 20 00 20 00 20 00 20 00   . . . . . . . .
0074E718  20 00 20 00 20 00 20 00 20 00 48 00 10 00 10 00   . . . . .H...
0074E728  10 00 10 00 10 00 10 00 10 00 10 00 10 00 10 00  ........
0074E738  10 00 10 00 10 00 10 00 10 00 84 00 84 00 84 00  .....???
0074E748  84 00 84 00 84 00 84 00 84 00 84 00 84 00 10 00  ???????.
0074E758  10 00 10 00 10 00 10 00 10 00 10 00 81 00 81 00  ......??
0074E768  81 00 81 00 81 00 81 00 01 00 01 00 01 00 01 00  ????....

从上面可以看到若(ax)是***4(*号可以是任意数),则(edx+ecx*2)=0074E742-0074E754 又(edx)=0074E6E2 因此 (ecx)=[(edx+ecx*2)-(edx)]/2=30-39,所以对应的是0-9,即为数字。

;为表述上方便,定义从这里开始为对输入的序列号的第一轮运算

0051089B  |>  6A 02         push    2
0051089D  |.  8B55 08       mov     edx, dword ptr [ebp+8]           ;  取出输入的序列号
005108A0  |.  83C2 05       add     edx, 5                           ;  为什么加5后会少了前五位
005108A3  |.  52            push    edx
005108A4  |.  8D45 C8       lea     eax, dword ptr [ebp-38]
005108A7  |.  50            push    eax
005108A8  |.  E8 831F0A00   call    005B2830                         ;  EAX对应的ASCII为34C,即取出序列号中的6、7位
005108AD  |.  83C4 0C       add     esp, 0C
005108B0  |.  C645 CA 00    mov     byte ptr [ebp-36], 0
005108B4  |.  8D4D C8       lea     ecx, dword ptr [ebp-38]
005108B7  |.  51            push    ecx
005108B8  |.  E8 231E0A00   call    005B26E0                         ;  关键 按F7跟入.这里将对取出的数字进行一次运算,后面我们再分析这里。
005108BD  |.  83C4 04       add     esp, 4
005108C0  |.  83F0 07       xor     eax, 7
005108C3  |.  8845 EC       mov     byte ptr [ebp-14], al

005108C6  |.  6A 02         push    2
005108C8  |.  8B55 08       mov     edx, dword ptr [ebp+8]
005108CB  |.  83C2 09       add     edx, 9                           ;  去掉前9位
005108CE  |.  52            push    edx
005108CF  |.  8D45 C8       lea     eax, dword ptr [ebp-38]
005108D2  |.  50            push    eax
005108D3  |.  E8 581F0A00   call    005B2830                         ;  EAX对应的ASCII为67,即取出序列号中的10、11位
005108D8  |.  83C4 0C       add     esp, 0C
005108DB  |.  C645 CA 00    mov     byte ptr [ebp-36], 0
005108DF  |.  8D4D C8       lea     ecx, dword ptr [ebp-38]
005108E2  |.  51            push    ecx
005108E3  |.  E8 F81D0A00   call    005B26E0
005108E8  |.  83C4 04       add     esp, 4
005108EB  |.  83F0 03       xor     eax, 3
005108EE  |.  8845 C0       mov     byte ptr [ebp-40], al

005108F1  |.  6A 0A         push    0A
005108F3  |.  8B55 08       mov     edx, dword ptr [ebp+8]
005108F6  |.  83C2 0E       add     edx, 0E                          ;  去掉前14位
005108F9  |.  52            push    edx
005108FA  |.  8D45 C8       lea     eax, dword ptr [ebp-38]
005108FD  |.  50            push    eax
005108FE  |.  E8 2D1F0A00   call    005B2830                         ; EAX对应的ASCII为9876543211,即取出序列号中的15-23位
00510903  |.  83C4 0C       add     esp, 0C
00510906  |.  C645 D2 00    mov     byte ptr [ebp-2E], 0
0051090A  |.  8D4D C8       lea     ecx, dword ptr [ebp-38]
0051090D  |.  51            push    ecx
0051090E  |.  E8 CD1C0A00   call    005B25E0
00510913  |.  83C4 04       add     esp, 4
00510916  |.  35 27053620   xor     eax, 20360527
0051091B  |.  8945 F0       mov     dword ptr [ebp-10], eax

0051091E  |.  6A 02         push    2
00510920  |.  8B55 08       mov     edx, dword ptr [ebp+8]
00510923  |.  83C2 03       add     edx, 3                           ;  去掉前3位
00510926  |.  52            push    edx
00510927  |.  8D45 C8       lea     eax, dword ptr [ebp-38]
0051092A  |.  50            push    eax
0051092B  |.  E8 001F0A00   call    005B2830                         ;  EAX对应的ASCII为12,即取出序列号中的4、5位
00510930  |.  83C4 0C       add     esp, 0C
00510933  |.  C645 CA 00    mov     byte ptr [ebp-36], 0
00510937  |.  8D4D C8       lea     ecx, dword ptr [ebp-38]
0051093A  |.  51            push    ecx
0051093B  |.  E8 A01D0A00   call    005B26E0
00510940  |.  83C4 04       add     esp, 4
00510943  |.  8845 FC       mov     byte ptr [ebp-4], al

00510946  |.  6A 01         push    1
00510948  |.  8B55 08       mov     edx, dword ptr [ebp+8]
0051094B  |.  83C2 07       add     edx, 7                           ;  去掉前7位
0051094E  |.  52            push    edx
0051094F  |.  8D45 C8       lea     eax, dword ptr [ebp-38]
00510952  |.  50            push    eax
00510953  |.  E8 D81E0A00   call    005B2830                         ;  EAX对应的ASCII为5,即取出序列号中的8位
00510958  |.  83C4 0C       add     esp, 0C
0051095B  |.  C645 C9 00    mov     byte ptr [ebp-37], 0
0051095F  |.  8D4D C8       lea     ecx, dword ptr [ebp-38]
00510962  |.  51            push    ecx
00510963  |.  E8 781D0A00   call    005B26E0
00510968  |.  83C4 04       add     esp, 4
0051096B  |.  8845 BC       mov     byte ptr [ebp-44], al

0051096E  |.  6A 02         push    2
00510970  |.  8B55 08       mov     edx, dword ptr [ebp+8]
00510973  |.  83C2 0B       add     edx, 0B
00510976  |.  52            push    edx
00510977  |.  8D45 C8       lea     eax, dword ptr [ebp-38]
0051097A  |.  50            push    eax
0051097B  |.  E8 B01E0A00   call    005B2830                         ;  EAX对应的ASCII为89,即取出序列号中的12、13位
00510980  |.  83C4 0C       add     esp, 0C
00510983  |.  C645 CA 00    mov     byte ptr [ebp-36], 0
00510987  |.  8D4D C8       lea     ecx, dword ptr [ebp-38]
0051098A  |.  51            push    ecx                              ;  EAX对应ASCII为89
0051098B  |.  E8 501D0A00   call    005B26E0
00510990  |.  83C4 04       add     esp, 4
00510993  |.  8845 B4       mov     byte ptr [ebp-4C], al            ;  ebp-4C

00510996  |.  6A 02         push    2
00510998  |.  8B55 08       mov     edx, dword ptr [ebp+8]
0051099B  |.  83C2 18       add     edx, 18                          ;  去掉前24位
0051099E  |.  52            push    edx
0051099F  |.  8D45 C8       lea     eax, dword ptr [ebp-38]
005109A2  |.  50            push    eax
005109A3  |.  E8 881E0A00   call    005B2830                         ;  EAX对应的ASCII为23,即取出序列号中的25、26位
005109A8  |.  83C4 0C       add     esp, 0C
005109AB  |.  C645 CA 00    mov     byte ptr [ebp-36], 0
005109AF  |.  8D4D C8       lea     ecx, dword ptr [ebp-38]
005109B2  |.  51            push    ecx                              ;  
005109B3  |.  E8 281D0A00   call    005B26E0
005109B8  |.  83C4 04       add     esp, 4
005109BB  |.  8845 F8       mov     byte ptr [ebp-8], al

;为表述上方便,定义从这里开始为对输入的序列号的第二轮运算

005109BE  |.  8B55 EC       mov     edx, dword ptr [ebp-14]          ;
005109C1  |.  81E2 FF000000 and     edx, 0FF                         ;  edx=6,7位(即34)运算后的值
005109C7  |.  8B45 F0       mov     eax, dword ptr [ebp-10]          ;  edx=15-24位(即1234123456)运算后的值
005109CA  |.  8D4402 05     lea     eax, dword ptr [edx+eax+5]
005109CE  |.  33D2          xor     edx, edx
005109D0  |.  B9 0A000000   mov     ecx, 0A
005109D5  |.  F7F1          div     ecx
005109D7  |.  8855 F4       mov     byte ptr [ebp-C], dl             ;  (ebp-C)=[(ebp-14)+(ebp-10)+5]mod 0AH

005109DA  |.  8B55 C0       mov     edx, dword ptr [ebp-40]
005109DD  |.  81E2 FF000000 and     edx, 0FF                         ;  edx为11,12位(即67)经第一轮运算后的值
005109E3  |.  8B45 F0       mov     eax, dword ptr [ebp-10]          ;  edx为15-24位(即9876543211)经第一轮运算后的值
005109E6  |.  8D4402 05     lea     eax, dword ptr [edx+eax+5]
005109EA  |.  33D2          xor     edx, edx
005109EC  |.  B9 64000000   mov     ecx, 64
005109F1  |.  F7F1          div     ecx
005109F3  |.  8855 B8       mov     byte ptr [ebp-48], dl            ;  (ebp-48)=[(ebp-40)+(ebp-10)+5]mod 64H

005109F6  |.  8B55 F4       mov     edx, dword ptr [ebp-C]           
005109F9  |.  81E2 FF000000 and     edx, 0FF
005109FF  |.  8B45 B8       mov     eax, dword ptr [ebp-48]
00510A02  |.  25 FF000000   and     eax, 0FF
00510A07  |.  8D4402 07     lea     eax, dword ptr [edx+eax+7]
00510A0B  |.  99            cdq
00510A0C  |.  B9 64000000   mov     ecx, 64
00510A11  |.  F7F9          idiv    ecx
00510A13  |.  8855 B0       mov     byte ptr [ebp-50], dl            ;  (ebp-50)=[(ebp-C+(ebp-48)+7]mod 64H

00510A16  |.  8B55 F4       mov     edx, dword ptr [ebp-C]           
00510A19  |.  81E2 FF000000 and     edx, 0FF
00510A1F  |.  8B45 B8       mov     eax, dword ptr [ebp-48]
00510A22  |.  25 FF000000   and     eax, 0FF
00510A27  |.  03D0          add     edx, eax
00510A29  |.  8B4D B0       mov     ecx, dword ptr [ebp-50]
00510A2C  |.  81E1 FF000000 and     ecx, 0FF
00510A32  |.  8D440A 08     lea     eax, dword ptr [edx+ecx+8]
00510A36  |.  99            cdq
00510A37  |.  B9 64000000   mov     ecx, 64
00510A3C  |.  F7F9          idiv    ecx
00510A3E  |.  8855 C4       mov     byte ptr [ebp-3C], dl            ;  (ebp-3C)=[(ebp-C)+(ebp-48)+(ebp-50)+8]mod 0AH

; 对前面两轮运算结果进行判断

00510A41  |.  8B55 F4       mov     edx, dword ptr [ebp-C]           ;ebp-C
00510A44  |.  81E2 FF000000 and     edx, 0FF
00510A4A  |.  8B45 BC       mov     eax, dword ptr [ebp-44]          ;ebp-44
00510A4D  |.  25 FF000000   and     eax, 0FF
00510A52  |.  3BD0          cmp     edx, eax
00510A54  |.  75 40         jnz     short 00510A96                   ;  不为零/不等于则完

00510A56  |.  8B4D B8       mov     ecx, dword ptr [ebp-48]          ;  ebp-48
00510A59  |.  81E1 FF000000 and     ecx, 0FF
00510A5F  |.  8B55 B4       mov     edx, dword ptr [ebp-4C]          ;  (第12,13位经第一轮运算的结果)
00510A62  |.  81E2 FF000000 and     edx, 0FF
00510A68  |.  3BCA          cmp     ecx, edx
00510A6A  |.  75 2A         jnz     short 00510A96                   ;  不为零/不等于则完

00510A6C  |.  8B45 B0       mov     eax, dword ptr [ebp-50]          ;  ebp-50
00510A6F  |.  25 FF000000   and     eax, 0FF
00510A74  |.  8B4D FC       mov     ecx, dword ptr [ebp-4]           ;  (第3,4位经第一轮运算的结果)
00510A77  |.  81E1 FF000000 and     ecx, 0FF
00510A7D  |.  3BC1          cmp     eax, ecx
00510A7F  |.  75 15         jnz     short 00510A96                   ;  不为零/不等于则完

00510A81  |.  8B55 C4       mov     edx, dword ptr [ebp-3C]          ;  ebp-3C
00510A84  |.  81E2 FF000000 and     edx, 0FF
00510A8A  |.  8B45 F8       mov     eax, dword ptr [ebp-8]           ;  (第11,12位经第一轮运算的结果)
00510A8D  |.  25 FF000000   and     eax, 0FF
00510A92  |.  3BD0          cmp     edx, eax
00510A94  |.  74 04         je      short 00510A9A                   ;  零/等于则跳,激活

00510A96  |>  33C0          xor     eax, eax
00510A98  |.  EB 05         jmp     short 00510A9F
00510A9A  |>  B8 01000000   mov     eax, 1                           ;  若跳转到这就激活
00510A9F  |>  8BE5          mov     esp, ebp                           ;  若跳转到这就完
00510AA1  |.  5D            pop     ebp
00510AA2  \.  C3            retn

下面我们分析call 005B26E0

005B26E0  /$  55            push    ebp
005B26E1  |.  8BEC          mov     ebp, esp
005B26E3  |.  8B45 08       mov     eax, dword ptr [ebp+8]
005B26E6  |.  50            push    eax
005B26E7  |.  E8 F4FEFFFF   call    005B25E0                         ; 还要跳转一次
005B26EC  |.  83C4 04       add     esp, 4
005B26EF  |.  5D            pop     ebp
005B26F0  \.  C3            retn

005B25E0  /$  55            push    ebp
005B25E1  |.  8BEC          mov     ebp, esp
005B25E3  |.  83EC 14       sub     esp, 14
005B25E6  |>  833D E4E87400>/cmp     dword ptr [74E8E4], 1
005B25ED  |.  7E 17         |jle     short 005B2606                  ;  小于或等于/不大于则跳
005B25EF  |.  6A 08         |push    8
005B25F1  |.  8B45 08       |mov     eax, dword ptr [ebp+8]
005B25F4  |.  33C9          |xor     ecx, ecx
005B25F6  |.  8A08          |mov     cl, byte ptr [eax]
005B25F8  |.  51            |push    ecx
005B25F9  |.  E8 B2CC0000   |call    005BF2B0
005B25FE  |.  83C4 08       |add     esp, 8
005B2601  |.  8945 F0       |mov     dword ptr [ebp-10], eax
005B2604  |.  EB 19         |jmp     short 005B261F
005B2606  |>  8B55 08       |mov     edx, dword ptr [ebp+8]
005B2609  |.  33C0          |xor     eax, eax
005B260B  |.  8A02          |mov     al, byte ptr [edx]              ;  (EAX)=前面取出的数字中的第1位的ASCII值
005B260D  |.  8B0D D8E67400 |mov     ecx, dword ptr [74E6D8]         ;  Unpacked.0074E6E2
005B2613  |.  33D2          |xor     edx, edx
005B2615  |.  66:8B1441     |mov     dx, word ptr [ecx+eax*2]
005B2619  |.  83E2 08       |and     edx, 8
005B261C  |.  8955 F0       |mov     dword ptr [ebp-10], edx
005B261F  |>  837D F0 00    |cmp     dword ptr [ebp-10], 0
005B2623  |.  74 0B         |je      short 005B2630                  ;  零/等于则跳
005B2625  |.  8B45 08       |mov     eax, dword ptr [ebp+8]
005B2628  |.  83C0 01       |add     eax, 1
005B262B  |.  8945 08       |mov     dword ptr [ebp+8], eax
005B262E  |.^ EB B6         \jmp     short 005B25E6

前面这段又是判断从输入的序列号取出的第一位是否为数字

005B2630  |>  8B4D 08       mov     ecx, dword ptr [ebp+8]
005B2633  |.  33D2          xor     edx, edx
005B2635  |.  8A11          mov     dl, byte ptr [ecx]               ;  (EAX)=从输入的序列号取出的数字中的第1位的ASCII值
005B2637  |.  8955 FC       mov     dword ptr [ebp-4], edx
005B263A  |.  8B45 08       mov     eax, dword ptr [ebp+8]
005B263D  |.  83C0 01       add     eax, 1
005B2640  |.  8945 08       mov     dword ptr [ebp+8], eax
005B2643  |.  8B4D FC       mov     ecx, dword ptr [ebp-4]
005B2646  |.  894D F4       mov     dword ptr [ebp-C], ecx
005B2649  |.  837D FC 2D    cmp     dword ptr [ebp-4], 2D            ;  -
005B264D  |.  74 06         je      short 005B2655
005B264F  |.  837D FC 2B    cmp     dword ptr [ebp-4], 2B            ;  +
005B2653  |.  75 13         jnz     short 005B2668
005B2655  |>  8B55 08       mov     edx, dword ptr [ebp+8]
005B2658  |.  33C0          xor     eax, eax
005B265A  |.  8A02          mov     al, byte ptr [edx]
005B265C  |.  8945 FC       mov     dword ptr [ebp-4], eax
005B265F  |.  8B4D 08       mov     ecx, dword ptr [ebp+8]
005B2662  |.  83C1 01       add     ecx, 1
005B2665  |.  894D 08       mov     dword ptr [ebp+8], ecx
005B2668  |>  C745 F8 00000>mov     dword ptr [ebp-8], 0

;下面这一段构成一个循环对从输入的序列号取出的数字进行运算
005B266F  |>  833D E4E87400>/cmp     dword ptr [74E8E4], 1
005B2676  |.  7E 13         |jle     short 005B268B                  ;  小于或等于/不大于则跳
005B2678  |.  6A 04         |push    4
005B267A  |.  8B55 FC       |mov     edx, dword ptr [ebp-4]
005B267D  |.  52            |push    edx
005B267E  |.  E8 2DCC0000   |call    005BF2B0
005B2683  |.  83C4 08       |add     esp, 8
005B2686  |.  8945 EC       |mov     dword ptr [ebp-14], eax
005B2689  |.  EB 15         |jmp     short 005B26A0
005B268B  |>  8B45 FC       |mov     eax, dword ptr [ebp-4]
005B268E  |.  8B0D D8E67400 |mov     ecx, dword ptr [74E6D8]         ;  

Unpacked.0074E6E2
005B2694  |.  33D2          |xor     edx, edx
005B2696  |.  66:8B1441     |mov     dx, word ptr [ecx+eax*2]
005B269A  |.  83E2 04       |and     edx, 4
005B269D  |.  8955 EC       |mov     dword ptr [ebp-14], edx
005B26A0  |>  837D EC 00    |cmp     dword ptr [ebp-14], 0
005B26A4  |.  74 25         |je      short 005B26CB                  ;  零/等于则跳,最后从这里跳出循环
005B26A6  |.  8B45 F8       |mov     eax, dword ptr [ebp-8]          ;初始时(ebp-8)=0,之后就等于前一次的运算结果
005B26A9  |.  6BC0 0A       |imul    eax, eax, 0A
005B26AC  |.  8B4D FC       |mov     ecx, dword ptr [ebp-4]
005B26AF  |.  8D5408 D0     |lea     edx, dword ptr [eax+ecx-30]     ;  注意 (eax)+(ecx)-30
005B26B3  |.  8955 F8       |mov     dword ptr [ebp-8], edx
005B26B6  |.  8B45 08       |mov     eax, dword ptr [ebp+8]
005B26B9  |.  33C9          |xor     ecx, ecx
005B26BB  |.  8A08          |mov     cl, byte ptr [eax]
005B26BD  |.  894D FC       |mov     dword ptr [ebp-4], ecx
005B26C0  |.  8B55 08       |mov     edx, dword ptr [ebp+8]
005B26C3  |.  83C2 01       |add     edx, 1
005B26C6  |.  8955 08       |mov     dword ptr [ebp+8], edx
005B26C9  |.^ EB A4         \jmp     short 005B266F

005B26CB  |>  837D F4 2D    cmp     dword ptr [ebp-C], 2D
005B26CF  |.  75 07         jnz     short 005B26D8
005B26D1  |.  8B45 F8       mov     eax, dword ptr [ebp-8]
005B26D4  |.  F7D8          neg     eax
005B26D6  |.  EB 03         jmp     short 005B26DB
005B26D8  |>  8B45 F8       mov     eax, dword ptr [ebp-8]
005B26DB  |>  8BE5          mov     esp, ebp
005B26DD  |.  5D            pop     ebp
005B26DE  \.  C3            retn

前面这段实验这样的功能:
    假设序列号中取出的数字排列为 abcd,则经过这段代码后(eax)=[(a * 0AH+b) * 0AH+c] * 0AH+d
即是把取出的数字排列abcd转换为十进制数abcd。

至此整个验证序列号的算法完全弄清楚啦。这个软件的验证算法也真的较麻烦了。
第一次写算法分析,难免有错误,欢迎大家批评指正。

我的编程水平太菜了,写两天才把注册机写出来。
下面是注册机代码(VB 6.0):
Private Sub Command1_Click()
start:
    Randomize
    a1 = Int((9 * Rnd) + 0)
    a2 = Int((9 * Rnd) + 0)
    X1 = Val(a1 & a2)
    X1 = X1 Xor 7
    b1 = Int((9 * Rnd) + 0)
    b2 = Int((9 * Rnd) + 0)
    X2 = Val(b1 & b2)
    X2 = X2 Xor 3
    c1 = Int((9 * Rnd) + 0)
    c2 = Int((9 * Rnd) + 0)
    c3 = Int((9 * Rnd) + 0)
    c4 = Int((9 * Rnd) + 0)
    c5 = Int((9 * Rnd) + 0)
    c6 = Int((9 * Rnd) + 0)
    c7 = Int((9 * Rnd) + 0)
    c8 = Int((9 * Rnd) + 0)
    c9 = Int((9 * Rnd) + 0)
    c10 = Int((9 * Rnd) + 0)
    Dim tmp As Double
    tmp = Val(c1 & c2 & c3 & c4 & c5 & c6 & c7 & c8 & c9 & c10)
    If tmp > 2147483647 Then GoTo start
    Dim X3 As Long
    X3 = tmp
    X3 = X3 Xor 540411175
    Y1 = (X1 + X3 + 5) Mod 10
    Y2 = (X2 + X3 + 5) Mod 100
    y3 = (Y1 + Y2 + 7) Mod 100
    y4 = (Y1 + Y2 + y3 + 8) Mod 100
    x5 = Y1
    X6 = Y2
    If X6 < 10 Then X6 = "0" & X6
    X4 = y3
    If X4 < 10 Then X4 = "0" & X4
    X7 = y4
    If X7 < 10 Then X7 = "0" & X7
    Form1.Text1.Text = "NTC" & X4 & a1 & a2 & x5 & "-" & b1 & b2 & X6 & "-" & c1 & c2 & c3 & c4 & c5 & c6 & c7 & c8 & c9 & c10 & X7
End Sub

总算把一个软件的爆破,到算法分析、注册机的全过程完成了,花了很长时间,不过收获很大。
2010-2-8 14:37
0
雪    币: 242
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
写的比较详细。。。可以学习下
2010-2-8 15:55
0
雪    币: 80
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
我现在是连你在说什么都看不懂,破解到底如何入门啊,疑惑中
2010-2-8 17:55
0
雪    币: 414
活跃值: (531)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
5
兄弟你再细心点,看看那个包里是不是有一个REG的文件,双击它就可以直接注册了。
2010-2-9 09:38
0
雪    币: 351
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
我的解压后没有一个REG的文件,我用电脑迷的PE里的FINALDATA2.0也是提示要输入序列号的。不知道你的是什么版本,从哪里得到的?
2010-2-10 11:28
0
雪    币: 37
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
确实..finaldata2.0是可以通过修改注册表来注册的...
2010-2-10 12:33
0
雪    币: 30
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
谢谢 看不懂...
2010-2-10 18:50
0
雪    币: 351
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
花了差不多一周时间,终于把这个全做完。
大家帮忙看看,有无纰漏。
2010-2-12 08:19
0
雪    币: 520
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
楼主讲得很详细,学习了,算法分析还是我的弱项。
2010-2-12 08:38
0
雪    币: 1462
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
其他暂且不说,精神方面是值得肯定的,不要对楼主过于挑剔。
2010-2-12 09:14
0
雪    币: 370
活跃值: (15)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
12
强啊,欢迎加入pediy
Tag: FinalData v2.0 Keygen 算法 注册 破解 Crack
2010-2-12 09:15
0
雪    币: 197
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
好文章,学习了
2010-2-12 13:29
0
雪    币: 351
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
多谢大家支持!除夕啦,大家新年快乐。
2010-2-13 20:03
0
雪    币: 31
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
这里真是高手如云
2010-2-13 21:02
0
雪    币: 50
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
吊炸了,我自己今天也试着破解完全不知道从哪里下手啊。。然后就搜到了楼主的帖子
2014-2-6 01:42
0
雪    币: 20
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
真羡慕您们!!!!
2014-2-6 08:44
0
游客
登录 | 注册 方可回帖
返回
//