【软件大小】:  536 KB
【软件语言】:  简体中文
【软件类别】:  国产软件 / 共享版 / 文件分割
【应用平台】:  Win9x/Me/NT/2000/XP
【加入时间】:  2005-01-31 9:30:10
【下载次数】:  1199
【推荐等级】:  ★★★★
【软件下载】:  天空软件站
【软件介绍】:
    MpegLink 是一个很有用的影音文件合成工具,使用它可以把多个mpeg/mpg影音文件合并成一个大的mpeg/mpg影音文件,以方便于您的播放欣赏。合成后的大影音文件在播放时,其播放质量与原来单独播放一个个小文件时的质量完全一样,并且合成后的文件大小就等于原来各个小文件的总和,并不会增加额外的分量。
  1.02版修正了1.0版中帮助文件里不能显示图形符号和不能进行URL网址链接等几个小的Bug。



【作者声明】:初学破解,仅作学习交流之用,失误之处敬请大侠赐教!

【破解工具】:Ollydbg1.10、WDasmV10.0

   用PEid检测为tElock0.98的壳,脱壳后用WDasm反汇编,查找字符串参考,定位到断点,再在OD中载入分析:

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
..........
00471C7A   push 0                                            ; /pFileSystemNameSize = NULL
00471C7C   push 0                                            ; |pFileSystemNameBuffer = NULL
00471C7E   lea eax,dword ptr ss:[ebp-10]                     ; |
00471C81   push eax                                          ; |pFileSystemFlags
00471C82   lea eax,dword ptr ss:[ebp-C]                      ; |
00471C85   push eax                                          ; |pMaxFilenameLength
00471C86   lea eax,dword ptr ss:[ebp-14]                     ; |
00471C89   push eax                                          ; |pVolumeSerialNumber
00471C8A   push 100                                          ; |MaxVolumeNameSize = 100 (256.)
00471C8F   lea eax,dword ptr ss:[ebp-114]                    ; |
00471C95   push eax                                          ; |VolumeNameBuffer
00471C96   push MPEGLINK.00471DD4                            ; |RootPathName = "c:\"
00471C9B   call <jmp.&kernel32.GetVolumeInformationA>        ; \GetVolumeInformationA
00471CA0   lea eax,dword ptr ss:[ebp-4]                      ;  上面这个函数取我的硬盘序列号
00471CA3   push eax                                          ; /Arg1
00471CA4   xor ecx,ecx                                       ; |
00471CA6   mov edx,MPEGLINK.00471DE0                         ; |
00471CAB   mov eax,MPEGLINK.00471DF8                         ; |
00471CB0   call MPEGLINK.0044F1B8                            ; \MPEGLINK.0044F1B8
00471CB5   mov eax,dword ptr ss:[ebp-14]                     ;  eax=14531ADA,我的硬盘序列号的Hex,作者用这个作注册时的确认码
00471CB8   xor edx,edx
00471CBA   push edx                                          ; /Arg2 => 00000000
00471CBB   push eax                                          ; |Arg1
00471CBC   lea eax,dword ptr ss:[ebp-11C]                    ; |
00471CC2   call MPEGLINK.00408794                            ; \MPEGLINK.00408794
00471CC7   mov eax,dword ptr ss:[ebp-11C]                    ;  
00471CCD   lea edx,dword ptr ss:[ebp-118]
00471CD3   call MPEGLINK.0046F490                            ;  这是个关键Call,要看算法跟进去吧!
00471CD8   mov edx,dword ptr ss:[ebp-118]                    ;  正确码edx="8513ba0a"
00471CDE   mov eax,dword ptr ss:[ebp-4]                      ;  我们输入的假码eax="65148455"
00471CE1   call MPEGLINK.00403F08
00471CE6   jnz MPEGLINK.00471D8A                             ;  关键跳转
00471CEC   mov dl,1                                          ;  看来是置标志位了
00471CEE   mov eax,dword ptr ds:[44BA7C]
00471CF3   call MPEGLINK.0044BB7C
00471CF8   mov dword ptr ss:[ebp-8],eax
00471CFB   xor eax,eax
00471CFD   push ebp
00471CFE   push MPEGLINK.00471D83
00471D03   push dword ptr fs:[eax]
00471D06   mov dword ptr fs:[eax],esp
00471D09   mov edx,80000002
00471D0E   mov eax,dword ptr ss:[ebp-8]
00471D11   call MPEGLINK.0044BC1C
00471D16   mov cl,1
00471D18   mov edx,MPEGLINK.00471E08                         ;  ASCII "\Software\Microsoft\Shared\HTML\Old Default Editor\shell\Edit"
00471D1D   mov eax,dword ptr ss:[ebp-8]
00471D20   call MPEGLINK.0044BC80
00471D25   test al,al
00471D27   je short MPEGLINK.00471D65
00471D29   lea edx,dword ptr ss:[ebp-120]
00471D2F   mov eax,dword ptr ss:[ebp-4]
00471D32   call MPEGLINK.0046F3F8
00471D37   mov ecx,dword ptr ss:[ebp-120]
00471D3D   mov edx,MPEGLINK.00471E50                         ;  ASCII "enroll"
00471D42   mov eax,dword ptr ss:[ebp-8]
00471D45   call MPEGLINK.0044BE1C
00471D4A   mov eax,MPEGLINK.00471E60                         
00471D4F   call MPEGLINK.0044EE9C                            ;这个Call显示注册成功信息 
00471D54   mov byte ptr ds:[475A98],0
00471D5B   mov eax,dword ptr ds:[475A94]
00471D60   call MPEGLINK.00447608
00471D65   xor eax,eax
00471D67   pop edx
00471D68   pop ecx
00471D69   pop ecx
00471D6A   mov dword ptr fs:[eax],edx
00471D6D   push MPEGLINK.00471DA2
00471D72   mov eax,dword ptr ss:[ebp-8]
00471D75   call MPEGLINK.0044BBEC
00471D7A   mov eax,dword ptr ss:[ebp-8]
00471D7D   call MPEGLINK.00402ED4
00471D82   retn
00471D83   jmp MPEGLINK.004035F4
00471D88   jmp short MPEGLINK.00471D72
00471D8A   push 0
00471D8C   mov ecx,MPEGLINK.00471E8C
00471D91   mov edx,MPEGLINK.00471E94
00471D96   mov eax,dword ptr ds:[4744A0]
00471D9B   mov eax,dword ptr ds:[eax]
00471D9D   call MPEGLINK.0044A934                            ;  走到儿来是我们不想看到的哟!
00471DA2   xor eax,eax
00471DA4   pop edx
00471DA5   pop ecx
00471DA6   pop ecx
00471DA7   mov dword ptr fs:[eax],edx
00471DAA   push MPEGLINK.00471DCF
00471DAF   lea eax,dword ptr ss:[ebp-120]
00471DB5   mov edx,3
00471DBA   call MPEGLINK.00403B80
00471DBF   lea eax,dword ptr ss:[ebp-4]
00471DC2   call MPEGLINK.00403B5C
00471DC7   retn
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★


跟进关键的算法Call,可看到如下代码:
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
0046F490   push ebp
0046F491   mov ebp,esp
0046F493   add esp,-0C
0046F496   push ebx
0046F497   push esi
0046F498   xor ecx,ecx
0046F49A   mov dword ptr ss:[ebp-C],ecx
0046F49D   mov dword ptr ss:[ebp-8],edx
0046F4A0   mov dword ptr ss:[ebp-4],eax
0046F4A3   mov eax,dword ptr ss:[ebp-4]
0046F4A6   call MPEGLINK.00403FAC
0046F4AB   xor eax,eax
0046F4AD   push ebp
0046F4AE   push MPEGLINK.0046F52F
0046F4B3   push dword ptr fs:[eax]
0046F4B6   mov dword ptr fs:[eax],esp
0046F4B9   xor ebx,ebx
0046F4BB   mov eax,dword ptr ss:[ebp-4]           ;  ss:[ebp-4]中为确认码"340990682"
0046F4BE   call MPEGLINK.00403DF8                 ;  取确认码的位数
0046F4C3   test eax,eax
0046F4C5   jle short MPEGLINK.0046F4F3
以下这一小段就是算法的核心部分了,指令很简单,不多注释了
--------------------------------------------------------------------------------------
0046F4C7   mov esi,1
0046F4CC   /mov edx,dword ptr ss:[ebp-4]
0046F4CF   |mov dl,byte ptr ds:[edx+esi-1]        ;  按位取确认码
0046F4D3   |xor dl,bl
0046F4D5   |and edx,0FF                           ;  用与操作只保留dl中的值
0046F4DB   |mov edx,dword ptr ds:[edx*4+473DC0]   ;  利用dl中的值查表操作,跟踪发现edx=edx*4+473DC0=BFD06116
0046F4E2   |shr ebx,8
0046F4E5   |and ebx,0FEFEFE
0046F4EB   |xor edx,ebx
0046F4ED   |mov ebx,edx
0046F4EF   |inc esi
0046F4F0   |dec eax
0046F4F1   \jnz short MPEGLINK.0046F4CC
-----------------------------------------------------------------------------------
0046F4F3   mov eax,ebx                            ;  我的循环到这里EBX=8513BA0A
0046F4F5   xor edx,edx
0046F4F7   push edx                               ; /Arg2 => 00000000
0046F4F8   push eax                               ; |Arg1
0046F4F9   lea edx,dword ptr ss:[ebp-C]           ; |
0046F4FC   mov eax,8                              ; |这个参数不知何用,莫非是结果只取8位
0046F501   call MPEGLINK.004087C8                 ; \MPEGLINK.004087C8
0046F506   mov eax,dword ptr ss:[ebp-C]           ;  上面这个Call自然是实现数值形式转换成字符串,因为ss:[ebp-c]中为"8513BA0A"
0046F509   mov edx,dword ptr ss:[ebp-8]
0046F50C   call MPEGLINK.004083DC                 ;  这个Call没跟,前后比较猜是把字符串的的大写字母转换成小写
0046F511   xor eax,eax
0046F513   pop edx
0046F514   pop ecx
0046F515   pop ecx
0046F516   mov dword ptr fs:[eax],edx
0046F519   push MPEGLINK.0046F536
0046F51E   lea eax,dword ptr ss:[ebp-C]
0046F521   call MPEGLINK.00403B5C
0046F526   lea eax,dword ptr ss:[ebp-4]
0046F529   call MPEGLINK.00403B5C
0046F52E   retn
0046F52F   jmp MPEGLINK.004035F4
0046F534   jmp short MPEGLINK.0046F51E
0046F536   pop esi
0046F537   pop ebx
0046F538   mov esp,ebp
0046F53A   pop ebp                             
0046F53B   retn
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆

算法很简单,用我们的硬盘序列号生成确认码,再由确认码计算出正确注册码!
OK,我们再来看看如何利用程序自身作注册机,因为正假码在程序中的比对方式为字符串形式,给我们省了不少麻烦
改00471CDE   mov eax,dword ptr ss:[ebp-4]处为

00471CDE     jmp 471D4A
00471CE0     nop

再把00471D4A处改为如下:
00471D4A    mov eax,edx
00471D4C    nop
00471D4D    nop
00471D4E    nop


欢迎e-mail到sharpair@163.com交流!