【软件大小】: 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交流!
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)