【软件大小】:  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交流!