• 标 题:转载一篇什么时候?在trw2000 or sice中用"?"来看密码还有code分析! (3千字)
  • 作 者:peterchen
  • 时 间:2001-3-28 10:56:46
  • 链 接:http://bbs.pediy.com

* 原信信区: CRACK.JY (黑客练兵场)
* 原发信者: Ken Lewis 6:652/3.2 (Sunday April 25 1999 01:03)
* 原收信者: [All]
* 原信主题: [CRACK!]
=============================================================================

.  今天LYX找到了一个小软件:WinAmp Skin Maker,就是做
WINAMP面板的东西.还顺手装上了S-ICE,说是想学学注册.我
拿来一看,原来这个东西的注册是那么简单.于是把注册的过
程写出来,算是给初学者的入门教材吧.

.  首先,保证机器上已经设置好了S-ICE,然后运行WinAmp
Skin Maker(一下简称WSM).找到注册的地方,填写用户名和注
册码,当然是随便填了.
.  用户名:DELVE  注册码:78787878  (又是这个!)
.  按CTRL-D激活S-ICE,输入
S 30:0 L FFFFFFFF '78787878'              ;找刚才输入
                                            的注册码
然后系统就会显示出下面的信息:
Pattern found at 0030:8381F66A (8381F66A)  ;找到了
.  再输入
BPM 30:8381F66A                            ;在这个地方设断点
按CTRL-D切回WSM.
.  按"OK"按钮,S-ICE回截获中断,进入S-ICE的调试状态.
0137:9EEE    REPZ MOVSD
0137:9EF2    POP    ECX
..  ..      ..      ..
.  不要管这些,先输入BD *屏蔽刚才的中断,然后按F10一直
走,大概按60多下,出现下面的语句:
0157:00408BB5  LEA        EAX,[ESP+08]
0157:00408BB9  PUSH      EAX
0157:00408BBA  CALL      00409520        <-(1)
0157:00408BBF  ADD        ESP,04
0157:00408BC2  MOV        EDI,EAX
0157:00408BC4  LEA        EAX,[ESP+28]    <-(2)
0157:00408BC8  PUSH      EAX
0157:00408BC9  CALL      004095A0        <-(3)
0157:00408BCE  ADD        ESP,04
.  把光标移到(1)处,按下F9设断点,因为这个地方很重要,一会
我们就讲为什么.然后按F10单步执行,当执行完(1)以后,我们看一
下EAX中的值:0058B12C.
.  继续按F10往下走,执行到(2)的地方,我们就可以看见S-ICE提
示我们[ESP+28]里面存储的就是我们输入的注册码:78787878!于是
我们分析下面的(3)的子程序就是对我们输入的注册码进行处理的
地方.所以,走到(3)处,按F8跟进去:
0157:004095A0  PUSH      EBX
0157:004095A1  PUSH      ESI
  ..    ..      ..        ..
0157:004095AA  CALL      [004102D8]      <-(4)
0157:004095B0  LEA        EDI,[EAX-01]
0157:004095B3  MOV        ECX,00000001
0157:004095B8  TEST      EAX,EAX
.  走到(4)处,按F10,会发现EAX的值变成了0008,这说明(4)的子
程序是检查输入的注册码的位数的.
0157:004095BA  JLE        004095D1
0157:004095BC  MOVSX      EDX,BYTE PTR [EDI+ESI]
0157:004095C0  SUB        EDX,30
0157:004095C3  DEC        EDI
0157:004095C4  IMUL      EDX,ECX          <-(5)
0157:004095C7  ADD        EBX,EDX
0157:004095C9  LEA        ECX,[ECX*4+ECX]
0157:004095CC  ADD        ECX,ECX          <-(6)
0157:004095CE  DEC        EAX
0157:004095CF  JNZ        004095BC
0157:004095D1  MOV        EAX,EBX
0157:004095D3  POP        EDI
.  我们来分析一下(5)-(6)之间的程序做了什么.
EDX=EDX*ECX
EBX=EBX+EDX
ECX=ECX*5
ECX=ECX+ECX
简单写出来就是
EDX=EDX*ECX
EBX=EBX*EDX
ECX=ECX*10
.  也就是说EDX每次乘以10^n后累加到EBX中.而EDX是什么呢?
EDX是从[EDI+ESI]中取出来以后减去30H得到的.我们输入的78等
都是字符,他们的ASCII码是37H,38H,减去30H后正好是7,8!那么
最后EBX中保存的就是78787878的16进制数!后面的语句将EBX的
值保存到EAX作为返回值.
.  然后我们再往下走,出了这个子程序后,会看见下面的语句.
0157:00408C0A  CMP        EAX,EDI
0157:00408C0C  JNZ        00408C42
.  这是比较EAX和EDI.EAX是刚才我们的注册码78787878的16进
制数04B23526H,那么EDI中呢?就是刚才(1)算出来的0058B12CH.
这两个进行比较,肯定EDI就是正确的注册码了.那么它的10进制是
什么呢?算一下.5812524!这个就是正确的注册码了.
.  这次就到这里,下次我们从(1)进去看看正确的注册码是怎么
算出来的,然后根据它写出注册器,记着来看!  :)

...        (\-----/)  肥牛 / Ken Lewis  BP:191-2114152
...        (( O O ))    http://www.zb169.net/~kenlewis
...          (o o)        Email : kenlewis@126.com