- UID
- 20229
注册时间2006-8-10
阅读权限20
最后登录1970-1-1
以武会友
 
该用户从未签到
|
【破文标题】【WAKU申请加入破文1】P2P TV Recorder注册算法分析
【破文作者】WAKU
【作者邮箱】[email protected]
【作者主页】
【破解工具】PEID OD
【破解平台】XP SP2
【软件名称】P2P TV Recorder
【软件大小】
【原版下载http://www.pprecorder.com/cn/download.htm
【保护方式】Aspack壳
【软件简介】一个可以录制网络电视的软件,功能强大,使用方便
------------------------------------------------------------------------
最近有点懒,玩游戏过多,开学了得收收心,拿个软件研究一下:)随手拿来一期大众软件,看到介绍的这个软件,正好有时候也能用就下来试试.
软件运行就会弹出注册提示,要求输入用户名,邮箱和注册码,随便填了一个点确定....嗯没反应.用PEID查一下,ASPACK的壳,找一个AspackDie脱掉.再查,是用Delphi写的,那好用Dede来分析一下,点Procedures在ClassName中看到左面有TRegistraWin,这个就对应着注册窗口.双击右面的ButtonOKClick就可跳到点确定后的代码段了.关于如何用Dede找到关键点请参照CCDebuger大大的动画:
http://bbs.pediy.com/showthread.php?s=&threadid=19907
把关键地址记下是004EE4D0,用OD载入Ctrl+G输入004EE4D0,确定后下断,F9运行,用CTRL+F9跳过异常(有可能OD会崩溃,多试几次).出现注册窗口,随便输入点确定,果然断下来了,高兴:)开始分析吧:
004EE4D0 . 55 push ebp ;这就是Dede找到的关键点
004EE4D1 . 8BEC mov ebp, esp
004EE4D3 . B9 09000000 mov ecx, 9
004EE4D8 > 6A 00 push 0
004EE4DA . 6A 00 push 0
004EE4DC . 49 dec ecx
004EE4DD .^ 75 F9 jnz short 004EE4D8
004EE4DF . 51 push ecx
004EE4E0 . 8945 FC mov [ebp-4], eax
004EE4E3 . 33C0 xor eax, eax
004EE4E5 . 55 push ebp
004EE4E6 . 68 16E84E00 push 004EE816
004EE4EB . 64:FF30 push dword ptr fs:[eax]
004EE4EE . 64:8920 mov fs:[eax], esp
004EE4F1 . 8D55 F4 lea edx, [ebp-C]
004EE4F4 . 8B45 FC mov eax, [ebp-4]
004EE4F7 . 8B80 08030000 mov eax, [eax+308]
004EE4FD . E8 16C0F6FF call 0045A518
004EE502 . 8B45 F4 mov eax, [ebp-C] ; EAX出现注册码
004EE505 . 50 push eax
004EE506 . 8D55 E8 lea edx, [ebp-18]
004EE509 . 8B45 FC mov eax, [ebp-4]
004EE50C . 8B80 F8020000 mov eax, [eax+2F8]
004EE512 . E8 01C0F6FF call 0045A518
004EE517 . 8B45 E8 mov eax, [ebp-18] ; EAX出现用户名
004EE51A . 8D55 EC lea edx, [ebp-14]
004EE51D . E8 72ACF1FF call 00409194
004EE522 . FF75 EC push dword ptr [ebp-14]
004EE525 . 68 2CE84E00 push 004EE82C
004EE52A . 8D55 E0 lea edx, [ebp-20]
004EE52D . 8B45 FC mov eax, [ebp-4]
004EE530 . 8B80 00030000 mov eax, [eax+300]
004EE536 . E8 DDBFF6FF call 0045A518
004EE53B . 8B45 E0 mov eax, [ebp-20] ; EAX出现邮箱
004EE53E . 8D55 E4 lea edx, [ebp-1C]
004EE541 . E8 4EACF1FF call 00409194 ; 跟进后看了几眼估计是验证邮箱合法
004EE546 . FF75 E4 push dword ptr [ebp-1C]
004EE549 . 8D45 F0 lea eax, [ebp-10]
004EE54C . BA 03000000 mov edx, 3
004EE551 . E8 4A67F1FF call 00404CA0
004EE556 . 8B45 F0 mov eax, [ebp-10]
004EE559 . 5A pop edx
004EE55A . E8 9DD70200 call 0051BCFC ; 验证函数
004EE55F . 84C0 test al, al
004EE561 0F84 22020000 je 004EE789 ; 跳了就完了
上面有很多CALL,我大部分都跟进去了,凭我超强的第六感...感觉和验证没什么关系,就不管了.最后三句的CALL、TEST和JE构成了"生或死,这是一个经典的验证".还等啥啊,跟进CALL看看:
0051BCFC $ 55 push ebp
0051BCFD . 8BEC mov ebp, esp
0051BCFF . B9 0A000000 mov ecx, 0A
0051BD04 > 6A 00 push 0
0051BD06 . 6A 00 push 0
0051BD08 . 49 dec ecx
0051BD09 .^ 75 F9 jnz short 0051BD04
0051BD0B . 51 push ecx
0051BD0C . 53 push ebx
0051BD0D . 56 push esi
0051BD0E . 57 push edi
0051BD0F . 8955 FC mov [ebp-4], edx ; [ebp-4]放注册码
0051BD12 . 8B45 FC mov eax, [ebp-4]
0051BD15 . E8 AE90EEFF call 00404DC8
0051BD1A . 33C0 xor eax, eax
0051BD1C . 55 push ebp
0051BD1D . 68 D3BF5100 push 0051BFD3
0051BD22 . 64:FF30 push dword ptr fs:[eax]
0051BD25 . 64:8920 mov fs:[eax], esp
0051BD28 . 33C0 xor eax, eax
0051BD2A . 55 push ebp
0051BD2B . 68 9FBF5100 push 0051BF9F
0051BD30 . 64:FF30 push dword ptr fs:[eax]
0051BD33 . 64:8920 mov fs:[eax], esp
0051BD36 . 33C0 xor eax, eax
0051BD38 . 55 push ebp
0051BD39 . 68 7ABF5100 push 0051BF7A
0051BD3E . 64:FF30 push dword ptr fs:[eax]
0051BD41 . 64:8920 mov fs:[eax], esp
0051BD44 . 8D45 F4 lea eax, [ebp-C]
0051BD47 . 50 push eax
0051BD48 . B9 02000000 mov ecx, 2
0051BD4D . BA 01000000 mov edx, 1
0051BD52 . 8B45 FC mov eax, [ebp-4]
0051BD55 . E8 DE90EEFF call 00404E38
0051BD5A . 8B45 F4 mov eax, [ebp-C] ; 注册码前两位
0051BD5D . BA ECBF5100 mov edx, 0051BFEC ; ASCII "10"
0051BD62 . E8 BD8FEEFF call 00404D24 ; 注册码前两位和10比较
0051BD67 . 0F85 BA000000 jnz 0051BE27 ; 不是10则跳
0051BE27 > \8D45 CC lea eax, [ebp-34] ; 不是10开头跳到这
0051BE2A . 50 push eax
0051BE2B . B9 01000000 mov ecx, 1
0051BE30 . BA 01000000 mov edx, 1
0051BE35 . 8B45 FC mov eax, [ebp-4]
0051BE38 . E8 FB8FEEFF call 00404E38
0051BE3D . 8B45 CC mov eax, [ebp-34] ; 注册码第一位
0051BE40 . BA 10C05100 mov edx, 0051C010 ; EDX总是指向4
0051BE45 . E8 DA8EEEFF call <比较EAX和EDX指向的内容>
0051BE4A . 0F85 94000000 jnz 0051BEE4 ; 注册码不是4开头则跳
51BE45 CALL的标签是我跟进后分析得到的,当知道某一CALL的具体作用时,可用SHIFT+;输入标签,这样代码就很容易读懂了.具体方法请参http://bbs.pediy.com/showthread.php?s=&threadid=30743
上面的CALL比较注册码是不是以4开头.用OD往下看看,发现有P2PTVRecorder和P2PTVRecorderSiteLicense两个字符串,而这两个字符串所在的代码段大同小异.最后的跳转正好跳过P2PTVRecorder的部分,看来注册码以4开头是团队版,而不是4开头则就是个人版的.咱来看看团队版吧:
0051BE50 . 8D45 C8 lea eax, [ebp-38]
0051BE53 . 50 push eax
0051BE54 . B9 01000000 mov ecx, 1
0051BE59 . BA 01000000 mov edx, 1
0051BE5E . 8B45 FC mov eax, [ebp-4] ; EAX出现注册码
0051BE61 . E8 D28FEEFF call 00404E38
0051BE66 . 8B45 C8 mov eax, [ebp-38]
0051BE69 . E8 46D7EEFF call 004095B4
0051BE6E . 8BD8 mov ebx, eax
0051BE70 . 8D45 F8 lea eax, [ebp-8]
0051BE73 . 50 push eax
0051BE74 . 8BCB mov ecx, ebx
0051BE76 . BA 02000000 mov edx, 2
0051BE7B . 8B45 FC mov eax, [ebp-4]
0051BE7E . E8 B58FEEFF call 00404E38 ; 取注册码第二位开始,长度由第一位表示的子串到EBP-8
0051BE83 . 8D45 C0 lea eax, [ebp-40]
0051BE86 . B9 1CC05100 mov ecx, 0051C01C ; ASCII "P2PTVRecorderSiteLicense"
0051BE8B . 8B55 F8 mov edx, [ebp-8]
0051BE8E . E8 998DEEFF call 00404C2C ; 合并子串和P2PTVRecorderSiteLicense
0051BE93 . 8B45 C0 mov eax, [ebp-40]
0051BE96 . 8D55 D8 lea edx, [ebp-28]
0051BE99 . E8 3222FDFF call 004EE0D0 ; 这个CALL很关键
0051BE9E . 8D45 D8 lea eax, [ebp-28]
0051BEA1 . 8D55 C4 lea edx, [ebp-3C]
0051BEA4 . E8 9B22FDFF call 004EE144 ; 数据转移
0051BEA9 . 8B45 C4 mov eax, [ebp-3C]
0051BEAC . 50 push eax
0051BEAD . 8D45 BC lea eax, [ebp-44]
0051BEB0 . 50 push eax
0051BEB1 . 8B45 FC mov eax, [ebp-4]
0051BEB4 . E8 278DEEFF call 00404BE0 ; 获得注册码的长度
0051BEB9 . 8BC8 mov ecx, eax
0051BEBB . 8D43 01 lea eax, [ebx+1]
0051BEBE . 2BC8 sub ecx, eax
0051BEC0 . 8D53 02 lea edx, [ebx+2]
0051BEC3 . 8B45 FC mov eax, [ebp-4]
0051BEC6 . E8 6D8FEEFF call 00404E38
0051BECB . 8B55 BC mov edx, [ebp-44]
0051BECE . 58 pop eax
0051BECF . E8 508EEEFF call <比较EAX和EDX指向的内容>
0051BED4 . 75 07 jnz short 0051BEDD ; 跳了就完了
上面的CALL有的需要跟进去看看,有的从返回结果和内存变化大体能猜出来是干什么用的,比如那个取子串和合并的CALL.51BEA4的CALL很复杂,CALL里还有很多CALL,我们一层层跟进,最后发现CALL到了这里:
004EDFA8 /$ C700 01234567 mov dword ptr [eax], 67452301
004EDFAE |. C740 04 89ABC>mov dword ptr [eax+4], EFCDAB89
004EDFB5 |. C740 08 FEDCB>mov dword ptr [eax+8], 98BADCFE
004EDFBC |. C740 0C 76543>mov dword ptr [eax+C], 10325476
004EDFC3 |. 33D2 xor edx, edx
004EDFC5 |. 8950 10 mov [eax+10], edx
004EDFC8 |. 33D2 xor edx, edx
004EDFCA |. 8950 14 mov [eax+14], edx
004EDFCD |. 83C0 18 add eax, 18
004EDFD0 |. BA 40000000 mov edx, 40
004EDFD5 |. E8 469DF1FF call 00407D20
004EDFDA \. C3 retn
很熟悉的常数吧,再结合上面合并的字符串最后终于弄清了注册算法:
设注册码前N位为a1,a2...an,从a2到an正好为a1个数(比如43210,3555,288都符合),取a2...an子串和P2PTVRecorderSiteLicense合并为新串,然后用MD5算出来的HASH值为注册码的后32位(小写).如43210,取3210和P2PTVRecorderSiteLicense合并为3210P2PTVRecorderSiteLicense,经过MD5计算为444bf3ff802599a2148aab0652f0e9af,则注册码即为43210444bf3ff802599a2148aab0652f0e9af.
而个人版的注册码不能是4开头,合并的时候是与P2PTVRecorder合并,其他一样
31239f2354ac66278536dbdbb642dfbc4fa0就是一个个人版的注册码.
完.
------------------------------------------------------------------------
1)对于Delphi写的程序用Dede先分析一下
2)算法再复杂也是人写的,数据再多也只是在内存和寄存器中,所以耐着性子仔细分析肯定会有结果
3)成功需要胆大心细,再加上一点运气
------------------------------------------------------------------------
【版权声明】本文原创于PYG论坛,转载请注明作者并保持文章的完整, 谢谢! |
|