【软件大小】: 661 KB
【软件语言】: 简体中文
【软件类别】: 国产软件 / 共享版 / 光驱工具
【应用平台】: Win9x/NT/2000/XP
【加入时间】: 2005-02-15 16:16:06
【下载次数】: 3
【推荐等级】: ★★★
【软件下载】: 天空软件站
【软件介绍】: 一款功能强大的光驱自动弹出关闭软件.
与同类软件最大的区别是:
本软件支持键盘控制.即可通过按键盘的键来控制光驱的弹出与闭合.
详情访问我的主页:http://forrich.nease.net
【作者声明】:初学破解,仅作学习交流之用,失误之处敬请大侠赐教!
【破解工具】:Ollydbg1.10、PEid,WDasmv10.0
用PEid检测无壳,为Dephi编写!首先运行程序,输入用户名:sharpair及假码:138651,点注册
程序提示要重启以完成注册!一般重启型的软件我们用RegQueryValueEx下断,可是如果你用
在这个软件上可能会很麻烦(没试,不知行不行,但初略看一下好像并不向注册表中写信息)!
用WDasm反汇编,找到提示重启对话框的代码段,记住地址,用OD载入,下断,你一定会来到如下代码:
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
..........
004BC7D0 mov eax,Rom-Help.004BC84C ; 我们在此下断
004BC7D5 call Rom-Help.0043B5E8 ; 这个Call显示要求重启对话框
004BC7DA lea edx,dword ptr ss:[ebp-4]
004BC7DD mov eax,dword ptr ds:[ebx+2FC]
004BC7E3 call Rom-Help.004423F4
004BC7E8 mov eax,dword ptr ss:[ebp-4] ; ss:[ebp-4]中为我们输入的假码651484
004BC7EB call Rom-Help.004BC5A8 ; 下面为一个判断,跟进这个Call看看
004BC7F0 test al,al
004BC7F2 je short Rom-Help.004BC81C
004BC7F4 lea edx,dword ptr ss:[ebp-8]
004BC7F7 mov eax,dword ptr ds:[ebx+2FC]
004BC7FD call Rom-Help.004423F4
004BC802 mov eax,dword ptr ss:[ebp-8]
004BC805 push eax
004BC806 mov eax,dword ptr ds:[4BFDE8]
004BC80B mov eax,dword ptr ds:[eax]
004BC80D mov ecx,Rom-Help.004BC874 ; ASCII "ma"
004BC812 mov edx,Rom-Help.004BC880 ; ASCII "setting"
004BC817 mov ebx,dword ptr ds:[eax]
004BC819 call dword ptr ds:[ebx+4]
004BC81C xor eax,eax
004BC81E pop edx
004BC81F pop ecx
004BC820 pop ecx
004BC821 mov dword ptr fs:[eax],edx
004BC824 push Rom-Help.004BC83E
004BC829 lea eax,dword ptr ss:[ebp-8]
004BC82C mov edx,2
004BC831 call Rom-Help.00404474
004BC836 retn
..........
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
跟进004BC7EB处的call Rom-Help.004BC5A8,我们看一下有些什么:
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
004BC5A6 mov eax,eax
004BC5A8 push ebp ; 我们首先来到这里
004BC5A9 mov ebp,esp
004BC5AB xor ecx,ecx
004BC5AD push ecx
004BC5AE push ecx
004BC5AF push ecx
004BC5B0 push ecx
004BC5B1 push ecx
004BC5B2 push ecx
004BC5B3 push ecx
004BC5B4 push ebx
004BC5B5 push esi
004BC5B6 push edi
004BC5B7 mov dword ptr ss:[ebp-4],eax ; 假码先放到ss:[ebp-4]中保存
004BC5BA mov eax,dword ptr ss:[ebp-4]
004BC5BD call Rom-Help.004048F0
004BC5C2 xor eax,eax
004BC5C4 push ebp
004BC5C5 push Rom-Help.004BC6C7
004BC5CA push dword ptr fs:[eax]
004BC5CD mov dword ptr fs:[eax],esp
004BC5D0 mov byte ptr ss:[ebp-5],0
004BC5D4 lea eax,dword ptr ss:[ebp-C]
004BC5D7 mov edx,dword ptr ss:[ebp-4]
004BC5DA call Rom-Help.004044E8
004BC5DF mov eax,dword ptr ss:[ebp-C]
004BC5E2 call Rom-Help.00404708 ; 这个Call取假码位数
004BC5E7 test eax,eax
004BC5E9 jle Rom-Help.004BC684 ; 没输入注册码则跳
004BC5EF mov dword ptr ss:[ebp-14],eax
004BC5F2 mov ebx,1 ; ebx=1
--------------------------------------------------------------
004BC5F7 /mov edi,ebx ; edi=ebx=1
004BC5F9 |imul edi,ebx
004BC5FC |mov eax,edi ; eax=edi*ebx=1
004BC5FE |imul ebx ; eax=ebx*eax=1
004BC600 |lea edx,dword ptr ds:[ebx+14] ; edx=ebx+14=15
004BC603 |mov ecx,edx ; ecx=15
004BC605 |cdq
004BC606 |idiv ecx ; eax idiv ecx
004BC608 |mov esi,edx ; 余数edx=1-->esi
004BC60A |mov eax,edi ; eax=edi=1
004BC60C |lea edx,dword ptr ds:[ebx+A] ; edx=ebx+A=0B
004BC60F |mov ecx,edx ; 下面不注释了,同上,很简单的
004BC611 |cdq
004BC612 |idiv ecx
004BC614 |add esi,edx ; esi=1+1=2
004BC616 |mov eax,ebx
004BC618 |add eax,eax ; eax=1+1=2
004BC61A |add esi,eax ; esi=2+2=4
004BC61C |inc esi
004BC61D |lea eax,dword ptr ss:[ebp-18]
004BC620 |mov edx,dword ptr ss:[ebp-C]
004BC623 |movzx edx,byte ptr ds:[edx+ebx-1] ; 按位取假码
004BC628 |add edx,esi ; 与esi加结果在edx=36+5=3B
004BC62A |call Rom-Help.00404630 ; 这个Call没跟,前后对比猜是把前面的计算结果
004BC62F |mov edx,dword ptr ss:[ebp-18] ; 存入ss:[ebp-18]所指向的内存中
004BC632 |lea eax,dword ptr ss:[ebp-10]
004BC635 |call Rom-Help.00404710
004BC63A |mov eax,ebx ; 以下代码同上类似
004BC63C |imul ebx ; ebx=1
004BC63E |imul ebx ; ebx=1
004BC640 |lea edx,dword ptr ds:[ebx+A] ; edx=1+A=0B
004BC643 |mov ecx,edx
004BC645 |cdq
004BC646 |idiv ecx
004BC648 |mov esi,edx ; esi=edx=1
004BC64A |mov eax,edi ; eax=edi=1
004BC64C |lea edx,dword ptr ds:[ebx+14] ; edx=ebx+14=15
004BC64F |mov ecx,edx
004BC651 |cdq
004BC652 |idiv ecx
004BC654 |add esi,edx ; esi=esi+edx=2
004BC656 |mov eax,ebx
004BC658 |add eax,eax ; eax=2*ebx=2
004BC65A |add esi,eax ; esi=esi+eax=4
004BC65C |inc esi
004BC65D |lea eax,dword ptr ss:[ebp-1C] ; 同上,这里应该是一个指针值
004BC660 |mov edx,dword ptr ss:[ebp-C]
004BC663 |movzx edx,byte ptr ds:[edx+ebx-1]
004BC668 |add edx,esi ; edx=36+5=3B
004BC66A |call Rom-Help.00404630
004BC66F |mov edx,dword ptr ss:[ebp-1C]
004BC672 |lea eax,dword ptr ss:[ebp-10] ; 注意,上面累加的和在此地址中
004BC675 |call Rom-Help.00404710
004BC67A |inc ebx
004BC67B |dec dword ptr ss:[ebp-14]
004BC67E \jnz Rom-Help.004BC5F7
-------------------------------------------------------
上面为对输入的假码进行转换的循环处理
004BC684 mov eax,dword ptr ss:[ebp-10] ; 到这里会看到ss:[ebp-14]中为";;FFEBOUMHMS"
004BC687 mov edx,Rom-Help.004BC6E0 ; ASCII "66FFMJRXJELR"
004BC68C call Rom-Help.0040484C ; 这个Call不用跟也看得出来,对上面两个串值进行比较
004BC691 jnz short Rom-Help.004BC697
004BC693 mov byte ptr ss:[ebp-5],1 ; 不跳的话此处置ss:[ebp-5]为1,注册标志位?
004BC697 xor eax,eax ; eax=0
004BC699 pop edx
004BC69A pop ecx
004BC69B pop ecx
004BC69C mov dword ptr fs:[eax],edx
004BC69F push Rom-Help.004BC6CE
004BC6A4 lea eax,dword ptr ss:[ebp-1C]
004BC6A7 mov edx,2
004BC6AC call Rom-Help.00404474
004BC6B1 lea eax,dword ptr ss:[ebp-10]
004BC6B4 mov edx,2
004BC6B9 call Rom-Help.00404474
004BC6BE lea eax,dword ptr ss:[ebp-4]
004BC6C1 call Rom-Help.00404450
004BC6C6 retn
004BC6C7 jmp Rom-Help.00403E78
004BC6CC jmp short Rom-Help.004BC6A4
004BC6CE mov al,byte ptr ss:[ebp-5] ; 再把刚才存储的标志位取到al中
004BC6D1 pop edi
004BC6D2 pop esi
004BC6D3 pop ebx
004BC6D4 mov esp,ebp
004BC6D6 pop ebp
004BC6D7 retn
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
【算法分析】:
上面的结构很清楚(但好像代码太不简炼^_^),把我们输入的假码转换后与程序的内置固
串值进行比较,但后面是否还有注册校验我们还不得而知,我们先根据上面的算法逆推出
一个满足上述条件的注册码试试看!
程序对假码的转换如下:
假码第1位:
6 6 第1位的字符
------------------------
36 36 字符的ASCII码的Hex值
+ n(1) 与 + m(1)
------- --------
3B 3B
其中n(1)与m(1)是变化的,n(i)可表示为(i*i*i)%(i+14)+(i*i)%(i+A)+2i+1
(其中i为ebx的值,注意它也是累加变化的,其取值范围为1~假码长度),对应的有
n(1)=5,n(2)=11,n(3)=14,n(4)=1B,n(5)=15,n(6)=19
而m(i)可表示为(i*i*i)%(i+A)+(i*i)%(i+14)+2i+1,i同上解释,对应的有
m(1)=5,m(2)=11,m(3)=11,m(4)=21,m(5)=10,m(6)=1F,故上面的循环转换可表示为:
6 6 5 5 1 1 4 4 8 8 4 4 字符形式
--------------------------------------------------------------
36 36 35 35 31 31 34 34 38 38 34 34 字符的ASCII码Hex值
+ 5 5 11 11 14 11 1B 21 15 10 19 1F 加操作
--------------------------------------------------------------
3B 3B 46 46 45 42 4F 55 4D 48 4D 53 对应的字符为";;FFEBOUMHMS"
故而我们可以倒推出满足与内定串值相符的注册码为:
36 36 46 46 4D 4A 52 58 4A 45 4C 52 内置串的ASCII码Hex值
- 5 5 11 11 14 11 1B 21 15 10 19 1F 注意是减操作噢
--------------------------------------------------------------
31 31 35 35 39 39 37 37 35 35 33 33 对应的字符形式为"115599775533"
故而满足条件的假码为"159753",我们重新运行程序,用这个注册码试一下!呵呵,注册成功了!
【总结】:这个软件提示是重启型的,但是在你按下那个确定按钮后,程序已偷偷完成了
真假码的校验,有点鬼噢!注册码与用户名无关,依据我上面的简单分析,程序只有一个
唯一的注册码"159753",如有失误之处还请不吝指正!
用户名随意,可用注册码159753(不知是否就是唯一注册码)
欢迎e-mail到sharpair@163.com交流!