【破解日期】 2006年5月17日
【破解作者】 houhq
【使用工具】 DeDe,OD
【破解平台】 Windows XP
【软件名称】 P2P TV 记录器 1.53(26-1-2006)
【下载地址】 http://www.pprecorder.com/cn/download.htm
【软件简介】 P2P TV 记录器是目前唯一能记录PPLive, PPStream, Coolstreaming, SopCast等各种P2P网络电视的工具, 能方便地保存各种P2P网络电视到你的硬盘,实现离线观看网络电视.该工具也提供监视磁盘使用情况,保护你的硬盘.
【加壳方式】 ASPack 2.12
【破解声明】
 这是本人第一次独立破解,送给更菜的菜鸟:).其中采用了MD5算法,记得前几天玩个CrackMe进还不知道MD5为何物,跟进去差点吐血而亡。没想到写这篇文档,花的时间比破解的时间还要长,希望能得到大家的支持。只为学习交流,对由此产生的任何后果不负责。
 
一点问题:
System.@LStrCopy;等注释,都是参照DeDe里的反编译内容手动加到OD里的,不知道还有没有更帅点的办法:)
--------------------------------------------------------------------------------
【破解内容】
--------------------------------------------------------------------------------
1).先用工具脱壳,运行软件,弹出注册窗口,随便输入用户名、电子邮件、注册码,点击“确定”没反应。
2).用DeDe反编译,在Procedures中的类TregistraWin中有如下一行
ButtOkClick  004EE4B8  0012
知道点“确定”后执行004EE4B8处代码,在此处下断。
3)
004EE4B8   .  55            push    ebp
004EE4B9   .  8BEC          mov     ebp, esp
004EE4BB   .  B9 09000000   mov     ecx, 9
004EE4C0   >  6A 00         push    0
004EE4C2   .  6A 00         push    0
004EE4C4   .  49            dec     ecx
004EE4C5   .^ 75 F9         jnz     short 004EE4C0
004EE4C7   .  51            push    ecx
004EE4C8   .  8945 FC       mov     [ebp-4], eax
004EE4CB   .  33C0          xor     eax, eax
004EE4CD   .  55            push    ebp
004EE4CE   .  68 C4E74E00   push    004EE7C4
004EE4D3   .  64:FF30       push    dword ptr fs:[eax]
004EE4D6   .  64:8920       mov     fs:[eax], esp
004EE4D9   .  8D55 F4       lea     edx, [ebp-C]
004EE4DC   .  8B45 FC       mov     eax, [ebp-4]
004EE4DF   .  8B80 08030000 mov     eax, [eax+308]
004EE4E5   .  E8 2EC0F6FF   call    0045A518
004EE4EA   .  8B45 F4       mov     eax, [ebp-C]                     ;  取得注册码
004EE4ED   .  50            push    eax
004EE4EE   .  8D55 E8       lea     edx, [ebp-18]
004EE4F1   .  8B45 FC       mov     eax, [ebp-4]
004EE4F4   .  8B80 F8020000 mov     eax, [eax+2F8]
004EE4FA   .  E8 19C0F6FF   call    0045A518
004EE4FF   .  8B45 E8       mov     eax, [ebp-18]
004EE502   .  8D55 EC       lea     edx, [ebp-14]
004EE505   .  E8 8AACF1FF   call    00409194
004EE50A   .  FF75 EC       push    dword ptr [ebp-14]               ;  取得用户名
004EE50D   .  68 DCE74E00   push    004EE7DC
004EE512   .  8D55 E0       lea     edx, [ebp-20]
004EE515   .  8B45 FC       mov     eax, [ebp-4]
004EE518   .  8B80 00030000 mov     eax, [eax+300]
004EE51E   .  E8 F5BFF6FF   call    0045A518
004EE523   .  8B45 E0       mov     eax, [ebp-20]                    ;  取得电子邮件
004EE526   .  8D55 E4       lea     edx, [ebp-1C]
004EE529   .  E8 66ACF1FF   call    00409194
004EE52E   .  FF75 E4       push    dword ptr [ebp-1C]
004EE531   .  8D45 F0       lea     eax, [ebp-10]
004EE534   .  BA 03000000   mov     edx, 3
004EE539   .  E8 6267F1FF   call    00404CA0
004EE53E   .  8B45 F0       mov     eax, [ebp-10]                    ;  转成(用户名:电子邮件)形式
004EE541   .  5A            pop     edx
004EE542   .  E8 098E0200   call    00517350                         ;  算法关键调用
004EE547   .  84C0          test    al, al

“call    00517350”为算法关键,之后就判断al,如不为0,则注册成功,进行写注册表。跟进00517350
4)
00517350   $  55            push    ebp
00517351   .  8BEC          mov     ebp, esp
00517353   .  B9 0A000000   mov     ecx, 0A
00517358   >  6A 00         push    0
0051735A   .  6A 00         push    0
0051735C   .  49            dec     ecx
0051735D   .^ 75 F9         jnz     short 00517358
0051735F   .  51            push    ecx
00517360   .  53            push    ebx
00517361   .  56            push    esi
00517362   .  57            push    edi
00517363   .  8955 FC       mov     [ebp-4], edx
00517366   .  8B45 FC       mov     eax, [ebp-4]
00517369   .  E8 5ADAEEFF   call    00404DC8                         ;  System.@LStrAddRef
0051736E   .  33C0          xor     eax, eax
00517370   .  55            push    ebp
00517371   .  68 27765100   push    00517627
00517376   .  64:FF30       push    dword ptr fs:[eax]
00517379   .  64:8920       mov     fs:[eax], esp
0051737C   .  33C0          xor     eax, eax
0051737E   .  55            push    ebp
0051737F   .  68 F3755100   push    005175F3
00517384   .  64:FF30       push    dword ptr fs:[eax]
00517387   .  64:8920       mov     fs:[eax], esp
0051738A   .  33C0          xor     eax, eax
0051738C   .  55            push    ebp
0051738D   .  68 CE755100   push    005175CE
00517392   .  64:FF30       push    dword ptr fs:[eax]
00517395   .  64:8920       mov     fs:[eax], esp
00517398   .  8D45 F4       lea     eax, [ebp-C]
0051739B   .  50            push    eax
0051739C   .  B9 02000000   mov     ecx, 2
005173A1   .  BA 01000000   mov     edx, 1
005173A6   .  8B45 FC       mov     eax, [ebp-4]
005173A9   .  E8 8ADAEEFF   call    00404E38                         ;  System.@LStrCopy;()
005173AE   .  8B45 F4       mov     eax, [ebp-C]                     ;  取注册码前两位
005173B1   .  BA 40765100   mov     edx, 00517640                    ;  ASCII "10"
005173B6   .  E8 69D9EEFF   call    00404D24                         ;  System.@LStrCmp;
005173BB   .  0F85 BA000000 jnz     0051747B                         ;  注册码前两位与10比较
005173C1   .  8D45 F0       lea     eax, [ebp-10]
005173C4   .  50            push    eax
005173C5   .  B9 01000000   mov     ecx, 1
005173CA   .  BA 03000000   mov     edx, 3
005173CF   .  8B45 FC       mov     eax, [ebp-4]
005173D2   .  E8 61DAEEFF   call    00404E38                         ;  System.@LStrCopy;
005173D7   .  8B45 F0       mov     eax, [ebp-10]
005173DA   .  E8 D521EFFF   call    004095B4                         ;  SysUtils.StrToInt
005173DF   .  8BD8          mov     ebx, eax                         ;  取注册码第三位并转成整数,设为m
005173E1   .  8D45 F8       lea     eax, [ebp-8]
005173E4   .  50            push    eax
005173E5   .  8BCB          mov     ecx, ebx
005173E7   .  BA 04000000   mov     edx, 4
005173EC   .  8B45 FC       mov     eax, [ebp-4]                     ;  System.@LStrCopy;
005173EF   .  E8 44DAEEFF   call    00404E38                         ;  从注册码第三位后取m个数,设为xxx
005173F4   .  8D45 EC       lea     eax, [ebp-14]
005173F7   .  50            push    eax
005173F8   .  8D7B 03       lea     edi, [ebx+3]
005173FB   .  47            inc     edi                              ;  edi = m + 4
005173FC   .  8BD7          mov     edx, edi
005173FE   .  B9 01000000   mov     ecx, 1
00517403   .  8B45 FC       mov     eax, [ebp-4]
00517406   .  E8 2DDAEEFF   call    00404E38                         ;  System.@LStrCopy;
0051740B   .  8B45 EC       mov     eax, [ebp-14]
0051740E   .  E8 A121EFFF   call    004095B4                         ;  StrToInt(AnsiString):Integer;
00517413   .  8BF0          mov     esi, eax                         ;  注册码第m+4位的值,设为n,esi = n
00517415   .  8D45 D4       lea     eax, [ebp-2C]
00517418   .  B9 4C765100   mov     ecx, 0051764C                    ;  ASCII "P2PTVRecorder"
0051741D   .  8B55 F8       mov     edx, [ebp-8]
00517420   .  E8 07D8EEFF   call    00404C2C                         ;  System.@LStrCat3;
00517425   .  8B45 D4       mov     eax, [ebp-2C]                    ;  组成“xxxP2PTVRecorder”形式
00517428   .  8D55 D8       lea     edx, [ebp-28]
0051742B   .  E8 886CFDFF   call    004EE0B8                         ;  MD5算法
00517430   .  8D45 D8       lea     eax, [ebp-28]
00517433   .  8D55 E8       lea     edx, [ebp-18]
00517436   .  E8 F16CFDFF   call    004EE12C                         ;  MD5算法
0051743B   .  8B45 E8       mov     eax, [ebp-18]                    ;  “xxxP2PTVRecorder”经MD5后的值,设为AAA
0051743E   .  50            push    eax
0051743F   .  8D45 D0       lea     eax, [ebp-30]
00517442   .  50            push    eax
00517443   .  8B45 FC       mov     eax, [ebp-4]
00517446   .  E8 95D7EEFF   call    00404BE0                         ;  注册码长度
0051744B   .  8BC8          mov     ecx, eax
0051744D   .  8D43 03       lea     eax, [ebx+3]
00517450   .  03C6          add     eax, esi
00517452   .  40            inc     eax
00517453   .  2BC8          sub     ecx, eax
00517455   .  8BD7          mov     edx, edi
00517457   .  03D6          add     edx, esi
00517459   .  42            inc     edx                              ;  edx = esi+edi+1 = m+n+5
0051745A   .  8B45 FC       mov     eax, [ebp-4]                     ;  System.@LStrCopy;
0051745D   .  E8 D6D9EEFF   call    00404E38
00517462   .  8B55 D0       mov     edx, [ebp-30]                    ;  取注册码m+n+5位后的所有字符,设为BBB
00517465   .  58            pop     eax
00517466   .  E8 B9D8EEFF   call    00404D24                         ;  System.@LStrCmp;
0051746B   .  75 07         jnz     short 00517474                   ;  AAA与BBB相比较
0051746D   .  B3 01         mov     bl, 1
0051746F   .  E9 50010000   jmp     005175C4
00517474   >  33DB          xor     ebx, ebx
00517476   .  E9 49010000   jmp     005175C4

以上为注册码为"10"开头的情况(Single License),如注册码101234560eba356b54c59193734b34c2a5d1584f
先取第三位1记为m,即m=1,取第三位后m个数,得到"2",与P2PTVRecorder连接成2P2PTVRecorder,算2P2PTVRecorder的MD5值为0eba356b54c59193734b34c2a5d1584f,记为AAA,取第m+4(=5)位数3,记为n,取m+n+4(=8)位后所有字串记为BBB,AAA与BBB相等,注册码正确。

还有以"4"开头的(Site License),既非"10"也非"4"开头(Single License)两种情况,方法类似,不再赘述,供大家练习。
提供这两种情况下的注册码,注册机就懒得写了。
412347a6a77a9b0bdfd995837ce1a2a2e7769
5123454ddb2042a6f7abb9ffc01081f4cb756b